ワンタイム認証コードを要求することで Google サービスへのアクセスを取得する Android アプリがあります。ユーザーがログインするたびに、認証コードが Google から取得されます。しばらくはうまくいきましたが、特定のユーザーに対しては機能しなくなりました。このユーザーは取得し続けるため、UserRecoverableAuthException
Google のアクセス許可要求画面が何度も表示され続けます。このユーザーに通常のアクセス トークンを取得しようとすると、問題はありません。
私が使用するコード:
protected Void doInBackground(Void... params)
{
try
{
// Obtaining normal access token for testing propose.
String tempToken = GoogleAuthUtil.getToken(getApplicationContext(), mAccountName, "oauth2:https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/calendar");
NLog.i(TAG, "Got token2: "+tempToken);
// Obtaining One time auth code
String scope = String.format("oauth2:server:client_id:%s:api_scope:%s",CLIENT_ID, TextUtils.join(" ", SCOPES));
mServerToken = GoogleAuthUtil.getToken(getApplicationContext(), mAccountName, scope);
NLog.i(TAG, "Got code: "+mServerToken);
sendGoogleLoginResult(RESULT_OK, null, mServerToken);
finish();
}
catch (UserRecoverableAuthException e)
{
if (e !=null && e.getIntent() != null && authExceptionCount <3)
{
authExceptionCount++;
Intent recoveryIntent = e.getIntent();
startActivityForResult(recoveryIntent, GOOGLE_RECOVERY_ACTIVITY_REQUEST);
}
else
{
Log.i(TAG, "UserRecoverableAuthException but there was no intent: ", e);
sendGoogleLoginResult(RESULT_CANCELED, null, mServerToken);
finish();
}
}
catch (IOException e) {
Log.i(TAG, "transient error encountered: ", e);
sendGoogleLoginResult(RESULT_CANCELED, null, mServerToken);
finish();
} catch (GoogleAuthException e) {
// This is likely unrecoverable.
Log.e(TAG, "Unrecoverable authentication exception: " + e.getMessage(), e);
sendGoogleLoginResult(RESULT_CANCELED, null, mServerToken);
finish();
}
return null;
}