同时发出带有过期令牌的API请求时,如何避免多个令牌刷新请求

奈田芝

使用JWT的API请求是在flask和Vue.js中实现的。JWT存储在cookie中,并且服务器为每个请求验证JWT。

如果令牌已过期,将返回401错误。如果您收到401错误,请按照以下代码刷新令牌,然后再次发出原始API请求。以下代码是所有请求通用的。

http.interceptors.response.use((response) => {
    return response;
}, error => {
    if (error.config && error.response && error.response.status === 401 && !error.config._retry) {
        error.config._retry = true;
        http
            .post(
                "/token/refresh",
                {},
                {
                    withCredentials: true,
                    headers: {
                        "X-CSRF-TOKEN": Vue.$cookies.get("csrf_refresh_token")
                    }
                }
            )
            .then(res => {
                if (res.status == 200) {
                    const config = error.config;
                    config.headers["X-CSRF-TOKEN"] = Vue.$cookies.get("csrf_access_token");
                    return Axios.request(error.config);
                }
            })
            .catch(error => {

            });
    }
    return Promise.reject(error);
});

当令牌到期时同时发出多个API请求时,无用地刷新令牌。例如,请求A,B和C几乎同时执行。由于每个请求都返回401,因此每个拦截器都会刷新令牌。

没有真正的伤害,但是我认为这不是一个好方法。有一个解决此问题的好方法。

我的想法是首先发出一个API请求以验证令牌到期,此方法是在验证和刷新完成后发出请求A,B和C。由于cookie是HttpOnly,因此无法在客户端(JavaScript)上验证到期日期。

对不起英语不好...

菲尔

您需要做的是在拦截器外部保持一些状态。东西说

等等,我正在获取新令牌。

最好通过保留对的引用来完成Promise这样,第一个401拦截器可以创建承诺,然后所有其他请求都可以等待。

const refreshTokenPromise // this holds any in-progress token refresh requests

// I just moved this logic into its own function
const getRefreshToken = () => http.post('/token/refresh', {}, {
  withCredentials: true,
  headers: { 'X-CSRF-TOKEN': Vue.$cookies.get('csrf_refresh_token') }
}).then(() => Vue.$cookies.get('csrf_access_token'))

