我是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);
});
}
}
例如,您可以在需要访问令牌的操作中传递元数据,然后在中间件检查中传递,或者您需要根据元数据验证令牌。
操作文件
// 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令牌,然后重复改型调用。然而,为此