google - oauth 2.0 android studio
GoogleAuthUtil.getToken devuelve un código de autenticación no válido (3)
Como puede ver en Validar la documentación del token :
googleapis.com/oauth2/v1/tokeninfo
Acepta un token de acceso y devuelve información sobre ese token de acceso, incluida la aplicación a la que se emitió, el destino deseado del token, los ámbitos a los que el usuario accedió, la vida útil restante del token y la ID de usuario.
A continuación se muestra un ejemplo de dicha solicitud:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg
El punto final de TokenInfo responderá con una matriz JSON que describe el token o un error.
En el cable, la respuesta es similar a la siguiente:
{ "audience":"8819981768.apps.googleusercontent.com", "user_id":"123456789", "scope":"profile email", "expires_in":436 }
Si el token ha caducado, ha sido manipulado o se han revocado los permisos, el servidor de autorización de Google responderá con un error. El error aparece como un código de estado 400 y un cuerpo JSON de la siguiente manera:
{"error":"invalid_token"}
Por diseño, no se proporciona información adicional sobre el motivo del fallo.
Así que invalid_token
es una respuesta válida cuando el token ha caducado, ha sido manipulado o se han revocado los permisos.
EDITAR
Es posible recibir invalid_token
justo después de que invalid_token
el token porque GoogleAuthUtil puede haberlo almacenado en caché. En este caso, debe llamar a GoogleAuthUtil.invalidateToken
.
Puede encontrar más información aquí: http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html
Editar 2
Acabo de notar que le falta https://www.googleapis.com/auth/plus.login en su alcance. Por favor, intente agregarlo porque parece obligatorio usar Identidad de cliente cruzado.
Uso lo siguiente para obtener una autenticación a la que puedo acceder desde un backend desde una aplicación de Android. Esto se describe aquí https://developers.google.com/identity/protocols/CrossClientAuth .
StringBuffer sb = new StringBuffer();
sb.append("oauth2:server:client_id:");
sb.append(getString(R.string.google_app_id));
sb.append(":api_scope:");
sb.append("profile email");
final String scope = sb.toString();
String token = GoogleAuthUtil.getToken(Activity.this, mAuthAccount, scope);
(mAuthAccount se configuró previamente con AccountPicker.newChooseAccountIntent).
Lo anterior devuelve un código de autenticación de corta duración que a veces ha caducado. Me gustaría compararlo con los servidores de Google, pero llamar a https://www.googleapis.com/oauth2/v1/tokeninfo?access_token= con la cadena de token devuelta por GoogleAuthUtil.getToken devuelve "token no válido".
¿Cómo verifico que el código de autenticación no haya caducado antes de intentar usarlo?
Edición: la cadena devuelta no es un token, sino un código de autorización que puede intercambiarse con una API de Google para obtener un token (la cadena devuelta comienza con "/ 4" y no "/ 1" o "/ 2" si recuerdo correctamente).
El código no siempre funciona (en mi servidor) y me encantaría poder verificar si el código puede usarse o si ha caducado.
El token recuperado por GoogleAuthUtil.getToken()
de esta manera no es un token de acceso, es un token de ID.
Pruebe la siguiente URL en su lugar (tenga en id_token
parámetro de consulta id_token
lugar de access_token
):
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=<ID TOKEN>
No es necesario usar app_id
para obtener un token o un touth, solo necesita cambiar el alcance
"oauth2:" + Scopes.PLUS_LOGIN
En este caso su alcance puede ser plus.login.
Más información: