JWT令牌与微服务

1. 什么是JWT

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。JWT通常用于身份验证和信息交换。
以下是JWT的一些关键特性:
紧凑:JWT可以被发送在URL、POST参数或HTTP头部中,并且由于其体积小,因此非常适合移动场景。
自包含:负载中包含了用户的身份信息,因此可以在不同系统间传递而无需查询数据库。
签名:JWT可以通过使用HMAC算法或者RSA的公私钥对进行签名,确保令牌的内容没有被篡改。
一个典型的JWT由三部分组成,它们之间用.分隔:
Header(头部)
Payload(载荷)
Signature(签名)

2. JWT 在微服务应用中的举例图

ef49b7782a3e4f7c97131fecef492247.png

2.1. 请求令牌

客户端通过HTTPS向Apigee/IAM平台发送POST请求,请求URL为https://mycompanyname-dev.apigee.net/v1/oauth2/token。
请求体包含client_id、client_secret和grant_type参数。也就是用户名,密码,令牌类型

{
"client_id": "9ed7be85-a185-test-b37g-3-service1",
"client_secret": "clientsecretTY78",
"grant_type": "client_credentials"
}

2.2. 身份验证服务器返回令牌

2a159ce69fcb4b779d14c94ab70362ad.png

2.2.1. 生成token流程

  • 提取参数:从请求体中提取client_id、client_secret和grant_type等参数。确保这些参数的格式正确且不为空。
  • 验证client_id和client_secret:检查client_id是否存在于配置或数据库中。使用client_id和client_secret进行身份验证,确保它们匹配。并使用client_id找到服务端对应的servicesecret用于生成签名。
  • 根据grant_type选择相应的授权流程:
    authorization_code:需要额外的授权码(Authorization Code)。
    client_credentials:直接使用客户端凭据生成令牌。
    password:需要用户名和密码。
    refresh_token:使用刷新令牌请求新的访问令牌。
    implicit:适用于单页应用(SPA),不需要回调。
  • 创建JWT:
    生成一个JSON Web Token (JWT),包含必要的声明(Claims)。
    常见的声明包括:
    iss(Issuer):发行者信息。
    sub(Subject):主题信息,通常是用户ID。
    aud(Audience):接收者信息。
    exp(Expiration Time):过期时间。
    iat(Issued At):签发时间。
    jti(JWT ID):唯一标识符。
    其他自定义声明,如角色、权限等。
    对JWT进行签名,可以使用对称加密(如HMAC)或非对称加密(如RSA、ECDSA)。
  • 构建响应:
    包含访问令牌(Access Token)、刷新令牌(Refresh Token,如果适用)、过期时间等信息。
        {"access_token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LWlwaWF0aWF0ijoxNzM0M0NzcwNTI3LCJleHAiOjE3MzQ3NzA4Mjd9.svHAdBOmuYHaRkRXHMfEUJlwSrSd8qIK7utLbkDxps6-8","token_type": "Bearer","expires_in": 3600,"refresh_token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LWlwaWF0aWF0ijoxNzM0M0NzcwNTI3LCJleHAiOjE3MzQ3NzA4Mjd9.svHAdBOmuYHaRkRXHMfEUJlwSrSd8qIK7utLbkDxps6-8"}

2.2.2 Token组成部分

Token由三部分组成,每部分由"."分割
JSON Web Tokens - jwt.io 这个链接可以演示Token生成和校验
如举例中的eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0LWlwaWF0aWF0ijoxNzM0M0NzcwNTI3LCJleHAiOjE3MzQ3NzA4Mjd9.svHAdBOmuYHaRkRXHMfEUJlwSrSd8qIK7utLbkDxps6-8

  1. 第一部分为Header(头部)信息的base64
  2. 第二部分为负载Payload(载荷)信息的base64
    JWT的负载部分的键值对具有以下重要作用(可选):
    - 传递用户信息:包含用户的基本信息和元数据。
    - 定义权限和角色:用于授权和访问控制。
    - 设置有效期:确保令牌的安全性和时效性。
    - 提供唯一标识符:防止重放攻击。
    - 支持分布式验证:提高系统的可扩展性和可用性。
    - 增强审计和调试能力:便于追踪和分析令牌的使用情况。
  3. 第三部分为Signature(签名)签名部分用于验证令牌的完整性和来源。签名是通过将头部和负载连接起来,并使用指定的签名算法和一个密钥生成的。这里的秘钥可以是客户端请求进来的秘钥,也可以是服务端保存的对应clientId的服务端秘钥。具体使用那种方式取决于具体架构实现方式。
    f27841eb03ed49d7965e81ae04f91633.png

在JWT(JSON Web Token)中,使用对称加密算法(如HMAC)时,客户端和服务端可以共享同一个密钥。也可以通过不同的密钥管理策略来增强安全性(clientid,clientsecret,servicesecret)。以下是使用两个不同的密钥(或定期更换密钥)的好处:
6213533652e44471a92b51196ef99929.png

 1. 增强安全性
