如何在使用GoogleAuthUtil时获取refreshToken

时间:2014-11-17 09:39:16

标签: android oauth google-play-services youtube-data-api

我在Android上GoogleAuthUtil使用Google Play Services。在致电GoogleAuthUtil.getToken(context, userName, scope)后,我得到了一个这样的代币:

ya29.wQBWztab5kcgMLcMbAI0LwFzHC_DPrxauSWbX4P6KOnBEOgjcm9V7OI9AFr6JGxDY54gP00RemzzgML56_gWRHn8Q5jK16BLY-0y83Gc5vfe3xN-QpyM4d7z

这是一个access_token,可用于调用Google Apis。然后,我如何获得刷新令牌以刷新此access_token,因为我在我的Android项目中也使用Google oauth java libraryYouTube Java Library,我想使用这两个库来维护/​​管理{{1} },access_tokenrefresh token值。 (使用Google oauth java库时,其返回的expires_in包含TokenResponseaccess_tokenrefresh token

提前致谢。

3 个答案:

答案 0 :(得分:2)

您无法使用GoogleAuthUtil.getToken()直接获取refreshToken,但如果您在每次收到401错误时致电getToken(),GoogleAuthUtil会在需要时为您返回新的有效令牌。

答案 1 :(得分:2)

要获取刷新令牌,请确保您的范围采用以下格式:

Account account = new Account(mEmail, GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
mScope="oauth2:server:client_id:"+ OAUTH_WEBCOMPONENT_ID+":api_scope:"+"https://www.googleapis.com/auth/userinfo.email";
return GoogleAuthUtil.getToken(mActivity, account, mScope);

这将为您提供授权代码,该代码可以发送到您的Web组件。

您的webcomponent只能使用此授权代码一次获取访问令牌并使用此代码刷新令牌。您必须在数据库中保存刷新令牌,这样当访问代码不再有效时,您可以在需要时获得新的访问令牌。

POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-length: 233
content-type: application/x-www-form-urlencoded
user-agent: google-oauth-playground

code=4%2FVL2YMuPMheOP2-0vyKBSfGd-4er5GsMY17Ecp8ITK4U&redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&client_id=407408718192.apps.googleusercontent.com&client_secret=************&scope=&grant_type=authorization_code

您可以在此处模拟其工作原理:

https://developers.google.com/oauthplayground/

答案 2 :(得分:0)

调用requestServerAuthCode(String, true)而不是requestServerAuthCode(String),该请求将在请求成功时强制其包含一个refresh_token。

https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder.html#requestServerAuthCode(java.lang.String,布尔值)

val task = GoogleSignIn.getSignedInAccountFromIntent(data);
task.addOnSuccessListener {

val account = task.getResult(ApiException::class.java)
val authCode = account!!.serverAuthCode

// Send authcode to server to exchange access and refresh tokens.
exchangeAuthCodeForAccessToken(authCode)

}