web-dev-qa-db-fra.com

pourquoi requestIdToken renvoie null?

J'ai suivi ci-dessous les étapes de ce lien

  1. J'ai téléchargé google-services.json dans mon dossier d'application.
  2. Mon fichier de notes au niveau du projet:

    dependencies {
        classpath 'com.Android.tools.build:gradle:1.3.0'
        classpath 'com.google.gms:google-services:1.5.0-beta2'
    }
    
  3. Mon fichier de notes au niveau de l'application:

    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. J'ai créé OAuth 2.0 ID client pour mon serveur principal et passer cet ID client au fichier strings.xml.

  5. Et enfin, j'ai créé les objets GoogleSignInOptions et GoogleApiClient comme ci-dessous:

    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();
    

    Mais le problème est result.isSuccess () renvoie toujours false dans la fonction handleSignInResult. Je pense que je fais peut-être quelque chose de mal à la 1e ou à la 2e étape. Et mes codes sont presque similaires à cela SignInActivity.Java . Toute aide serait appréciée.

22
melomg

Comme je l'ai répondu à la question suivante:

Google Sign-In requestIdToken renvoie null

Afin de demander le jeton d'identification avec succès, vous devez utiliser un ID client de type "Application Web", au lieu d'un ID client de type "Android".

Vous trouverez également sur documentation de Google , les informations suivantes (veuillez noter # 3):

Créez un OAuth 2.0 ID client pour votre serveur principal

Si votre application s'authentifie auprès d'un serveur principal ou accède aux API Google à partir de votre serveur principal, vous devez créer un ID client OAuth 2.0 pour votre serveur. Pour créer un OAuth = ID client 2.0:

  1. Ouvrez la page Informations d'identification.
  2. Cliquez sur Ajouter des informations d'identification> OAuth 2.0 ID client.
  3. Sélectionnez Application Web .
  4. Cliquez sur Créer.

Passez cet ID client au requestIdToken ou requestServerAuthCode méthode lorsque vous créez l'objet GoogleSignInOptions.


Mise à jour du 26 mars:

Blog des développeurs Android - Enregistrement de OAuth pour la connexion à Google

39
BNK

Dans mon cas, j'avais précédent y,

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

Je l'ai corrigé en ajoutant l'ajout de la méthode requestToken,

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

Maintenant ça marche pour moi. J'espère que cela peut aider quelqu'un qui a des problèmes comme moi.

18
yubaraj poudel

Nous pouvons utiliser la méthode requestServerAuthCode avec le "WebApplication ClientID" et créer une méthode pour récupérer le jeton d'accès comme ci-dessous;

 new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)

                    .requestServerAuthCode("WEBAPPLICATION CLIENT ID")

                    .requestEmail()

                    .build())

Comme nous l'avons vu, nous avons besoin d'un ID CLIENT WEBAPPLICATION que nous pouvons obtenir auprès de https://console.developers.google.com ;

obtenez l'ID du client d'application Web comme suit

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();
            }
        }
    });
}

Veuillez utiliser la compilation 'com.squareup.okhttp: okhttp: 2.6.0' (le ver 3-RC1 aura différentes classes) ou vous pouvez utiliser n'importe quel framework réseau pour effectuer l'appel ci-dessus

Avec une réponse réussie, vous aurez les informations suivantes dans 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"**
     }

comme on le voit, le acces_token est disponible pour une utilisation ultérieure.

1
coder-at-risk

J'étais confronté au même problème. Tout ce que j'ai fait, c'est simplement télécharger à nouveau le fichier google-services.json, remplacer l'ancien et cela a fonctionné. Je ne sais pas pourquoi cela s'est produit, je suppose que quelque chose a changé, et avant d'écraser, j'ai oublié de comparer.

0
Doilio Matsinhe