使用 expo 身份验证会话刷新令牌 (Google)

Refresh token with expo auth sessions (Google)

我使用我的 Android 应用程序 expo-auth-sessions 通过 Google 授权用户:

  const [request, response, promptAssync] = Google.useAuthRequest({
    androidClientId: ANDROID_CLIENT_ID,
    iosClientId: IOS_CLIENT_ID,
    expoClientId: EXPO_CLIENT_ID,
    scopes: [
      "https://www.googleapis.com/auth/drive",
    ],
  })

请求工作正常,它 returns 一个访问令牌,但不包含刷新令牌。

是否有可能将请求配置为 returns 刷​​新令牌或类似的东西以在访问令牌过期后不强制用户再次登录?

当前回复:

{
    authentication: {
      accessToken: TOKEN,
      expiresIn: "3599",
      idToken: undefined,
      issuedAt: 1644693943,
      refreshToken: undefined,
      scope:
        "https://www.googleapis.com/auth/drive",
      tokenType: "Bearer",
    },
    params: {
      access_token: TOKEN,
      expires_in: "3599",
      scope:
        "https://www.googleapis.com/auth/drive",
      token_type: "Bearer",
    },
    type: "success"
  }

提前致谢!

您必须在您的身份验证 URL 中添加 access_type: "offline" (Google APIs auth),因为默认情况下 expo 不会这样做。为此,您可以使用 useAuthSession 中的 extraParams 属性。但是,responseType: "token"(默认值)不支持 access_type: "offline",因为 implicit_grant_flow 不存在 refresh_token 的概念。您必须将其更改为 responseType: "code",然后在服务器端交换获取的代码以获取访问和刷新令牌。总体而言,您必须进行以下更改 -

const [request, response, promptAssync] = Google.useAuthRequest({
  androidClientId: ANDROID_CLIENT_ID,
  iosClientId: IOS_CLIENT_ID,
  expoClientId: EXPO_CLIENT_ID,
  scopes: [
    "https://www.googleapis.com/auth/drive",
  ],
  responseType: "code",
  shouldAutoExchangeCode: false,
  extraParams: {
    access_type: "offline"
  },
})

但是,如果您之前已经授权过该应用程序,则可能还需要添加 prompt: 'consent'。您可以查看此答案以获得更清晰的信息 - https://github.com/googleapis/google-api-python-client/issues/213#issuecomment-205886341