【微服务】微服务中token鉴权设计的4种方式总结

news/2024/12/26 12:54:47/文章来源:https://www.cnblogs.com/o-O-oO/p/18555847
一、JWT鉴权1.1 概述1.2 实现步骤1.2.1 用户登录1.2.2 存储JWT 1.2.3 请求携带JWT1.2.4 服务端验证JWT 1.3 优点 二、OAuth 2.0鉴权2.1 概述2.2 实现步骤2.2.1 授权服务器2.2.2 资源服务器 2.2.3 客户端 2.3 优点三、统一授权中心(API Gateway)3.1 概述3.2 实现步骤 3.2.1 部署API Gateway 3.2.2 认证和授权 3.2.3 转发请求3.3 优点 四、微服务内部调用鉴权4.1 方案 4.1.1 Token透传 4.1.2 基于角色的访问控制(RBAC) 4.1.3 无鉴权 五、鉴权方案的选择5.1 JWT(JSON Web Tokens)鉴权」:5.2 OAuth 2.0鉴权5.3 统一授权中心(API Gateway) 5.4 微服务内部调用鉴权 

原创 码到三十五 码到三十五 2024年07月29日 20:33 广东
https://mp.weixin.qq.com/s?__biz=MzkxNDY2NTAxNg==&mid=2247485053&idx=1&sn=0477e4d5365137bb99a6c99a89561cf9&chksm=c16bbd2af61c343ccbf9faf3363427394d4622ea86556734fe57ad647b584de040d50c198b9f&scene=21#wechat_redirect
Java微服务中Token鉴权设计的几种方案:

一、JWT鉴权

1.1 概述

JWT是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。它基于JSON格式,包含三个部分:头部(Header)、负载(Payload)和签名(Signature)。JWT常用于身份验证和信息交换,特别适用于分布式系统和微服务架构。

1.2 实现步骤

1.2.1 用户登录

用户提交用户名和密码到认证服务。
认证服务验证用户名和密码的正确性。
如果验证通过,生成JWT,其中包含用户身份信息、权限信息和过期时间等。
将JWT返回给用户。

1.2.2 存储JWT

客户端(如浏览器、移动应用)将JWT存储在本地(如localStorage、sessionStorage、SharedPreferences)。

1.2.3 请求携带JWT

客户端在后续请求中,通过HTTP头部(如Authorization: Bearer {Token})携带JWT。

1.2.4 服务端验证JWT

服务端接收到请求后,从HTTP头部提取JWT。
使用与生成JWT时相同的密钥和算法验证JWT的签名。
如果JWT有效,根据JWT中的信息执行相应的业务逻辑。

1.3 优点

无状态性:服务端不需要保存会话状态,所有验证信息都包含在JWT中。
易于传输:JWT结构紧凑,可以直接嵌入HTTP头部。
安全性:JWT可以使用HMAC或RSA算法进行签名,确保信息不被篡改。

二、OAuth 2.0鉴权

2.1 概述

OAuth 2.0是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而无需将用户名和密码提供给第三方应用。OAuth 2.0提供了授权令牌(Access Token)和刷新令牌(Refresh Token)两种类型的令牌。

2.2 实现步骤

2.2.1 授权服务器

实现OAuth 2.0授权服务器,处理用户授权和令牌发放。

用户通过授权服务器进行授权,授权服务器生成Access Token和(可选的)Refresh Token,并返回给客户端。

2.2.2 资源服务器

保护需要鉴权的资源,通过验证Access Token来授权访问。

2.2.3 客户端

引导用户到授权服务器进行授权。

获取Access Token后,使用Access Token访问资源服务器。

如果Access Token过期,可以使用Refresh Token向授权服务器请求新的Access Token。

2.3 优点

安全性高:用户不需要将密码直接暴露给第三方应用。

灵活性:支持多种授权模式,如授权码模式、密码模式、客户端凭据模式等。

广泛支持:许多主流平台和框架都支持OAuth 2.0。

三、统一授权中心(API Gateway)

3.1 概述

在微服务架构中,使用API Gateway作为统一入口,进行集中认证和授权。API Gateway负责接收外部请求,进行认证和授权后,将请求转发到相应的微服务实例。

3.2 实现步骤

3.2.1 部署API Gateway

在微服务集群前端部署API Gateway。
配置API Gateway以识别不同的微服务路由。

3.2.2 认证和授权

API Gateway接收外部请求后,首先进行认证(如验证JWT或OAuth Token)。

根据认证结果进行授权,检查用户是否有权限访问请求的资源。

3.2.3 转发请求

如果认证和授权都通过,API Gateway将请求转发到相应的微服务实例。

微服务实例处理请求后,将响应返回给API Gateway。

API Gateway将响应返回给客户端。

3.3 优点

集中管理:简化了认证和授权逻辑的管理,降低了维护成本。
安全性高:所有外部请求都通过API Gateway进行认证和授权,提高了系统的安全性。
可扩展性:API Gateway可以作为扩展点,支持更多的认证和授权机制。

四、微服务内部调用鉴权

对于微服务之间的内部调用,鉴权方案通常比外部调用简单,但也需要考虑安全性和权限控制。

4.1 方案

4.1.1 Token透传

在微服务内部调用时,将Token作为请求参数或头部进行透传。
接收方微服务验证Token的有效性,并根据Token中的权限信息进行授权。

4.1.2 基于角色的访问控制(RBAC)

在微服务内部实现RBAC机制,根据调用方的角色进行授权。
角色信息可以通过服务注册中心、配置中心或专门的权限服务进行共享。

4.1.3 无鉴权

对于完全信任的内部调用,可以不进行鉴权。
但这种方式需要确保微服务之间的调用是安全的,避免被恶意利用。

