最近几年 Restful API 及 SPA(单页面应用) 的盛行,cookie-session 的机制似乎越来越 不适合前后端分离的场景。
在分布式和微服务的趋势下,不少人选择在 redis 中存储 session 来达到单点登陆的效果,这无疑增加了成本和开发难度。
于是更多的人转而使用 jwt 来管理用户会话和授权,在 jwt官网介绍其两大使 用场景。
在一般 jwt 应用中,access_token
和refresh_token
是一对相互帮助的好搭档,前面讲 到用户在前端登陆后,服务器会发送 access_token
和 refresh_token
给前端,前端在得 到这两个 token
之后必须谨慎存储。
用来用户鉴权,控制用户对接口,资源的访问。access_token
十分重要 ,它是服务器对前端有力控制的唯一途径,故一般其生存周期十分短,一般在 2 个小时 左右,更有甚者,其生命周期只有 15 分钟,默认 1 个小时。
用户通过登陆后获得 access_token
,而 access_token
的生命周期十 分短暂,但是用户登陆太频繁会严重影响体验,因此需要一种免登陆便能获取 access_token 的方式。refresh_token 主要用来解决该问题,refresh_token 的生命周 期较长,一般为 30 天左右,但 refresh_token 不能被用来用户身份鉴权和获取资源, 它只能被用来重新获取 access_token。当前端发现 access_token 过期时,便应通过 refresh_token 重新获取 access_token。
用户通过用户名和密码获取 access_token
和 refresh_token
http://{{iot_domain}}/api/v1/user/login
POST
参数 | 类型 | 必填 | 描述 | 范例 |
---|---|---|---|---|
username | String(64) | 是 | 用户名 | demo |
password | String(128) | 是 | 密码 | 123456 |
请求案例
{
"username": "demo",
"password": "e10dcc75"
}
Postman 模拟请求
返回字段 | 字段类型 | 描述 |
---|---|---|
code | int | 状态码 |
msg | string | 错误信息 |
data | array | 数据列表 |
返回案例
{
"code": 200,
"msg": "请求成功",
"data": {
"access_token": "eyJ0eXAiOiJKV1QiL...CJhbGciOiJIUzI1hXc",
"refresh_token": "eyJ0eXAiOiJKV1sz...A_Pcqa1kD-Nb9UNLhck"
}
}
在请求其他资源或接口时在 header
中,加入Authorization
字段,字段值为Bearer
加 上access_token
,注意两个字段中间必须有一个空格,如下:
Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzU1MzMyNjMsIm5iZiI6MTUzNTUzMzI2MywianRpIjoiMTlkZWUwNzQtNzUxYi00MjBlLTk3NjAtZDRkMzc3YjdjMjUyIiwiZXhwIjoxNTM1NjE5NjYzLCJpZGVudGl0eSI6InBlZHJvIiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.9sNmAV5anxY5N1S1kaXzRRpdjzVX3fX6iI0ZjxGiiVs
服务器会解析该字段并得到用户信息,对用户进行鉴权。
http://{{iot_domain}}/api/v1/user/refresh
GET
无
注意在 Authorization 中加上 refresh_token
Postman 模拟请求
返回案例
{
"code": 200,
"msg": "请求成功",
"data": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3aW90LmZycC50aW55d2FuLnRvcCIsImlhdCI6MTU3NjAyNzY4NiwiZXhwIjoxNTc2MDM0ODg2LCJ1c2VyIjp7ImlkIjoyNSwidXNlcm5hbWUiOiJkZW1vIiwic3RhdHVzIjoxLCJjcmVhdGVfdGltZSI6IjIwMTktMDktMTMgMjI6NDE6MjUiLCJ1cGRhdGVfdGltZSI6IjIwMTktMTItMDEgMTI6MDU6MDMiLCJkZWxldGVfdGltZSI6MCwibG9naW5fdGltZSI6MTU2ODQyMDM0OCwibG9naW5faXAiOiIxMTUuMTkzLjE3Mi4yMDAiLCJncm91cF9pZCI6MiwibW9ibGllIjoiIiwibmlja25hbWUiOiIiLCJhdmF0YXIiOm51bGwsImVtYWlsIjoiIn19.NR5bD4Z7NNqUsCg1B3FwWswEnSfHbcbE-KBLrIH2AcE"
}
}
用户获取资源时,Authorization 字段的值为 Bearer
加上 access_token,当通过 refresh_token 获取 access_token 时,应将 Authorization 中的 access_token 替换为 refresh_token,如:
Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzU1MzMyNjMsIm5iZiI6MTUzNTUzMzI2MywianRpIjoiYjU0OWIwZGEtMTE3MS00NzJlLWE0MDMtMDFkMGRkZTRjOTYzIiwiZXhwIjoxNTM4MTI1MjYzLCJpZGVudGl0eSI6InBlZHJvIiwidHlwZSI6InJlZnJlc2gifQ.cBnqEBnome-dMFEueQ8oCJfoXX9_mzQJAGjyeq4bYh8
服务器会解析该字段,如 refresh_token 字段未过期则会发送新的 access_token。