在React中处理刷新令牌

时间:2019-05-15 11:09:35

标签: reactjs authentication

我需要使用刷新令牌来获取新的访问令牌,并且该令牌将过期。在前端,在搜索时遇到了两种方法:

  1. 使用axios拦截器检查访问令牌是否仍然有效=>如果它不是有效的访问令牌(未过期),则使用refresh-token获取新的访问令牌=>如果获得新的令牌成功=>执行请求。

  2. 执行请求=>服务器检查访问令牌=>是否无效,然后将错误代码发送给客户端=>客户端,然后执行请求以获取新的访问令牌=>如果获得新的令牌成功=>重试请求

我不知道哪种方法更好。在我看来,方法1更简单,但检查访问令牌是否有效可能不是客户端的责任。第二种方法对我来说似乎很好,但是在收到新的访问令牌后如何重试请求

2 个答案:

答案 0 :(得分:0)

我使用其他变体,假设对后端的每个请求都将重置令牌到期日期时间。在这种情况下,我有流程:

  • 登录请求=>使用令牌和信息响应token有效期(以秒为单位,例如密钥expire_in_seconds
  • 在前端,开始从expire_in_seconds倒数到0
  • 每个授权的后端请求=>在前端过期时间重置为expire_in_seconds(当然也在后端)
  • 当用户暂时不执行任何操作且计数器减少时,您可以向用户显示消息“您的会话将在{counter}秒后过期。 继续会议'
  • 如果用户单击按钮(保持会话)-重置两侧(后端和前端)的计数器
  • 如果用户不单击按钮-注销他

答案 1 :(得分:0)

您可以使用以下方式: Axios具有error.config,这是最后一个请求,被错误捕获。

    api.interceptors.response.use(
      response => {
       ...
      },
      error => {
        if (error.response.status === 401) {
          refreshToken(YOUR_DATA) // your method to refresh Token
          axios.request(error.config).then(response => { // makes the last request that passed with an error
           ...
           })
           .catch(error => console.log(error) 
         }
    ...
      }
    );