如何在Android上的Parse后端链接Google +登录用户?

我已经在我的Android应用程序中使用Parse 3个月了。 现在我想在应用程序中添加电子邮件登录和社交登录(Facebook和Google+)。 我已经成功添加了电子邮件和fb登录,用户可以连接电子邮件或Facebook中的任何一个或其中一个,该应用程序将识别用户。

例如,如果我通过电子邮件登录,然后连接Facebook,使用其他设备上的应用程序,通过Facebook登录,该应用程序将知道它是相同的用户,并将为我自定义,并将显示我的数据。 电子邮件也有效。

我已为Android添加了Google+登录信息,但我无法将用户的Google+凭据与登录用户相关联。

Parse Users表有一个authData字段,它获取facebook auth数据,并将获得Twitter以及这两个登录都被解压缩到Parse SDK中。

什么应该是最好的事情为Google+? 我对数据库设计以及如何连接使用Google+登录的用户感到困惑?

如果用户只是通过Google+登录怎么办? 如何在解析时创建解析用户并对用户进行身份validation?

我对云代码和Android很满意,并且非常感谢某些帮助/说明只是让我朝着正确的方向前进。 我从来没有使用OAuth2和Parse登录电子邮件和社交登录,我认为我不应该进入它。 但是,如果我错了,请告诉我。

谢谢!

更新 :我已经阅读了很多关于解析问题的问题,并且已经多次检查了这个方法(因为我一直认为我在读完之后错过了一些东西)。 检查这个问题 – 我目前处于相同的情况 。

我有:
1.已实施Google+登录。
2.使用GoogltAuthUtil获取访问令牌。

坚持:
3.用户使用Google+登录后如何链接当前已登录的Parse用户?
4.如果Google+是用户的第一个(也是唯一的)登录选项,如何创建新的Parse用户?

这似乎与如何从Android Google令牌创建解析_User帐户类似?

以下是我在该主题中的答案:


1.新用户

流程如下:

  1. 用户授权并获取令牌
  2. 我们使用随机密码创建新用户

您可以使用返回电子邮件的newChooseAccountIntent()方法中的以下代码创建ParseUser。

 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.退回用户

正如我在互联网上研究的那样,这是大多数人坚持的地方。 流程如下:

  1. 用户授权并且应用获取令牌
  2. 我们将此令牌传递给Cloud Code进行validation。 我们需要检查此令牌是否由Google签名,以及它是否适用于我们( android-developers (2013))。
  3. 在validation令牌有效后,您可以使用Parse.Cloud.useMasterKey()方法在Cloud Code中查询用户,并在查询结果上使用getSessionToken()方法返回会话密钥。
  4. 使用会话密钥通过调用becomeInBackground方法将登录状态保存在磁盘上

要validation令牌 ,您可以将Parse.Cloud.httprequest发送到此端点: https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=https://www.googleapis.com/oauth2/v3/tokeninfo?access_token= Parse.Cloud.httprequest https://www.googleapis.com/oauth2/v3/tokeninfo?access_token= 。 这在Google身份文档中有说明。 您将收到如下数据:

 { "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" } 

需要比较的是“aud”,“azp”和“email”,它们被翻译为受众,授权方和电子邮件。

要在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 }); 

注意:请确保您具有以下范围,以便在您检查Cloud Code时显示该电子邮件: https://www.googleapis.com/auth/plus.profile.emails.readhttps://www.googleapis.com/auth/plus.profile.emails.read

对于Parse的问题,有一个问题。 它就在这里,我很确定它可以回答你的问题。

https://parse.com/questions/google-plus

它链接到解析博客,其中有一些解决方法。

它说你可以在ParseUser中添加任何登录信息。 你会做这样的事情:

 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. }); 

另一个你应该看看的网站: https : //parse.com/tutorials/adding-third-party-authentication-to-your-web-app

最后一个是官方的,并有一个示例代码

 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. } } }); } 

为此,我使用了以下代码

  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"); } } }); 

让我知道它是否有帮助,或者你是否使用过其他东西。

尝试这个

 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. } } 

})