5

我有一个已经OAuth2实现的应用程序。它工作正常,但我在refresh_tokens这里感到困惑。我的应用程序正在使用React+Redux组合。

我知道我需要检查我是否access_token过期,然后使用refresh_token. 好的...但是我什么时候应该刷新它?发生之后401还是在一些API需要授权的请求准备就绪时(就在发送之前)?

我也知道如何在发送或检测响应之前使用HTTP拦截器获取所有请求。问题是我很困惑如何解决流程中的问题。如何在刷新令牌时“冻结”请求?或者当我解决响应问题时如何重复请求?API401Redux401

4

1 回答 1

8

当第一次与服务器成功认证时,我们将有 {access_token, expires_in, refresh_token}。我们将 access_token 和 expires_in 存储在会话存储中,而 refresh_token 存储在本地存储中。

每当获取 access_token 以获取数据(您应该通过填充 access_token 来增强/包装 fetch),您将检查 expires_in 是否即将到期(不到 1 分钟,或者您觉得合适),然后我们使用 refresh_token 请求新访问令牌。当然,我们还必须将新结果更新到存储中。

伪代码:

function getToken() {
    const expiresIn = storage.getItem(KEY_EXPIRES_IN);
    const accessToken = storage.getItem(KEY_ACCESS_TOKEN);
    if (accessToken
        && (!expiresIn || moment.unix(Number(expiresIn)).diff(moment(),   'minute') > 1)) {
        return accessToken;
    }
    return refreshToken();
}

每次向服务器发出请求时,都会调用上述函数。

P/S:您可能希望将其作为与 isomorphic-fetch 一起使用的承诺

于 2017-04-27T13:44:59.047 回答