2015-10-13 12 views
7

IDトークンをバックエンドに送信するためのthese instructionshttps://developers.google.com/identity/sign-in/android/backend-auth)ですが、String scopes = "audience:server:client_id:" + Service.SERVER_CLIENT_ID;を設定すると(SERVER_CLIENT_IDはAndroidクライアントIDではありません)このエラーをスローします。バックエンドサーバーを使用したGoogle認証が必要スコープ

E/Login: com.google.android.gms.auth.GoogleAuthException: Unknown

私が代わりに String scopes = "oauth2:profile email";

次のスコープを使用する場合しかし、私は正常に「」トークンを取得しますが、それは限り、私はそれがあることを期待通りではないと私はそれが間違っているかもしれない怖いです。

私の質問は

1)なぜscopes = "audience:server:client_id:" + SERVER_CLIENT_ID;は、ガイドの仕事で使用していません...ですか?

2)私が得たトークンは、String scopes = "oauth2:profile email";を使って、バックエンドでユーザーを確認するための安全なものですか?

コードは次のとおりです。

@Override 
    protected String doInBackground(Void... params) { 
     String accountName = Plus.AccountApi.getAccountName(googleApiClient); 
     Account account = new Account(accountName, GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE); 
     //String scopes = "oauth2:profile email"; 
     String scopes = "audience:server:client_id:" + Service.SERVER_CLIENT_ID; // Not the app's client ID. 
     Log.d(TAG, "Account Name: " + accountName); 
     Log.d(TAG, "Scopes: " + scopes); 

     try { 
      userIdToken = GoogleAuthUtil.getToken(getApplicationContext(), account, scopes); 

      return userIdToken; 
     } catch (IOException e) { 
      Log.e(TAG, "IOError retrieving ID token.", e); 
      return null; 
     } catch (UserRecoverableAuthException e) { 
      startActivityForResult(e.getIntent(), RC_SIGN_IN); 
      return null; 
     } catch (GoogleAuthException e) { 
      Log.e(TAG, "GoogleAuthError retrieving ID token.", e); 
      return null; 
     } 
    } 

答えて

1

oauth2:profile電子メールにスコープを設定すると、IDトークンとは異なるアクセストークンが返されます。

アクセストークンを使用してGoogle APIにアクセスすることができます.IDトークンは、Googleがデジタル署名したユーザーに関するID情報を含むJWTです。フォーマットは異なります。 IDトークン用に提供されたサンプルコードを使用してアクセストークンを認証しようとすると、無効なエラーが発生します。

GoogleAuthUtil.getToken()のドキュメントを見ると、通常、無効なスコープや無効なクライアントなどのクライアントエラーが原因のGoogleAuthExceptionが致命的な例外であることがわかります。 https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#getToken(android.content.Context, android.accounts.Account, java.lang.String, android.os.Bundle)

Google DeveloperコンソールでApp and WebserverのoAuth2 IDを設定し、マニフェストのパッケージ名が、アプリケーションIDの作成時にSHAフィンガープリントと一緒に指定するパッケージ名と一致することを確認してください。 WebサーバーIDをSERVER_CLIENT_IDとして使用します。

サンプルコードをGithubにアップロードしました。 https://github.com/kmosdev/google-signin-backend-auth

私はGoogleのサンプル・サインイン・アプリを使い、バックエンド認証を追加するように修正しました。詳細はReadmeにあります。

チェックするもう一つは、あなたがあなたのマニフェストファイルに適切な権限を持っていることですが、私は、これは間違っていた場合は、別のエラーを取得したいと考えている:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
+0

オフ第一。 Stackoverflowへようこそ。それが正しい方向に私を指しているかどうかを確認するために秒を与えてください。 (私はその間にこれを投票しています) – SARose

+0

ありがとう!私はそれが完全な答えではないことを知っていますが、私はコメントを残すことができず、私はいくつかの情報が誰よりも良かったと思いました。 – kmosdev

+0

サンプルコードを投稿してもらえますか – SARose

関連する問題