1

開発者サイトを使用して 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 を取得する別のフローです。

4

1 に答える 1

1

それは入るのに有効な状態です!ユーザーが以前にサインインしたことがあるが、サーバー上の更新トークンを失った場合は、そこにアクセスできます。

Gist を見ると (もちろん GoogleApiClient に移行してからは古くなっています)、onConnected にも getCode 呼び出しがあることがわかります: https://gist.github.com/ianbarber/7105273#file -コードアクティビティ-Java-L97

if (mSessionCookie == null) {
  // If the server hasn't got a refresh token, grab it.
  if(mUserHasRefreshOnServer.containsKey(mAccountName)) {
    getCode();
  } else {
    // Otherwise, just get the session.
    getSession();
  }
}

これはまさにそのケースを処理するためのものです-ユーザーが署名したことはわかっていますが、サーバーで更新トークンを取得する必要があるため、 getCode ルートを介してそれらを送信し、同意ダイアログをポップアップする必要がありますUserRecoverableAuthException.

于 2015-03-03T01:09:26.353 に答える