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 在微服务应用中的举例图

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. 身份验证服务器返回令牌

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

在JWT(JSON Web Token)中,使用对称加密算法(如HMAC)时,客户端和服务端可以共享同一个密钥。也可以通过不同的密钥管理策略来增强安全性(clientid,clientsecret,servicesecret)。以下是使用两个不同的密钥(或定期更换密钥)的好处:
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博客
相关文章:
JWT令牌与微服务
1. 什么是JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。JWT通常用于身份验证和信息交换。 以下是JWT的一些关键特性: 紧凑ÿ…...
C# WinForm移除非法字符的输入框
C# WinForm移除非法字符的输入框 文章目录 namespace System.Windows.Forms {using System.ComponentModel;/// <summary>/// 支持移除 非法字符 的输入框。/// </summary>public class RemoveInvalidCharTextBox : TextBox{/// <summary>/// 测试代码&#…...
智慧商城:基于请求数据动态渲染购物车列表
进入购物车列表页面,当即触发请求,打印出解构出来的data.list 查看数据是否添加到 vuex 中。 将物品加入购物车,点击购物车进入购物车列表页,点击 vue 调试工具,可以看到 cart 模块state中新增添加的几个物品信息 渲染…...
医疗信息化浪潮下 SSM+Vue 医院预约挂号系统的崛起
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
QScreen在Qt5.15与Qt6.8版本下的区别
简述 QScreen主要用于提供与屏幕相关的信息。它可以获取有关显示设备的分辨率、尺寸、DPI(每英寸点数)等信息。本文主要是介绍Qt5.15与Qt6环境下,QScreen的差异,以及如何判断高DPI设备。 属性说明 logicalDotsPerInch࿱…...
模具生产过程中的标签使用流程图
①NFC芯片嵌入周转筐,通过读卡器读取CK_Label_v3的数据,并将这些信息上传至服务器进行存储; ②服务器随后与客户的WMS(仓库管理系统)进行交互,记录和同步注塑机的原始数据; ③当周转筐内的模具…...
Unity-URP设置单独渲染UI相机
Unity-URP设置单独渲染UI相机 1、设置主相机层级,剔除UI层 2、新建UICamera,设置RenderType为Overiay;显示层级只选择UI层 3、选择主相机,Stack参数添加UICamera 4、Canvas设置成ScreenSpace-Camera,并指定UICamera渲…...
如何使用java来解析一个pdf文件呢?
最近搞到一个任务是要解析一套雅思题目并提取其中的高频单词。那如何使用java来解析一个pdf文件呢? 首先我们要知道这需要springboot框架来进行创建,需要的PDFTextStripper是一个用于PDF文档中提取文本的类,它是Apache PDFBox的一个类用于处…...
asp.net core发布配置端口号,支持linux
方式一,修改配置文件 appsettings.json 找到文件 appsettings.json, 添加如下节点配置,在linux环境需要设置0.0.0.0才可以正常代表本机,然后被其他机器访问,此处设置端口8000, "Kestrel": {&quo…...
M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务
M3D: 基于多模态大模型的新型3D医学影像分析框架,将3D医学图像分析从“看图片“提升到“理解空间“的层次,支持检索、报告生成、问答、定位和分割等8类任务 论文大纲理解1. 确认目标2. 分析过程(目标-手段分析)核心问题拆解 3. 实…...
JavaScript中,常用crypto模块进行rsa加密,crypto-js模块进行md5算法
Node.js 的 crypto 模块 Node.js 内置的 crypto 模块提供了基本的加密功能,可以用于生成 RSA 密钥对和执行加密、解密操作。 代码案例: const crypto require(crypto);const { publicKey, privateKey } crypto.generateKeyPairSync(rsa, {modulusLen…...
机器学习04-为什么Relu函数
机器学习0-为什么Relu函数 文章目录 机器学习0-为什么Relu函数 [toc]1-手搓神经网络步骤总结2-为什么要用Relu函数3-进行L1正则化修改后的代码解释 4-进行L2正则化解释注意事项 5-Relu激活函数多有夸张1-细数Relu函数的5宗罪2-Relu函数5宗罪详述 6-那为什么要用这个Relu函数7-文…...
基于Arduino的自动开瓶系统
自动瓶盖开启器:结合Arduino和线性运动系统的创新解决方案 展示视频: 基于Arduino的自动开瓶器 引言 在日常生活中,开启瓶盖看似是一件简单的事情,但对于某些人来说,这可能是一个挑战。特别是对于患有类风湿性关节炎…...
通过使用 contenteditable=“true“,我们彻底防止了 iOS 系统键盘的弹出
明白了,对于苹果手机(iOS),即使使用了 bindtap 和 e.preventDefault() 来阻止默认行为,系统键盘仍然可能会弹出。这是因为 iOS 对输入框的处理方式与 Android 不同,尤其是在处理 input 元素时,iOS 会更加积极地弹出键盘。 解决方案 为了彻底防止 iOS 系统键盘弹出,我…...
20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕
20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕 2024/12/17 17:21 缘起,最近需要识别法国电影《地下铁》的法语字幕,使用 字幕小工具V1.2【whisper套壳/GUI封装了】 无效。 那就是直接使用最原始的whisper来干了。 当你重装WIN10的时候&#…...
搜索召回:召回聚合
召回聚合 用户的查询意图往往是复杂多样的,可能涉及到不同的领域、主题和语义层面。因此,召回体系中通常通过多路召回的方式从不同角度去理解和满足用户的查询需求。此外,多路召回通过各召回通道并行计算可以在海量数据中能够快速响应&#…...
NTFS 文件搜索库
NTFS 文件搜索库 中文 | English 一个快速搜索NTFS卷文件的库 在这里插入图片描述 特性 快速扫描 NTFS 格式驱动器上的所有文件实时快速同步文件变更(创建, 更名, 删除)支持通配符查询文件名或文件路径重启自动更新文件变动, 无需重新进行全盘扫描 API描述 初始化并指定…...
【GoF23种设计模式】02_单例模式(Singleton Pattern)
文章目录 前言一、什么是单例模式?二、为什么要用单例模式?三、如何实现单例模式?总结 前言 提示:设计者模式有利于提高开发者的编程效率和代码质量: GoF(Gang of Four,四人帮)设计…...
UniApp:uni-segmented-control 自定义布局
自定义tabs选项,items 为tabs名称数组,横向滚动 <scroll-view scroll-x><view class"segmented-control"><view v-for"(item, index) in items" :key"index" class"control-item ":class"…...
【算法day17-day18】回溯:解决组合问题
不好意思呀各位,最近在忙期末考今天才彻底结束,来让我们继续算法之路吧~ 题目引用 组合电话号码的字母组合组合总和组合总和II分割回文串 1.组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
