0

我们有一个使用 AuthSession 的托管 Expo 应用程序,专门用于将我们的应用程序部署到 Web 环境。使用 Auth0 和 PKCE 授权进行身份验证。

当我们当前的访问令牌已过期时,尝试获取新的访问令牌时遇到了问题。在发出 HTTP 请求之前,我们检查访问令牌是否已过期,如果已过期,我们使用 AuthSession.promptAysnc() 获取新的。问题是我们无法在发出 HTTP 请求之前等待 promptAsync 完成。

我们错过了什么吗?

const [request, result, promptAsync] = AuthSession.useAuthRequest(
    {
      redirectUri,
      clientId,
      scopes,
      prompt: AuthSession.Prompt.Login,
      extraParams: {
        audience
      }
    },
    { authorizationEndpoint, tokenEndpoint, revocationEndpoint }
);

const refreshAuthSessionAsync = async () => {
    ...
    promptAsync({ useProxy });
    // sleep hack - wait until we have something to return
    await new Promise(r => setTimeout(r, 1000));
    return authState;
};

const handleFetchAsync = async (url, request) => {
    ...

    if (Date.parse(expiresAt) < (new Date()).getTime()) {
      newAuthState = await refreshAuthSessionAsync();
      return newAuthState;
    }
    
    ...
}
4

1 回答 1

0

我正在解决与 Expo 托管应用程序类似的问题,该应用程序在使用 PKCE 流通过 Auth0 进行身份验证后尝试访问刷新令牌。

我在阅读有关刷新令牌的这个 Expo 问题的评论时遇到了这个 repo https://github.com/tiagob/create-full-stack/blob/master/packages/cfs-expo-auth0/src/index.tsx和 Auth0 https://github.com/expo/examples/issues/209

我还没有从这个 repo 中实现任何东西,但它的一些方法似乎可以解决我遇到的问题,并希望你的问题。

于 2020-09-24T18:15:46.217 回答