参考一下定义
下图参考 RFC6749 定义的 Oauth2 中 token 使用的基本流程,看完我们就大概可以明白 Access Token 和 Refresh Token 两个的用法了。
+--------+ +---------------+
| |--(A)------- Authorization Grant --------->| |
| | | |
| |<-(B)----------- Access Token -------------| |
| | & Refresh Token | |
| | | |
| | +----------+ | |
| |--(C)---- Access Token ---->| | | |
| | | | | |
| |<-(D)- Protected Resource --| Resource | | Authorization |
| Client | | Server | | Server |
| |--(E)---- Access Token ---->| | | |
| | | | | |
| |<-(F)- Invalid Token Error -| | | |
| | +----------+ | |
| | | |
| |--(G)----------- Refresh Token ----------->| |
| | | |
| |<-(H)----------- Access Token -------------| |
+--------+ & Optional Refresh Token +---------------+
Figure 2: Refreshing an Expired Access Token
图解 Oauth2
客户端登录逻辑
- A.客户端带有登录凭证(如:三方微信认证、自家用户名密码等)请求授权服务器
- B.授权服务器返回 ac_token 和 rf_token
客户端业务逻辑
- C.客户端带有 ac_token 请求业务服务器(例如用户资料、用户订单等等)
- D.业务服务器验证 ac_token,且成功,则返回业务数据
- E.若客户端带有的 ac_token(失效、过期等)请求业务服务器
- F.业务服务器验证失败,则返回 token error
刷新 Access Token 逻辑
- G.客户端带上 rf_token 请求授权服务器
- H.授权服务器真对 rf_token 验证且通过后,返回新的 ac_token 和 rf_token
安全性思考
- Access Token 越短越安全,但是短了影响用户体验
- Refresh Token 一定保密不可泄漏,同时最好加入一些特征判定看下一条
- Refresh Token 刷新必须判定用户的合法性,例如 UA、IP 等资料,也可以是自己与客户端约定的一些特征资料
- Refresh Token 可以利用用户的 Ua 等特征信息,进行限定登陆设备数量(也就是一个用户同时可以拥有几个 Refresh Token),同时给用户一个观看当前在线设备列表,让用户真实了解在线设备的安全性,选择性让某设备掉线。
🐶 你走,我不送你。你来,风雨无阻,我去接你。