当前位置: 首页 > 知识库问答 >
问题:

使用 React Native 和 Redux 刷新 OAuth 令牌

李泓
2023-03-14

我是React Native的新手,我遇到的第一个障碍是在访问令牌到期时刷新我的访问令牌。基本实现是这样的,有一个访问令牌和一个刷新令牌。访问令牌到期,刷新令牌在授权标头中发送以刷新访问令牌。基于这篇SO帖子,我实现了一个中间件,它在每次API调用期间检查我们的访问令牌是否即将到期。如果是这样,它会启动一个动作创建者,该动作创建者会调用API来刷新和确认新的访问令牌。我在这里只展示了刷新调用,以免事情过于复杂。

问题是,检测刷新需求的同一个中间件也会受到刷新调用本身的影响,这将导致无限循环,并最终超过调用堆栈大小。我想知道是否有人能帮我找出解决这个问题的方法,或者告诉我我很笨,并提供一个更好的整体解决方案。非常感谢任何指导。谢谢大家!

function auth({ dispatch, getState }) {
      return next => action => {
        if (typeof action === 'function') {
          // Check expiration of our token
          if (tokenIsExpired(getState)) {
            console.log('Our access token will expire in less than 30s, refreshing');
            // Make sure we are not already refreshing the access token
            if (!getState().core.refreshTokenIsLoading) {
              return next(dispatch(refreshAccessTokenFlow())).then(() => next(action));
            } else {
              // Take promise from state and act after it
              return getState().core.refreshAccessTokenFlow.then(() => next(action));
            }
          }
        }
        return next(action);
      }
    }

export function refreshAccessTokenFlow() {
  return (dispatch) => {
    return dispatch(refreshAccessToken())
      .then((didRefresh) => {
        console.log('refresh access token returned');
        return Promise.resolve();
      })
      .catch(error => {
        console.log('refresh access token failed: ' + error);
        return Promise.reject(error);
      });
  }
}

共有1个答案

艾阳羽
2023-03-14

例如,您可以在需要访问令牌的操作中传递元数据,然后在中间件检查中传递,或者您需要根据元数据验证令牌。

操作文件

// My Team
export function fetchStuffWithOAuthStart(userId) {
  return {
    type: USER_FETCH_STUFF_WITHOUT_OAUTH_START,
    payload: { userId },
    meta: {
      oauth: true,
    }
};

中间件

function auth({ dispatch, getState }) {
      return next => action => {
        if (typeof action === 'function') {
          // Check here or you need to validate the token
          if (!action.meta || !action.meta.oauth) {
            return next(action);
          }

          // Check expiration of our token
          if (tokenIsExpired(getState)) {
            console.log('Our access token will expire in less than 30s, refreshing');
            // Make sure we are not already refreshing the access token
            if (!getState().core.refreshTokenIsLoading) {
              return next(dispatch(refreshAccessTokenFlow())).then(() => next(action));
            } else {
              // Take promise from state and act after it
              return getState().core.refreshAccessTokenFlow.then(() => next(action));
            }
          }
        }
        return next(action);
      }
    }

export function refreshAccessTokenFlow() {
  return (dispatch) => {
    return dispatch(refreshAccessToken())
      .then((didRefresh) => {
        console.log('refresh access token returned');
        return Promise.resolve();
      })
      .catch(error => {
        console.log('refresh access token failed: ' + error);
        return Promise.reject(error);
      });
  }
}
 类似资料:
  • 问题内容: 我们的React Native Redux应用程序使用JWT令牌进行身份验证。有许多操作需要此类令牌,​​并且例如在应用加载时会同时分派许多令牌。 例如 双方并要求JWT。我们将令牌保存在和中。我的问题是如何处理令牌到期。 最初,我将使用中间件来处理令牌到期 } 我遇到的问题是,对于令牌和操作,都会刷新令牌,因为在分发令牌和令牌时,令牌将过期。理想情况下,我想“暂停”需要身份验证的操作

  • 我遇到的问题是,和操作都将刷新令牌,因为在分派时,令牌将过期。理想情况下,我希望“暂停”需要身份验证的操作,直到令牌刷新。有没有一种方法可以用中间件做到这一点?

  • null 很抱歉太啰嗦了。 提前谢了。

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 我想从谷歌得到访问令牌。Google API表示,要获得访问令牌,将代码和其他参数发送到令牌生成页面,响应将是一个JSON对象,如下所示: 但是,我没有收到刷新令牌。我的答复是:

  • 我们在我们的Android应用程序中使用改版,与OAuth2安全服务器通信。一切都很好,我们使用RequestInterceptor在每个调用中包含访问令牌。然而,有时访问令牌会过期,需要刷新令牌。当令牌过期时,下一次调用将返回未经授权的HTTP代码,因此很容易监视。我们可以通过以下方式修改每个改型调用:在失败回调中,检查错误代码,如果它等于未授权,刷新OAuth令牌,然后重复改型调用。然而,为此