五、鉴权方案的选择

在设计和实施Java微服务架构中的Token鉴权方案时,可以根据业务需求和安全要求选择合适的鉴权方案。同时,鉴权方案的设计和实施需要考虑系统的可扩展性、可维护性和安全性。

5.1 JWT(JSON Web Tokens)鉴权」:

优点:无状态性使得服务端不需要保存会话状态,易于传输且结构紧凑,安全性高。

适用场景:适用于需要快速验证用户身份且不需要频繁更新用户权限的场景。

5.2 OAuth 2.0鉴权

优点:安全性高,用户不需要将密码暴露给第三方应用,支持多种授权模式,广泛支持。

适用场景:适用于需要第三方应用访问用户存储在服务提供者上的信息的场景。

5.3 统一授权中心(API Gateway)

优点:集中管理简化了认证和授权逻辑的管理,提高了系统的安全性,可扩展性强。

适用场景:适用于微服务架构中,作为统一入口进行集中认证和授权的场景。

5.4 微服务内部调用鉴权

优点:实现简单,可以根据实际需求选择透传Token、基于角色的访问控制或无鉴权等方式。

适用场景:适用于微服务之间的内部调用,需要根据实际需求选择合适的鉴权方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837083.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【架构】一文搞懂多规格商品、组合商品模型设计

今天聊聊多规格商品、组合商品模型设计。 一、多规格商品 1.1 什么是多规格商品 多规格商品是指同一款商品具有多个不同的规格或属性,例如颜色、尺寸、材质、容量等。这些规格使得商品能够满足不同消费者的偏好和需求。在新零售系统中,多规格商品通常会以一个商品条目展示,消…

【架构】多租户系统的核心概念模型

让我们深入探讨一下多租户系统的概念模型。概念模型是多租户系统的"骨架",帮助我们理解系统各部分的组织和运作方式。 多租户的核心概念模型 • 租户:通常指一个企业客户,不同租户之间的数据和行为是相互隔离的。• 用户:某个租户内的具体使用者,使用账号、密码…

WinForm 设计器中DPI感知错误解决方法

这张图是WinForm在1080P分辨率下开发的一个Form,但是代码到高分辨率屏幕就会变成这个鸟样虽然说可以通过DPI感知让程序在运行的时候显示出正确的样式,但是这样让我们在设计的时候很是苦恼 在翻看了WinForm微软官方在Net8的更新,发现了这样的一条:我们在项目csproj里面加入一…

安装kali purple后要做的事

1、切换中文sudo dpkg-reconfigure locales翻到最后,找到zh_cn重启搞定。 2、换源vim /etc/apt/sources.list打开后注释原来的源,换上国内源。 先用 # 把原本的注释掉: 之后,在下面添加上新的源: aliyun 阿里云 deb http://mirrors.aliyun.com/kali kali-rolling main no…

博客同步到腾讯云开发者社区声明

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=26x714yb3cb3作者:翎野君 出处:http://www.cnblogs.com/lingyejun/ 若本文如对您有帮助,不妨点击一下右下角的【推荐】。如果您喜欢或希望看到更多我…

考研打卡(22)

开局(22) 开始时间 2024-11-19 23:02:31 结束时间 2024-11-19 23:58:31今天开会,我真是碎掉了数据结构假设某段通信电文仅由 6 个字母 ABCDEF 组成, 字母在电文中出现的频率分别为 2,3,7,15,4,6。 根据这些频率作为权值构造哈夫曼编码, 终构造出的哈夫曼树带权路径长…

使用分区助手扩充C盘空间

检查设备加密状态 首先,进入设备的设置界面,查看设备加密选项是否已开启。如果加密已开启,需要先关闭加密功能。此过程大约需要十几分钟时间,具体时间取决于设备的配置和数据量。使用分区助手扩展磁盘空间选择空闲空间较多的磁盘 在分区助手中,选中一个空闲空间较多的磁盘…

DQL多表查询

select *from 表名,表名 会输出这两个表的笛卡尔积select *from 表名 限制条件表名不能在同一条指令中反复使用,所以应当起别名,如表名 别名, 表名 别名;可以自身连接查询 在select语句后面加两个相同的表 外连接查询 用inner join,需要加on select * from 表名 inner jo…

《数据结构》课程作业

第二章 PTA编程题 一共十道编程题 难度排序: \[\begin{align} 6<8<5<7<5<10<1=2<3\le 4<9 \nonumber \end{align} \]6-1 有序链表合并(无重复) 双指针法 def merge_list(la, lb):ans = LinkList()p = ans.headp1 = la.head.nextp2 = lb.head.nextwh…

《Django 5 By Example》阅读笔记:p651-p678

《Django 5 By Example》学习第9天,p651-p678总结,总计28页。 一、技术总结 1.aggregate() (1)aggregate:ad-("to") + gregare("to collection into a flock(群), to gather") 因为ad 后面跟的是gregate,为了发音方便,ad演变为了ag。aggregate的本意…

k8s阶段02 namespace,pod资源及命令, pod资源配置(应用监控,资源需求和限制), 多容器pod(初始容器), k8s卷基础

namespaceNamespace: 名称空间,命名空间资源对象名称隔离www.google.com, www.magedu.com资源类型:名称空间级别:必须属于某个名称空间-n NAMESPACE_NAME --namespace NAMESPACE_NAME集群级别:不属于任何名称名称 命令: kubectl get kubectl get TYPE [name, ...]…

三维地球--SparkGlobe

下载地址: 链接:https://pan.baidu.com/s/1Z-7UdVJvJL0jxLoGon79cQ 提取码:ehs5