8

現在、アンドロイドアプリはGoogleAuthUtilを使用してユーザーにログインし、access_tokenを取得します(下のコードスニペットではGoogleApiClientを作成し、GoogleAuthUtilを使用してトークンを取得します)。私はその後、バックエンドGoogleログイン新しいGoogleSignInOptionsを使用してアクセストークンを取得

私は今、新しいGoogle SIGNINに移動しようとしているに送信

mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .addConnectionCallbacks(this) 
     .addOnConnectionFailedListener(this) 
     .addApi(Plus.API) 
     .addScope(new Scope("profile")) 
     .build(); 
... 
... 

String accessToken = GoogleAuthUtil.getToken(GoogleLoginActivity.this, 
          Plus.AccountApi.getAccountName(mGoogleApiClient), 
          "oauth2:profile email"); 

- https://developers.google.com/identity/sign-in/android/sign-in

をし、そのようなGoogleApiClientの作成を変更し、

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestEmail() 
     .requestIdToken("<web client id>") 
     .build(); 
mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .enableAutoManage(this, this) 
     .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
     .build(); 

ログインの使用を行います。

と(上記のリンクの例と同様)活動の結果使用上の10、

OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); 
if (opr.isDone()) { 
    // If the user's cached credentials are valid, the OptionalPendingResult will be "done" 
    // and the GoogleSignInResult will be available instantly. 
    Log.d(TAG, "Got cached sign-in"); 
    handleSignInResult(opr.get()); 
} else { 
    // If the user has not previously signed in on this device or the sign-in has expired, 
    // this asynchronous branch will attempt to sign in the user silently. Cross-device 
    // single sign-on will occur in this branch. 
    showProgress(); 
    opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
     @Override 
     public void onResult(GoogleSignInResult googleSignInResult) { 
      hideProgress(); 
      handleSignInResult(googleSignInResult); 
     } 
    }); 
} 

が、今、handleSingInResult(GoogleSignInResult result)に私が唯一 result.getSignInAccount().getIdToken();

バックid tokenを得ることができるようですが誰もい(以前のように)これからアクセストークンを取得することが可能かどうかを知っています。どんな助けもありがたい。あなたに署名した後

+0

私はここで同じ問題を抱えていますが、あなたはこの問題を回避することができましたか? –

+0

本当にありません。私がこれを使い始める前に、バックエンドでIDトークン処理を実装しなければなりませんでした。 – Bootstrapper

+0

私はAndroidのアカウントピッカーを使用してアカウント名を取得し、GoogleAuthUtil.getToken(コンテキスト、accoutName、スコープ)を使用してトークン自体を取得しましたが、それは魅力的であり、最初のものほど簡単でした。 –

答えて

4

は、トークンを取得することができます:

final String token = GoogleAuthUtil.getToken(mAppContext, mAccountName, AUTH_TOKEN_TYPE); 

はAsynctaskそれを行うことを忘れてはいけません。

GoogleAuthUtil.getToken() 

が、それはあなたのOAuthトークンを与えるものではありません、それはむしろ「短いを返す:メソッドの名前にもかかわらず、

注:詳細についてはhere

EDITを見て有効な認証コードはdocumentationに従います。

GoogleAuthUtil.getToken()を呼び出して認証コードを取得したらどうすればよいですか?

HTTPS経由でバックエンドサーバーに認証コードを送信する必要があります。あなたのサーバーからのみ、あなたのアプリケーションではなく、アクセストークンやリフレッシュトークンを受け取ろうとするべきです。

+0

これはもっと機能しません。 – Vyacheslav

+0

がまだここで動作しています – abedfar

+5

@aberdfarこのメソッドは、私の質問で言及したように、 – Vyacheslav

2

私は同じ問題を抱えていました。トークンはアクセスを取得するには

GoogleSignInAccount acct = result.getSignInAccount(); 
Log.d(TAG, "handleSignInResult2: "+acct.getIdToken()); 

伝わってくるので、彼らは今、あなたはR.string.server_client_IDはあなたが作るプロジェクトからclient IDある

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestEmail().requestProfile().requestId().requestIdToken(getString(R.string.server_client_ID)) 
        .build(); 
にそれを求めるあまりにも持ってあまりにもこのトークンを、それを変更しましたGoogleデベロッパーコンソール

私はこれがあなたを助けてくれることを願っています。

こちらのドキュメントもあります。 https://developers.google.com/identity/sign-in/android/backend-auth

+3

と非難されました。このように受け取られたトークンは 'id_token'であり、' access_token'ではありません。だから今のところ、AsyncTaskの 'GoogleAuthUtil.getToken()'を使って以前と同じように 'access_token'を引き出す必要があるようです(私は別の方法があると思っていましたが...) – Bootstrapper

+0

そのとおりです。 id_tokenをaccess_tokenに交換する必要があります。 –

関連する問題