J'ai suivi ci-dessous les étapes de ce lien
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'
}
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'
...
}
J'ai créé OAuth 2.0 ID client pour mon serveur principal et passer cet ID client au fichier strings.xml.
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.
Comme je l'ai répondu à la question suivante:
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:
- Ouvrez la page Informations d'identification.
- Cliquez sur Ajouter des informations d'identification> OAuth 2.0 ID client.
- Sélectionnez Application Web .
- 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
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.
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.
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.