¿Cómo crear una cuenta_User de análisis de un token de Google Android?
parse.com oauth-2.0 (1)
He encontrado algunos fragmentos de información útil.
http://blog.parse.com/announcements/bring-your-own-login/ me muestra cómo iniciar sesión en una aplicación de Android una vez que tengo un token de Parse.
Puedo obtener con éxito un token de Google para la cuenta de Google de un teléfono.
https://developers.google.com/android/guides/http-auth
/**
* Gets an authentication token from Google and handles any
* GoogleAuthException that may occur.
*/
protected String fetchToken() throws IOException {
try {
return GoogleAuthUtil.getToken(mActivity, mEmail, mScope);
} catch (UserRecoverableAuthException userRecoverableException) {
// GooglePlayServices.apk is either old, disabled, or not present
// so we need to show the user some UI in the activity to recover.
mActivity.handleGoogleException(userRecoverableException);
} catch (GoogleAuthException fatalException) {
// Some other type of unrecoverable exception has occurred.
// Report and log the error as appropriate for your app.
}
return null;
}
¿Cómo puede hacer que Parse use un token de Google para crear un token de Parse?
Supongo que esto implicará escribir algún código en la nube, pero no tengo claro qué debería hacer ese código en la nube. Creo que necesita crear o encontrar un nuevo _User para el token de Google y devolver el token de Parse.
¿Hay algún ejemplo de Parse Cloud Code de cómo manejar el inicio de sesión / registro de Google Android, o ejemplos de algo más que Faceboook / Twitter?
Nota: esta respuesta no se aplica al servidor de código abierto de Parse, ya que solo utiliza sesiones revocables. Echa un vistazo a parse-server / issues / 1392 para más actualizaciones
Actualización (enero de 2016):
Debe desactivar la sesión revocable para llamar a getSessionToken
en Parse.User
. Vaya a Configuración de la aplicación >> Usuarios >> Desactivar Requiere sesiones revocables . Esto no es nuevo en 2016, pero en el momento de dar una respuesta, el autor no sabía de este cambio.
Me dividiré en 2 casos para facilitar su seguimiento: nuevo usuario y usuario recurrente.
1. Nuevo usuario
El flujo es el siguiente:
- El usuario autoriza y se adquiere un token
- Creamos un nuevo usuario con una contraseña aleatoria
Puede crear un ParseUser usando el siguiente código dentro del método newChooseAccountIntent()
que devuelve el correo electrónico.
ParseUser user = new ParseUser();
user.setUsername(mEmail);
user.setPassword(randomPassword);
user.setEmail(mEmail);
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
// Hooray! Let them use the app now.
} else {
// Sign up didn''t succeed. Look at the ParseException
// to figure out what went wrong
}
}
});
2. Usuario recurrente
Aquí es donde la mayoría de las personas se estancó, ya que investigué a través de Internet. El flujo es el siguiente:
- El usuario autoriza y la aplicación recibe un token
- Pasamos este token a Cloud Code para validarlo. Necesitamos comprobar si este token está firmado por Google y si es para nosotros ( android-developers (2013)).
- Después de que pueda verificar que el token sea válido, puede consultar al usuario en Cloud Code utilizando el método
Parse.Cloud.useMasterKey()
y devolver la clave de sesión utilizando el métodogetSessionToken()
en el resultado de la consulta. - Use la clave de sesión para guardar el estado de inicio de sesión en el disco llamando
becomeInBackground
métodobecomeInBackground
Para validar el token , puede enviar Parse.Cloud.httprequest
a este punto final: https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=
. Esto se instruye en la Documentación de identidad de Google . Recibirás datos de la siguiente manera:
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"email": "[email protected]",
"at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
"email_verified": "true",
"aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"iat": "1433978353",
"exp": "1433981953"
}
Las cosas que se deben comparar son "aud", "azp" y "email", que se traducen como audiencia, parte autorizada y correo electrónico.
Para consultar al usuario actual en Cloud Code :
var query = new Parse.Query(Parse.User);
query.equalTo("email",mEmail);
query.first({
success: function(user) {
// Use user..getSessionToken() to get a session token
},
error: function(user, error) {
//
},
useMasterKey: true
});
Nota: asegúrese de tener el siguiente alcance para que el correo electrónico se muestre cuando revise el código de la nube: https://www.googleapis.com/auth/plus.profile.emails.read