首页 > 解决方案 > 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在“授予类型”下进行了检查,但未启用刷新令牌轮换或过期。

标签: react-nativeauthenticationauth0refresh-token

解决方案


我想出了这个并分享它以防其他人将来需要它。

首先,Auth0 文档充其量是具有误导性的。POST他们不断提到一个不起作用的常规电话。

在我的 React Native 应用程序中,我使用了他们的react-native-auth0库。这个库确实提供了refreshToken()一种我最终使用的方法。

在我分享代码之前,这里有几个非常重要的点:

  1. 请务必offline_accessscope您对用户的初始身份验证调用中包括。如果不包含offline_access在您的 中scope,您将不会获得refresh_token. 一旦您收到它和您的access_tokenid_token,请将其存储起来,因为您将多次使用它。这让我想到了第二点。
  2. 除非您另行设置,否则您的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
   })

推荐阅读