密钥隔离:使用不同的密钥可以减少密钥泄露的风险。即使一个密钥被泄露,另一个密钥仍然可以保持安全。
密钥轮换:定期更换密钥可以进一步提高安全性。如果旧密钥被泄露,新密钥可以立即启用,确保系统安全。

 2. 分布式验证
独立验证:客户端和服务端可以独立验证JWT的有效性,而不需要每次都与中心服务器通信。这提高了系统的可扩展性和可用性。
减少网络延迟:客户端和服务端可以在本地验证JWT,减少了与中心服务器的通信延迟,提高了响应速度。

 3. 防止篡改
签名验证:使用对称加密算法时,签名只能由持有相同密钥的一方生成和验证。通过使用不同的密钥,可以确保只有授权方能够生成有效的签名。

 4. 灵活性
多服务验证:不同的服务可以共享相同的密钥来验证JWT,而不需要每个服务都持有多个密钥。这简化了多服务架构中的认证和授权流程。
跨域验证:不同领域的服务可以通过共享密钥来验证JWT,增强了跨域应用的安全性和灵活性。

 5. 性能提升
减少计算负担:客户端和服务端只需要进行签名验证,而不是签名生成,这通常比签名生成操作更高效。
并行处理:多个客户端和服务端可以并行验证JWT,提高了整体系统的性能。

 6. 可审计性
审计追踪:由于签名是由服务端生成的,所有签发的JWT都可以追溯到特定的服务端,便于审计和故障排查。

 示例场景
假设一个系统中有多个微服务,每个微服务都需要验证用户的JWT。在这种情况下,使用两个不同的密钥(或定期更换密钥)的好处如下:

1. 服务端生成JWT:
   - 服务端使用私钥生成JWT,并将其发送给客户端。
   - JWT包含用户信息、权限等声明,并通过私钥签名。

2. 客户端和服务端验证JWT:
   - 客户端接收到JWT后,可以使用公钥验证签名的有效性。
   - 微服务接收到带有JWT的请求后,也可以使用公钥验证签名的有效性。

 具体步骤

使用两个不同的密钥
1. 生成密钥对:
   - 服务端生成一对密钥(例如'key1'和'key2')。
   - 'key1'用于当前JWT的签名,'key2'作为备用密钥。

2. 分发密钥:
   - 将'key1'分发给客户端和服务端,用于验证当前JWT。
   - 'key2'暂时不公开,仅保存在服务端。

3. 密钥轮换:
   - 在预定的时间点,服务端开始使用'key2'生成新的JWT。
   - 同时,将'key2'分发给客户端和服务端,用于验证新的JWT。
   - 'key1'继续用于验证旧的JWT,直到它们过期。

4. 密钥失效:
   - 旧密钥('key1')在所有相关的JWT过期后失效。
   - 新密钥('key2')成为唯一的验证密钥。

 总结
使用两个不同的密钥(或定期更换密钥)在对称加密中具有以下主要好处:
增强安全性:减少密钥泄露的风险,通过密钥轮换进一步提高安全性。
分布式验证:客户端和服务端可以独立验证JWT的有效性,减少网络延迟。
防止篡改:确保只有授权方能够生成有效的签名。
灵活性:简化多服务架构中的认证和授权流程。
性能提升:提高系统的整体性能和响应速度。
可审计性:便于审计和故障排查。

这种方式使得JWT在现代分布式系统中成为一种高效且安全的认证和授权机制。

 2.3. 获取Token后发送业务请求

当用户获取到Token后再Token 值前面加上Bear(加Bear是一种OAuth 2.0规范,防止误用,区分其它类型令牌)。 Bear ****
将Token和业务数据发送到请求服务Gateway。

2.4. Gateway验证Token转发请求到具体服务

当用户请求来到Gateway后,Gateway 

  • 提取Token:从Authorization头中提取Token。
  • 验证Token:
    解码Token,检查格式。
    验证签名。
    检查exp和nbf声明。
    验证iss和aud声明。
  • 授权检查:检查用户是否有权访问/api/resource。
  • 日志记录:记录请求信息。
  • 路由和转发:将请求转发到后端服务service.example.com/api/resource,并在请求头中附加用户信息。
  • 错误处理:如果验证失败,返回401 Unauthorized或403 Forbidden。

2.4. 业务服务器处理请求并返回 

业务服务器处理请求并返回用户终端,完成请求流程。 


更多细节可参考
JWT 与 OAuth 2.0,Apigee-CSDN博客

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

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

相关文章

代码随想录Day37 动态规划:完全背包理论基础,518.零钱兑换II,本周小结动态规划,377. 组合总和 Ⅳ,70. 爬楼梯(进阶版)。

1.完全背包理论基础 思路 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完…

【多时段】含sop的配电网重构【含分布式电源】【已更新视频讲解】

1 主要内容 之前分享了很多配电网重构的程序,每个程序针对场景限定性比较大,程序初学者修改起来难度较大,本次分享一个基础程序,针对含sop的配电网重构模型,含风电和光伏,优化了33节点网络电压合理性&…

