# 令牌
# 为何选择 jwt?
lin-cms 选择 jwt 作为用户认证鉴权的核心机制。与 cookie-session 的机制相比,jwt 更加轻量和方便,节约了开发和运维成本。在jwt官网介绍其两大使用场景。
Authorization(授权):这是 jwt 应用最为广泛的场景。jwt 将数据加密存储,分发给前 端,前端将其放在特定的 header 字段 中(也有放在 params 和 body 中),服务器收 到请求后,解析 jwt 判断用户身份,对用户请求进行限权。
Information Exchange(数据交换): jwt 可以通过公钥和私钥对信息进行加密,双方通信 后,互得数据。
如果你想了解 jwt 更多的信息和生态请阅读jwt官网。
# access_token 和 refresh_token
jwt 机制颇为灵活,如 Github 选择了单令牌机制,lin-cms 为了增强用户体验、提高接口 安全性, lin-cms 选择了双令牌机制。在双令牌机制中, access_token和refresh_token是一对相互帮助的好搭档,用户登陆成功后,服务器 会颁发 access_token 和 refresh_token,前端在得到这两个 token 之后必须谨慎存储,它们的作用如下:
access_token :用户访问接口,资源的凭证。access_token 十分重要,它是服务器对前 端有力控制的唯一途径,其生存周期较短,一般在 2 个小时左右,更有甚者,其生命周 期只有 15 分钟,在 lin-cms 中默认为 1 个小时。
refresh_token :用户重新获得 access_token 的凭证。refresh_token 的生命周期较长 ,一般为 30 天左右,但 refresh_token 不能被用来用户身份鉴权和获取资源,它只能 被用来重新获取 access_token。当前端发现 access_token 过期时,会自动通过 refresh_token 重新获取 access_token。
# 使用
lin-cms 已经默认集成了 jwt 双令牌机制,你可以方便地通过 HTTP 请求来进行令牌的颁 布和刷新操作。
# 用户登录获取 access_token、refresh_token
path
: /cms/user/login
method
: post
参数
:
name | 说明 | 类型 | 作用 |
---|---|---|---|
username | 用户名 | string | **** |
password | 密码 | string | **** |
结果
:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzU1MzMyNjMsIm5iZiI6MTUzNTUzMzI2MywianRpIjoiMTlkZWUwNzQtNzUxYi00MjBlLTk3NjAtZDRkMzc3YjdjMjUyIiwiZXhwIjoxNTM1NjE5NjYzLCJpZGVudGl0eSI6InBlZHJvIiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.9sNmAV5anxY5N1S1kaXzRRpdjzVX3fX6iI0ZjxGiiVs",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzU1MzMyNjMsIm5iZiI6MTUzNTUzMzI2MywianRpIjoiYjU0OWIwZGEtMTE3MS00NzJlLWE0MDMtMDFkMGRkZTRjOTYzIiwiZXhwIjoxNTM4MTI1MjYzLCJpZGVudGl0eSI6InBlZHJvIiwidHlwZSI6InJlZnJlc2gifQ.cBnqEBnome-dMFEueQ8oCJfoXX9_mzQJAGjyeq4bYh8"
}
使用
:
在得到令牌后,在 HTTP 请求的 Header 中加入Authorization
字段,字段值
为Bearer
加上access_token
,注意两个字段中间必须有一个空格,如下:
Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzU1MzMyNjMsIm5iZiI6MTUzNTUzMzI2MywianRpIjoiMTlkZWUwNzQtNzUxYi00MjBlLTk3NjAtZDRkMzc3YjdjMjUyIiwiZXhwIjoxNTM1NjE5NjYzLCJpZGVudGl0eSI6InBlZHJvIiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.9sNmAV5anxY5N1S1kaXzRRpdjzVX3fX6iI0ZjxGiiVs
服务器会解析该字段并得到用户信息,对用户进行鉴权。
# 通过 refresh_token 获取 access_token
path
: /cms/user/refresh
method
: get
参数
: 无
注意
: 必须在 HTTP 的 Header 中加上Authorization
字段,字段值为
Bearer ${refresh_token}
。
结果
:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6MSwic2NvcGUiOiJsaW4iLCJ0eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTc4OTI1NjU3fQ.SkyztGH0P7pH1kvxK60nkU8IGkVXF7YTNd706cW0sXw",
"refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6MSwic2NvcGUiOiJsaW4iLCJ0eXBlIjoicmVmcmVzaCIsImV4cCI6MTU4MTUxNDA1N30.RmmAq_irja2TCM3tmpUEuJGDLWDWbPf9K0FRc8FklEY"
}
使用
:
用户访问接口、资源时,必须在 HTTP Header 中附带Authorization
字段,字段值
为Bearer ${access_token}
,当通过 refresh_token 获取 access_token 时,应
将Authorization
字段的值替换为Bearer ${refresh_token}
。如:
Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzU1MzMyNjMsIm5iZiI6MTUzNTUzMzI2MywianRpIjoiYjU0OWIwZGEtMTE3MS00NzJlLWE0MDMtMDFkMGRkZTRjOTYzIiwiZXhwIjoxNTM4MTI1MjYzLCJpZGVudGl0eSI6InBlZHJvIiwidHlwZSI6InJlZnJlc2gifQ.cBnqEBnome-dMFEueQ8oCJfoXX9_mzQJAGjyeq4bYh8
服务器会自动解析Authorization
字段,如 refresh_token 未过期则会颁发新的
access_token。
TIP
在 lin-cms 的前端框架中,已经默认实现了以上机制,你大可不必自己去实现,当然如果 你想深入了解,也可在阅读本小节后自行尝试。