http.interceptors.response.use(r => r, error => {
  if (error.config && error.response && error.response.status === 401) {
    if (!refreshTokenPromise) { // check for an existing in-progress request
      // if nothing is in-progress, start a new refresh token request
      refreshTokenPromise = getRefreshToken().then(token => {
        refreshTokenPromise = null // clear state
        return token // resolve with the new token
      })
    }

    return refreshTokenPromise.then(token => {
      error.config.headers['X-CSRF-TOKEN'] = token
      return http.request(error.config)
    })
  }
  return Promise.reject(error)
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有过期JWT刷新令牌的滑动窗口

来自分类Dev

发出请求时Vimeo API无效令牌

来自分类Dev

何时刷新API请求的过期Firebase3(Web)令牌

来自分类Dev

使用带有IdentityModel 4.1.1的刷新令牌的请求访问令牌

来自分类Dev

访问令牌过期时,Web API 刷新令牌不刷新

来自分类Dev

使用 python 3.6 向带有令牌的 API 发出我的第一个请求

来自分类Dev

我尝试从具有JWT令牌的API发出GET请求时遇到错误401(未经授权)

来自分类Dev

如何确定我对Instagram API的访问令牌没有过期?

来自分类Dev

如何确定对Instagram API的访问令牌没有过期?

来自分类Dev

当同时发出多个API请求时,xampp崩溃

来自分类Dev

如何获得每个请求的刷新令牌?

来自分类Dev

向Google gmail API发出令牌请求时,请求400错误

来自分类Dev

如何从jQuery发送带有AJAX请求的令牌

来自分类Dev

Laravel JWT刷新令牌中间件和同时请求

来自分类Dev

使用过期令牌发出请求时,响应中不存在Access-Control-Allow-Origin(CORS)标头

来自分类Dev

使用过期令牌发出请求时,响应中不存在Access-Control-Allow-Origin(CORS)标头

来自分类Dev

当我通过 UI 向 api 端点发出 GET/POST 请求时,如何发送我的 JWT 令牌?

来自分类Dev

访问令牌过期后,Google API无效请求

来自分类Dev

将工作表另存为单独的PDF:“发出API请求时必须包括API令牌。”

来自分类Dev

将工作表另存为单独的PDF:“发出API请求时必须包括API令牌。”

来自分类Dev

Google Api,当我拥有访问令牌和以前的刷新令牌时,如何刷新用户令牌

来自分类Dev

NodeJS,如何使用Google API获得带有刷新令牌的新令牌?

来自分类Dev

在oauth进程中从Sonos api发出请求令牌

来自分类Dev

使用cf push时出现CloudFoundry错误:刷新身份验证令牌时出错。身份验证请求失败:无效的身份验证令牌:无效的刷新令牌(已过期)

来自分类Dev

如何签署请求令牌?

来自分类Dev

刷新令牌时,Spotify Web API错误请求错误“ invalid_client”

来自分类Dev

刷新页面时,axios请求令牌返回null

来自分类Dev

刷新页面时,axios请求令牌返回null

来自分类Dev

刷新URL时Spotify请求访问令牌不起作用

Related 相关文章

  1. 1

    带有过期JWT刷新令牌的滑动窗口

  2. 2

    发出请求时Vimeo API无效令牌

  3. 3

    何时刷新API请求的过期Firebase3(Web)令牌

  4. 4

    使用带有IdentityModel 4.1.1的刷新令牌的请求访问令牌

  5. 5

    访问令牌过期时,Web API 刷新令牌不刷新

  6. 6

    使用 python 3.6 向带有令牌的 API 发出我的第一个请求

  7. 7

    我尝试从具有JWT令牌的API发出GET请求时遇到错误401(未经授权)

  8. 8

    如何确定我对Instagram API的访问令牌没有过期?

  9. 9

    如何确定对Instagram API的访问令牌没有过期?

  10. 10

    当同时发出多个API请求时,xampp崩溃

  11. 11

    如何获得每个请求的刷新令牌?

  12. 12

    向Google gmail API发出令牌请求时,请求400错误

  13. 13

    如何从jQuery发送带有AJAX请求的令牌

  14. 14

    Laravel JWT刷新令牌中间件和同时请求

  15. 15

    使用过期令牌发出请求时,响应中不存在Access-Control-Allow-Origin(CORS)标头

  16. 16

    使用过期令牌发出请求时,响应中不存在Access-Control-Allow-Origin(CORS)标头

  17. 17

    当我通过 UI 向 api 端点发出 GET/POST 请求时,如何发送我的 JWT 令牌?

  18. 18

    访问令牌过期后,Google API无效请求

  19. 19

    将工作表另存为单独的PDF:“发出API请求时必须包括API令牌。”

  20. 20

    将工作表另存为单独的PDF:“发出API请求时必须包括API令牌。”

  21. 21

    Google Api,当我拥有访问令牌和以前的刷新令牌时,如何刷新用户令牌

  22. 22

    NodeJS,如何使用Google API获得带有刷新令牌的新令牌?

  23. 23

    在oauth进程中从Sonos api发出请求令牌

  24. 24

    使用cf push时出现CloudFoundry错误:刷新身份验证令牌时出错。身份验证请求失败:无效的身份验证令牌:无效的刷新令牌(已过期)

  25. 25

    如何签署请求令牌?

  26. 26

    刷新令牌时,Spotify Web API错误请求错误“ invalid_client”

  27. 27

    刷新页面时,axios请求令牌返回null

  28. 28

    刷新页面时,axios请求令牌返回null

  29. 29

    刷新URL时Spotify请求访问令牌不起作用

热门标签

归档