react-native - React Native 中的 Auth0 刷新令牌失败并显示 401
问题描述
在我的 React Native 应用程序中——init 应用程序不是 Expo——我试图刷新access_token
但我的POST
调用失败了401
。我正在测试这个功能,所以我POST
在登录后大约 30 秒拨打电话,所以不确定这是否起作用。
在我的初始登录中,我确实得到了refresh_token
一个有效的access_token
. 然后我告诉我的应用程序等待 30 秒并POST
拨打如下所示的电话:
const url = 'https://mydomain.auth0.com/oauth/token';
const postOptions = {
method: 'POST',
url: url,
headers: {
"content-type": 'application/x-www-form-urlencoded'
},
form: {
grant_type: 'refresh_token',
client_id: 'MY_CLIENT_ID',
refresh_token: 'REFRESH_TOKEN_RECEIVED_DURING_LOG_IN'
}
};
fetch(url, postOptions)
.then((response) => {
debugger;
// this is where I get response.status 401
})
知道这里有什么问题吗?
还想提一下,在我的应用程序设置下,Refresh Token
在“授予类型”下进行了检查,但未启用刷新令牌轮换或过期。
解决方案
我想出了这个并分享它以防其他人将来需要它。
首先,Auth0 文档充其量是具有误导性的。POST
他们不断提到一个不起作用的常规电话。
在我的 React Native 应用程序中,我使用了他们的react-native-auth0
库。这个库确实提供了refreshToken()
一种我最终使用的方法。
在我分享代码之前,这里有几个非常重要的点:
- 请务必
offline_access
在scope
您对用户的初始身份验证调用中包括。如果不包含offline_access
在您的 中scope
,您将不会获得refresh_token
. 一旦您收到它和您的access_token
和id_token
,请将其存储起来,因为您将多次使用它。这让我想到了第二点。 - 除非您另行设置,否则您的
refresh_token
不会过期。因此,将其存储在某个安全的地方,而不仅仅是AsyncStorage
. 如上所述,除非您以其他方式设置它或它被撤销,否则您refresh_token
不会过期并且您会一次又一次地使用它。
话虽如此,这是代码。请记住,在启动时,我将其初始化auth0
为全局变量,以便我可以在应用程序的不同部分访问它。
这是我的初始化的样子index.js
:
import Auth0 from 'react-native-auth0';
global.auth0 = new Auth0({
domain: "MY_DOMAIN.auth0.com",
clientId: "MY_CLIENT_ID",
});
这是我使用该refreshToken()
方法的方式:
// First, retrieve the refresh_token you stored somewhere secure after your initial authentication call for the user
global.auth0.auth.refreshToken({ refreshToken: 'MY_REFRESH_TOKEN' })
.then(result => {
// If you're doing it right, the result will include a new access_token
})
推荐阅读
- python - 如何使用未调用的实例方法中设置的变量?
- php - 将数据存储到三维数组 PHP
- unicode - 如何使用logstash解析包含不同unicode字符串的字段
- c++ - Need to check for nullptr when make_shared and make_unique is used?
- git - Docker 中的 Composer 未通过私有仓库的验证
- laravel - How to encrypt image using a password preferably using AES or simple encryption in laravel
- ios - Fastlane Unsupported directory name(s) for screenshots/metadata in ‘./metadata’: ar-SA
- python - How to solve the error : Input contains NaN, infinity or a value too large for dtype('float64').?
- javascript - 为什么使用道具时函数参数返回未定义?
- android - 如何检测地图何时完成调整大小