概述

最近更新时间:2023-12-28 11:36:22

我的收藏

协议概述

Json web token(JWT)是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准。该 token 被设计为紧凑且安全的,适用于分布式站点的单点登录(SSO)场景。 JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密。

JWT 的构成

JWT 是由三段信息构成的,将这三段信息文本用.链接一起就构成了 JWT 字符串,这三部分分别是 Header、Payload、Signature,各部分均为 JSON 字符串 Base64 编码值,如下:
eyJhbGciOiJFUzI##############.eyJqdGkiOiJjbzlESHNuOEYtbEdFSnFjcT##############.gHVV8X2JAnese5_SIPmM2I##############
Header 由 token 的类型(“JWT”)和算法名(例如 HMAC、SHA256 等)两部分组成 JSON 字符串(如下),并对该 JSON 字符传进行 Base64 编码,最终到 Header 信息。
{
'typ': 'JWT',
'alg': 'HS256'
}
Payload 即存放有效信息的地方,由多个声明字段组成的 JSON 字符串(如下),并对该 JSON 字符传进行 Base64 编码,最终到 Payload 信息。 这些有效信息包括:标准中注册的声明、自定义声明。其中,自定义声明,不应包括个人身份等敏感信息。标准中注册的声明为建议使用,但不强制使用,包括:
iss:JWT 签发者 -sub:JWT 所面向的用户 -aud:接收 JWT 的一方 -exp:JWT 的过期时间,这个过期时间必须要大于签发时间 -nbf:定义在什么时间之前,该 JWT 都是不可用的 -iat:JWT 的签发时间 -jti:JWT 的唯一身份标识,主要用来作为一次性 token,从而回避重放攻击
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature 即签名信息,采用 Header 中指定的签名算法(alg),对(Base64 编码的 Header + "." + Base64 编码的 payload)计算签名信息(如下)。签名过程如需使用密钥,应提前生成指定算法的密钥,并存储于认证服务器。
// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret');

应用场景

基于 token 的鉴权机制(单点登录) 类似于 HTTP 协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于 token 认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

运行流程

1. 用户使用用户名密码来请求认证服务器。
2. 认证服务器进行验证用户的信息。
3. 认证服务器通过验证后,发送给用户一个 token。
4. 客户端存储 token,并在每次请求时附送上这个 token 值。
5. 应用系统服务端验证 token 值,并返回数据。

数字身份管控平台(员工版)功能概述

使用 jose4j api 生成 JWT token

生成的 token 中,标准声明字段 subject 的值表示登录者身份。具体取值为:
当登录用户没有绑定应用账号(映射关系)时,subject 取值为登录用户名(userName)。
当登录用户绑定了唯一一个应用账号(映射关系)时,subject 取值为应用账号名(accountName)。
当登录用户绑定了多个应用账号(映射关系)时,登录成功后不会跳转到应用系统,而是跳转到门户应用列表页面,用户选择指定的登录账号后,单击应用图标进行登录,如下:



采用 RS256 签名算法

采用 RS256 签名算法生成签名信息,RSA 密钥长度为2048位。密钥对随 JWT 应用创建时一并生成,保存于认证服务器。 应用系统验证 token 的有效性,需要使用该应用的公钥进行验签,可参考应用管理页面 > 选定指定应用 > 单击应用配置 >对应的 JWT PublicKey,获取 JSON 格式的公钥信息字符串,如下: