web-dev-qa-db-ja.com

requestIdTokenがnullを返すのはなぜですか?

このリンクの手順の下 に従いました

  1. Google-services.jsonをアプリフォルダーにダウンロードしました。
  2. 私のプロジェクトレベルのgradleファイル:

    dependencies {
        classpath 'com.Android.tools.build:gradle:1.3.0'
        classpath 'com.google.gms:google-services:1.5.0-beta2'
    }
    
  3. 私のアプリレベルのgradleファイル:

    apply plugin: 'com.Android.application'
    apply plugin: 'com.google.gms.google-services'
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.google.Android.gms:play-services-identity:8.3.0'
        compile 'com.google.Android.gms:play-services:8.3.0'
        compile 'com.google.Android.gms:play-services-plus:8.3.0'
        compile 'com.google.Android.gms:play-services-auth:8.3.0'
        ...
    }
    
  4. バックエンドサーバー用にOAuth 2.0クライアントIDを作成し、このクライアントIDをstrings.xmlファイルに渡します。

  5. そして最後に、以下のようにGoogleSignInOptionsおよびGoogleApiClientオブジェクトを作成しました。

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(getString(R.string.server_client_id))
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    

    しかし、問題はresult.isSuccess()がhandleSignInResult関数で常にfalseを返すことです。私は多分私は第1または第2ステップで何かを間違ってやっていると思っています。そして、私のコードはこれにほとんど似ています SignInActivity.Java 。任意の助けをいただければ幸いです。

22
melomg

私は次の質問で答えたように:

GoogleサインインrequestIdTokenはnullを返します

Idトークンを正常にリクエストするには、「Android」タイプのクライアントIDではなく、「Webアプリケーション」タイプのクライアントIDを使用する必要があります。

Googleのドキュメント には、次の情報もあります(注3を参照してください)。

バックエンドサーバーのOAuth 2.0クライアントIDを作成します

アプリがバックエンドサーバーで認証するか、バックエンドサーバーからGoogle APIにアクセスする場合は、サーバーのOAuth 2.0クライアントIDを作成する必要があります。OAuth = 2.0クライアントID:

  1. 資格情報ページを開きます。
  2. [資格情報の追加]> OAuth 2.0クライアントID。
  3. Webアプリケーションを選択します。
  4. 作成をクリックします。

このクライアントIDをrequestIdTokenまたはrequestServerAuthCodeメソッド。GoogleSignInOptionsオブジェクトを作成します。


3月26日更新:

Android Developers Blog-登録OAuth Googleサインインのクライアント

39
BNK

私の場合、previouslがありました y、

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

RequestTokenメソッドを追加して修正し、

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(getString(R.string.default_web_client_id))
            .build();

今私のために働いています。うまくいけば、これは私のような問題を抱えている誰かを助けることができます。

18
yubaraj poudel

requestServerAuthCodeメソッドを「WebApplication ClientID」とともに使用し、以下のようにアクセストークンを取得するメソッドを作成できます。

 new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)

                    .requestServerAuthCode("WEBAPPLICATION CLIENT ID")

                    .requestEmail()

                    .build())

ご覧のとおり、WEBAPPLICATION CLIENT IDが必要です https://console.developers.google.com ;

次のようにWebアプリケーションクライアントIDを取得

void fetchGoogleAuthToken(){

    OkHttpClient okHttpclient = new OkHttpClient();
    RequestBody requestBody = new FormEncodingBuilder()
            .add("grant_type", "authorization_code")
            .add("client_id", "812741506391-
              h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com")
            .add("client_secret", "{clientSecret}")
            .add("redirect_uri","")
            .add("code", "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8")
            .build();

    final Request request = new Request.Builder()
            .url("https://www.googleapis.com/oauth2/v4/token")
            .post(requestBody)
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(final Request request, final IOException e) {
            Log.e(LOG_TAG, e.toString());                
        }

        @Override
        public void onResponse(Response response) throws IOException {
            try {
                JSONObject jsonObject = new 
                             JSONObject(response.body().string());
                final String message = jsonObject.toString(5);
                Log.i(LOG_TAG, message);                    
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
}

Compile 'com.squareup.okhttp:okhttp:2.6.0'(ver 3-RC1は異なるクラスを持つ)を使用するか、ネットワークフレームワークを使用して上記の呼び出しを行うことができます。

正常に応答すると、log-catに次の情報が表示されます。

I/onResponse: {
          "expires_in": 3600,

          "token_type": "Bearer",

          "refresh_token": "1\/xz1eb0XU3....nxoALEVQ",

          "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxMWY1Ym......yWVsUA",

     **"access_token": "ya29.bQKKYah-........_tkt980_qAGIo9yeWEG4"**
     }

見られるように、acces_tokenはさらに使用できます。

1
coder-at-risk

私は同じ問題に直面していました。 google-services.jsonファイルを再度ダウンロードし、古いファイルを置き換えるだけで機能しました。これがなぜ起こったのかわからない、私の推測は何かが変わった、そして上書きする前に私は比較するのを忘れていた。

0
Doilio Matsinhe