使用 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
我使用我的 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