前后端分离token如何续期?

我们项目有种方案:
1、通过axios拦截401请求,发送refreshToken到后台获取accessTOken再交给前端

阅读 3.2k
3 个回答
  • 你的方案可以,401 后用 refreshToken 拿新的 accessToken.
  • 补充一下,refreshToken 也可能过期,如果刷新的时候 401 了就需要走登录流程。
  • 另外,安全性要求高的话,refreshToken 需要与客户端绑定,换了客户端不可用

参考 OAuth2 协议:

  +--------+                                           +---------------+
  |        |--(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

我认为这个需要结合具体的业务场景解决:
token过期时间不是很长(1~2小时)

  • 后端可以通过设置http状态码,或者在data里面设置code值的方法来判断登录过期(axios中无非是status和res.data.code)
  • 前端拿到状态信息,然后在axios响应拦截器里调用获取token的方法实现无感刷新

token过期时间较长

  • 前端拿到状态信息,然后在请求拦截器里重定向至登录页面

在请求中始终带上token 和 refreshToken
在token快过期的时候,由后端在响应头里返回新的token和refreshToken
下次请求带上这个新的token和refreshToken

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题