android - servidor - hosting para aplicaciones moviles
¿Cómo vincular a los usuarios que iniciaron sesión en Google+en el back-end de Parse en Android? (5)
Esto parece ser similar a Cómo crear una cuenta _User de análisis de un token de Google Android?
A continuación está mi respuesta en ese hilo:
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 alcance siguiente 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
He estado usando Parse durante 3 meses en mi aplicación de Android. Ahora quiero agregar el inicio de sesión de correo electrónico y los inicios de sesión sociales (Facebook y Google+) en la aplicación. He agregado con éxito el correo electrónico y el inicio de sesión de fb y el usuario puede conectar ambos o uno de correo electrónico o de Facebook y la aplicación reconocerá al usuario.
Por ejemplo, si inicio sesión por correo electrónico, conecto Facebook, uso la aplicación en otro dispositivo, inicio de sesión a través de Facebook, la aplicación sabría que es el mismo usuario y se personalizaría para mí y mostraría mis datos. Y el correo electrónico también funciona.
Agregué el inicio de sesión de Google+ para Android, pero no puedo conectar las credenciales de Google+ del usuario con el usuario que inició sesión.
La tabla Parse Users tiene un campo authData que obtiene los datos de autenticación de Facebook y recibe Twitter, así como ambos inicios de sesión se integran en los SDK de Parse.
¿Qué debería ser lo mejor para hacer en Google+? ¿Estoy confundido acerca del diseño de db y cómo conectar al usuario que inició sesión con Google+?
¿Qué pasa si el usuario simplemente inicia sesión a través de Google+? ¿Cómo hago un usuario de Parse y autentico al usuario en Parse?
Me siento cómodo con el código de la nube y Android, y realmente apreciaría algún tipo de ayuda / instrucciones simplemente empujándome en la dirección correcta. Nunca he usado OAuth2 y con el inicio de sesión de Parse para el correo electrónico y los inicios de sesión sociales, no creo que deba entrar en ello. Pero avísame si me equivoco.
¡Gracias!
Actualización : He leído muchas preguntas sobre Parse Questions y he comprobado el método become muchas veces (porque seguí pensando que me estaba perdiendo algo después de leer eso). Verifique esta pregunta: actualmente estoy en la misma situación .
Yo tengo:
1. Implementé el inicio de sesión de Google+.
2. Obtuvo token de acceso usando GoogltAuthUtil.
Atorado con:
3. ¿Cómo vincular al usuario de Parse que está actualmente registrado después de que el usuario inicia sesión en Google+?
4. ¿Cómo crear un nuevo usuario de Parse si Google+ fue la primera (y única) opción de inicio de sesión del usuario?
Hay una pregunta sobre esto en las preguntas de Parse. Está justo aquí y estoy bastante seguro de que responde tus preguntas.
https://parse.com/questions/google-plus
Se vincula al blog de análisis, que tiene algunas soluciones para esto.
Dice que puede agregar cualquier inicio de sesión en ParseUser. Estarías haciendo algo como esto:
Parse.User.become("session-token-here").then(function (user) {
// The current user is now set to user.
}, function (error) {
// The token could not be validated.
});
Otro sitio donde debe echar un vistazo: https://parse.com/tutorials/adding-third-party-authentication-to-your-web-app
Este último es oficial y tiene un código de ejemplo
Para hacerlo, he usado el siguiente código
ParseUser.becomeInBackground(ParseUser.getCurrentUser().getSessionToken(), new LogInCallback() {
@Override
public void done(ParseUser parseUser, ParseException e) {
if (parseUser != null) {
parseUser.setUsername(userEmail);
//firstName and lastName I am getting from Person class of google plus api
parseUser.put("FirstName", firstName);
parseUser.put("LastName", lastName);
parseUser.saveInBackground();
ParseUtils.verifyParseConfiguration(context);
ParseUtils.subscribeWithUsername(strEmail);
Intent successIntent = new Intent(context, OurServicesActivity.class);
startActivity(successIntent);
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
finish();
} else {
Log.e(TAG, e.getMessage());
Utilities.showToast(context, "Something occurred");
}
}
});
Avísame si te sirve o si has usado algo más.
Prueba esto
ParseUser.becomeInBackground("session-token-here", new LogInCallback() {
public void done(ParseUser user, ParseException e) {
if (user != null) {
// The current user is now set to user.
} else {
// The token could not be validated.
}
}
})
void createNewGPlusUser(final String email, String name) {
final ParseUser user = new ParseUser();
user.setUsername(email);
user.setPassword("my pass");
user.put("any other variable in User class", "value");
user.setEmail(email);
user.put("name", name);
signInParseUser(user, email);
}
void signInParseUser(final ParseUser user, final String email) {
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
Log.d("TAG", "Created user");
// Hooray! Let them use the app now.
login(email);
} else {
Log.d("TAG", "Failed Creating user");
e.printStackTrace();
// Sign up didn''t succeed. Look at the ParseException
// to figure out what went wrong
}
}
});
}
void login(final String email) {
ParseUser.logInInBackground(email, "my pass", new LogInCallback() {
public void done(ParseUser user, ParseException e) {
if (user != null) {
// Hooray! The user is logged in.
Log.d("TAG", "Login successful");
} else {
// Signup failed. Look at the ParseException to see what happened.
}
}
});
}