JWT (JSON Web Token)
一种 JSON 的编码规范。
JWT 通常的获得及使用流程:
- 【用户】 --请求认证-->【认证服务器】
- 【认证服务器】--要求用户登录-->【认证服务器】
- 【认证服务器】--签发 JWT --> 【用户】
- 【用户】--存储 JWT-->【用户】 ——————
- 【用户】--携带JWT请求-->【资源服务器】
- 【资源服务器】--验证JWT-->【资源服务器】
- 【资源服务器】--提供资源-->【用户】
Bearer Token
一段加密字符串(可以是 JWT),包含授权范围、有效期等信息。持有它,就可以无差别的访问资源。特殊写法 "Bearer TOKEN字符串",即在 Token 前面加上单词 Bearer 和空格。
Bearer Token 种的 Token,通常使用 JWT 形式。
ID Token
本质是包含了用户信息的 JWT。
代码语言:json复制{
"iss": "签发者,https://server.example.com",
"sub": "用户 ID",
"aud": "接受者,对应认证服务器中的 Client ID",
"nonce": "Session ID",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"acr": "urn:mace:incommon:iap:silver"
}
ID Token 的字段(参考 Authing.cn 和 OIDC 规范)
字段名 | 翻译 |
---|---|
sub | subject 的缩写,唯一标识,一般为用户 ID |
name | 姓名 |
given_name | 名字 |
family_name | 姓氏 |
middle_name | 中间名 |
nickname | 昵称 |
preferred_username | 希望被称呼的名字 |
profile | 基础资料 |
picture | 头像 |
website | 网站链接 |
电子邮箱 | |
email_verified | 邮箱是否被认证 |
gender | 性别 |
birthdate | 生日 |
zoneinfo | 时区 |
locale | 区域 |
phone_number | 手机号 |
phone_number_verified | 认证手机号 |
address | 地址 |
formatted | 详细地址 |
street_address | 街道地址 |
locality | 城市 |
region | 省 |
postal_code | 邮编 |
country | 国家 |
updated_at | 信息更新时间 |
Access Token
Access Token 用来授权访问资源。
Access Token 有随机字符串形式和 JWT 形式,随机字符串形式的一切解析工作都由认证中心来完成,JWT 形式可以在本地完成验证。通常我们都会使用 JWT 形式。
使用 JWT 形式,资源服务器会校验 AccessToken 的合法性,以及其 Scope 的是否包含特定项目。
JWT Access Token 不保存 除 用户 ID 之外的其他信息。
代码语言:json复制{
"jti": "JWT ID",
"sub": "用户 ID",
"iat": 签发时间戳,
"exp": 到期时间戳,
"scope": "openid email message",
"iss": "签发者,http://xxx",
"aud": "接受方"
}
Refresh Token
Access Token,ID Token 的有效期很短,为了避免频繁要求用户登录,所以出现了 Refresh Token。
用户初次完成认证是,同时获得 Access Token、ID Token 和 Refresh Token,前两个的有效期很短,后一个很长。
当 Access Token 或 ID Token 快到期的时候,应用需要携带 Refresh Token 到认证中心获得新的 Access Token 和 ID Token,
此事认证中心会返回新的 Access Token 和 ID Token 及 旧的 Refresh Token,直到 Refresh Token 过期。
代码语言:json复制{
"access_token": "jwt加密内容",
"expires_in": 3600,
"id_token": "jwt加密内容",
"refresh_token": "随机字符串",
"scope": "openid profile offline_access phone email",
"token_type": "Bearer"
}