查看php已安装扩展命令

在powershell中查看完整的拓展 php -m 指定搜索某几个拓展 php -m | Select-String -Pattern "xml"

YOLOv11 引入高效的可变形卷积网络 DCNv4 | 重新思考用于视觉应用的动态和稀疏算子

我们介绍了可变形卷积v4(DCNv4),这是一种为广泛的视觉应用设计的高效且有效的算子。DCNv4通过以下两项关键改进解决了其前身DCNv3的局限性: 在空间聚合中移除softmax归一化,以增强其动态特性和表达能力。优化内存访问,减少冗余操作以提高速度。这些改进使得DCNv4相比DCNv…

vue 基础学习

一、ref 和reactive 区别 问题:发生跨域问题 Access to script at file:///Users/new/Desktop/webroot/vue/vue.esm-browser.js from origin null has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: chrome, chrom…

AIA - IMSIC之二(附IMSIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 ​​​​​​​通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…

光谱相机的工作原理

光谱相机的工作原理主要基于不同物质对不同波长光的吸收、反射和透射特性存在差异,以下是其具体工作过程: 一、光的收集 目标物体在光源照射下,其表面会对光产生吸收、反射和透射等相互作用。光谱相机的光学系统(如透镜、反射镜…

Kafka可视化工具 Offset Explorer (以前叫Kafka Tool)

数据的存储是基于 主题(Topic) 和 分区(Partition) 的 Kafka是一个高可靠性的分布式消息系统,广泛应用于大规模数据处理和实时, 为了更方便地管理和监控Kafka集群,开发人员和运维人员经常需要使用可视化工具…

TLDR:终端命令的简洁百科全书

TLDR,全称 “Too Long, Don’t Read”,是一款特别实用的终端命令百科全书工具。通过 TLDR,您可以快速查找到常用命令的使用方法,避免繁琐冗长的官方文档,让日常工作更加高效。 为什么选择 TLDR? 简单易用&…

2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。

文章目录 sklearn学习(20) 无监督学习-双聚类1 Spectral Co-Clustering1.1 数学公式 2 Spectral Biclustering2.1 数学表示 3 Biclustering 评价 sklearn学习(20) 无监督学习-双聚类 文章参考网站: https://sklearn.apachecn.org/ 和 https://scikit-learn.org/sta…

数据结构(Java版)第六期:LinkedList与链表(一)

目录 一、链表 1.1. 链表的概念及结构 1.2. 链表的实现 专栏:数据结构(Java版) 个人主页:手握风云 一、链表 1.1. 链表的概念及结构 链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的。与火车…

《Java核心技术I》Swing的网格包布局

复杂的布局管理 网格包布局 行列大小可改变,先建立表格,合并相邻单元格,组件指定在格内的对齐方式。 字体选择器组件: 另个指定字体和字体大小的组合框两个组合框标签两个选择粗体和斜体的复选框一个显示示例字符串的文本区 将容…

Python——day09

os模块 sys模块 time模块 logging模块

IIC驱动EEPROM

代码参考正点原子 i2c_dri:主要是三段式状态机的编写 module iic_dri#(parameter SLAVE_ADDR 7b1010000 , //EEPROM从机地址parameter CLK_FREQ 26d50_000_000, //模块输入的时钟频率parameter I2C_FREQ 18d250_000 //IIC_SCL的时钟频率)( …

《计算机组成及汇编语言原理》阅读笔记:p86-p115

《计算机组成及汇编语言原理》学习第 6 天,p86-p115 总结,总计 20 页。 一、技术总结 1.if statement 2.loop 在许多编程语言中,有类种循环:一种是在程序开头检测条件(test the condition),另一种是在程序末尾检测条件。 3.C…

(带源码)宠物主题商场系统 计算机项目 P10083

项目说明 本号所发布的项目均由我部署运行验证,可保证项目系统正常运行,以及提供完整源码。 如需要远程部署/定制/讲解系统,可以联系我。定制项目未经同意不会上传! 项目源码获取方式放在文章末尾处 注:项目仅供学…

目标检测——基于yolov8和pyqt的螺栓松动检测系统

目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…

宠物行业的出路:在爱与陪伴中寻找增长新机遇

在当下的消费市场中,如果说有什么领域能够逆势而上,宠物行业无疑是一个亮点。当人们越来越注重生活品质和精神寄托时,宠物成为了许多人的重要伴侣。它们不仅仅是家庭的一员,更是情感的寄托和生活的调剂。然而,随着行业…

原点安全再次入选信通院 2024 大数据“星河”案例

近日,中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织开展的 2024 大数据“星河(Galaxy)”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…

【0x001D】HCI_Read_Remote_Version_Information命令详解

目录 一、命令概述 二、命令格式及参数说明 2.12. HCI_Read_Remote_Version_Information 命令格式 2.2. Connection_Handle 三、生成事件 3.1. HCI_Command_Status 事件 3.2. HCI_Read_Remote_Version_Information_Complete 事件 四、命令执行流程 4.1. 命令发起阶段(…