開発者サイトを使用して google+ サインインを統合し、サーバー側については、riskcompletefailure ブログで @ianbarber のソリューションに従いました
これは私がGoogleApiClientをどのように構築しているかです:
return new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API, Plus.PlusOptions.builder().build())
.addScope(new Scope("email")).addScope(Plus.SCOPE_PLUS_LOGIN)
.build();
これは、非同期タスクでIDトークンを取得する方法です
scopes = "audience:server:client_id:" + Util.CLIENT_ID_SERVER;
id = GoogleAuthUtil.getToken(getActivity(),
Plus.AccountApi.getAccountName(mGoogleApiClient),
scopes);
その後、createSession が呼び出され、サーバーからの応答に基づいて、hashMap が更新され、GoogleApiClient が再構築され、接続が再試行されますが、サーバーが 401 を返したため、onConnectionFailed() ではなく onConnceted() になります (更新トークンがありません)。
if (cookie.equals("NO_REFRESH")) {
Log.v(TAG, "create session for " + mAccountName);
mSessionCookie = null;
mUserHasRefreshOnServer.put(mAccountName, false);
} else {
Log.v(TAG, "refresh available on server");
mSessionCookie = cookie;
mUserHasRefreshOnServer.put(mAccountName, true);
}
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
Log.v(TAG, "disconnect googleclient ");
}
Log.v(TAG, "try connect googleclient ");
mGoogleApiClient = buildGoogleApiClient();
mGoogleApiClient.connect();
}
これは onConnectionFailed() で実行する必要があることです
public void onConnectionFailed(ConnectionResult result) {
if ((mAccountName != null)
&& mUserHasRefreshOnServer.containsKey(mAccountName)
&& mUserHasRefreshOnServer.get(mAccountName) == Boolean.FALSE) {
getCode(); //code for getting onetime authorization code
}
私が間違っていることを指摘してください。詳細については、私が正確に従ったこのドキュメントを参照してください
編集:
私はフローを変更しました..この要点を正確に複製しますが、idトークンを送信した後(サーバーに更新がなく、同意が求められない場合)、getCodeに行くと、オフラインアクセスではなくPlus.SCOPE_PLUS_LOGINに対してのみ同意を得ます。再接続しても、エラー コード = 4 で onConnectionFailed になります (サインインが必要です)
しかし、事前にエラーを解決し (Plus.SCOPE_PLUS_LOGIN に同意)、今度は getCode を使用すると、このオフライン アクセスの同意も取得し、その結果、必要な onConnected を取得する別のフローです。