How To Link Google + Signed In Users On Parse Backend On Android?
Solution 1:
This seems to be similar with How to create a parse _User account from a Android Google token?
Following is my answer in that thread:
1. New User
The flow is as below:
- User authorizes and a token is acquired
- We create a new user with a random password
You can create a ParseUser using following code inside the newChooseAccountIntent()
method that return email.
ParseUseruser=newParseUser();
user.setUsername(mEmail);
user.setPassword(randomPassword);
user.setEmail(mEmail);
user.signUpInBackground(newSignUpCallback() {
publicvoiddone(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. Returning User
This is the where most of people stuck, as I researched over the Internet. The flow is as below:
- User authorizes and the app gets a token
- We pass this token to Cloud Code to validate. We need to check if this token is signed by Google and if it is meant for us (android-developers (2013)).
- After you can verify that the token is valid, you can query for the user in Cloud Code using
Parse.Cloud.useMasterKey()
method and return the session key by usinggetSessionToken()
method on the query result. - Use the session key to save login state on disk by calling
becomeInBackground
method
To validate the token, you can send Parse.Cloud.httprequest
to this endpoint: https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=
. This is instructed in Google Identity Documentation. You will receive data as below:
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"email": "billd1600@gmail.com",
"at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
"email_verified": "true",
"aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"iat": "1433978353",
"exp": "1433981953"
}
Things need to compare are "aud", "azp" and "email" which are translated as audience, authorized party and email.
To query for the current user on Cloud Code:
var query = newParse.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
});
Note: Make sure you have following scope so that the email will show up when you check on Cloud Code: https://www.googleapis.com/auth/plus.profile.emails.read
Solution 2:
There's a question about this on Parse's questions. It's right here and I'm pretty sure it answers your questions.
https://parse.com/questions/google-plus
It links to the parse blog, that has some workarounds on this.
It says that you can add any login into ParseUser. You would be doing something like this:
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.
});
Another site where you should take a look: https://parse.com/tutorials/adding-third-party-authentication-to-your-web-app
This last one is official and has an example code
Solution 3:
voidcreateNewGPlusUser(final String email, String name) {
final ParseUser user = newParseUser();
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);
}
voidsignInParseUser(final ParseUser user, final String email) {
user.signUpInBackground(newSignUpCallback() {
publicvoiddone(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
}
}
});
}
voidlogin(final String email) {
ParseUser.logInInBackground(email, "my pass", newLogInCallback() {
publicvoiddone(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.
}
}
});
}
Solution 4:
To do so, I have used the following code
ParseUser.becomeInBackground(ParseUser.getCurrentUser().getSessionToken(), newLogInCallback() {
@Overridepublicvoiddone(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);
IntentsuccessIntent=newIntent(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");
}
}
});
Let me know if it helps or if you have used something else.
Solution 5:
Try this
ParseUser.becomeInBackground("session-token-here", newLogInCallback() {
publicvoiddone(ParseUser user, ParseException e) {
if (user != null) {
// The current user is now set to user.
} else {
// The token could not be validated.
}
}
})
Post a Comment for "How To Link Google + Signed In Users On Parse Backend On Android?"