log - googlesigninoptions android example
¿Por qué requestIdToken vuelve nulo? (3)
Como he respondido en la siguiente pregunta:
Para solicitar el Id Token correctamente, debe utilizar una identificación de cliente de tipo "aplicación web", en lugar de una identificación de cliente de tipo "Android".
También encontrará en la documentación de Google , la siguiente información (tenga en cuenta el número 3):
Cree un ID de cliente OAuth 2.0 para su servidor backend
Si su aplicación se autentica con un servidor backend o accede a las API de Google desde su servidor backend, debe crear una ID de cliente OAuth 2.0 para su servidor. Para crear un ID de cliente OAuth 2.0:
- Abra la página de Credenciales.
- Haga clic en Agregar credenciales> ID de cliente de OAuth 2.0.
- Seleccione la aplicación web .
- Haga clic en Crear.
Pase este ID de cliente al método requestIdToken o requestServerAuthCode cuando cree el objeto GoogleSignInOptions.
Actualización 26 de marzo:
Blog de desarrolladores de Android: registro de clientes de OAuth para el inicio de sesión de Google
He seguido los siguientes pasos como este enlace.
- Descargué google-services.json a mi carpeta de aplicaciones.
Mi archivo de nivel de proyecto:
dependencies { classpath ''com.android.tools.build:gradle:1.3.0'' classpath ''com.google.gms:google-services:1.5.0-beta2'' }
Mi archivo gradle nivel de aplicación:
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'' ... }
Creé el ID de cliente OAuth 2.0 para mi servidor backend y pasé este ID de cliente al archivo strings.xml.
Y finalmente creé los objetos GoogleSignInOptions y GoogleApiClient como se muestra a continuación:
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();
Pero el problema es result.isSuccess () siempre devuelve falso en la función handleSignInResult. Estoy pensando que tal vez estoy haciendo algunas cosas mal en el primer o segundo paso. Y mis códigos son casi similares a este SignInActivity.java . Cualquier ayuda sería apreciada.
Podemos usar el método requestServerAuthCode con el "WebApplication ClientID" y crear un método para obtener el token de acceso como se muestra a continuación;
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestServerAuthCode("WEBAPPLICATION CLIENT ID")
.requestEmail()
.build())
Como hemos visto, necesitamos un ID de CLIENTE DE WEBAPPLICACIÓN que podemos obtener de https://console.developers.google.com ;
obtener la identificación del cliente de la aplicación web de la siguiente manera
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();
}
}
});
}
Utilice compile ''com.squareup.okhttp: okhttp: 2.6.0'' (la versión 3-RC1 tendrá clases diferentes) o puede usar cualquier marco de red para hacer la llamada anterior
Con una respuesta exitosa, tendrá la siguiente información en 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"**
}
Como se ve, acces_token está disponible para su uso posterior.
En mi caso tuve anterioridad ,
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
Lo arreglé agregando el método requestToken,
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken(getString(R.string.default_web_client_id))
.build();
Ahora está funcionando para mí. Espero que esto pueda ayudar a alguien que tiene problemas como yo.