web-dev-qa-db-fra.com

Comment lier les utilisateurs connectés de Google + sur Parse Backend sous Android?

J'utilise Parse depuis 3 mois dans mon application Android. Maintenant, je veux ajouter un identifiant de connexion et des identifiants sociaux (Facebook et Google+) dans l'application. J'ai ajouté avec succès un e-mail et un identifiant de connexion fb. L'utilisateur peut connecter les deux, l'un ou l'autre, par e-mail ou Facebook, et l'application reconnaîtra l'utilisateur.

par exemple. Si je me connecte par e-mail, connecte ensuite facebook, utilise l'application sur un autre appareil, connecte-toi via facebook, l'application saura que c'est le même utilisateur, qu'elle sera personnalisée pour moi et affichera mes données. Et le courrier électronique fonctionne également.

J'ai ajouté connexion Google+ pour Android mais je ne parviens pas à connecter les informations d'identification Google+ de l'utilisateur à l'utilisateur connecté.

La table Parse Users contient un champ authData qui récupère les données d'authentification de Facebook et Twitter ainsi que ces deux identifiants sont intégrés dans les kits de développement Parse.

Quelle devrait être la meilleure chose à faire pour Google+? La conception de la base de données me laisse perplexe, ainsi que la connexion de l'utilisateur qui s'est connecté à Google+?

Que se passe-t-il si l'utilisateur se connecte simplement via Google+? Comment créer un utilisateur Parse et l'authentifier sur Parse?

Je suis à l'aise avec le code de nuage et Android et apprécierais vraiment une sorte d'aide/d'instructions qui me pousserait dans la bonne direction. Je n'ai jamais utilisé OAuth2 et avec le login Parse pour le courrier électronique et les identifiants sociaux, je ne pense pas que je devrais y entrer. Mais laissez-moi savoir si je me trompe.

Merci!

Update : J'ai lu beaucoup de questions sur Parse Questions et j'ai vérifié la méthode devenue maintes fois (parce que je pensais qu'il me manquait quelque chose après l'avoir lu). Cochez cette question - Je suis actuellement dans la même situation .

J'ai:
1. Connexion Google+ implémentée.
2. J'ai obtenu un jeton d'accès à l'aide de GoogltAuthUtil.

Coincé avec:
3. Comment lier l'utilisateur actuellement connecté, après avoir ouvert une session avec Google+?
4. Comment créer un nouvel utilisateur d'analyse si Google+ était le premier (et unique) choix de connexion de l'utilisateur?

22
Rahul Sainani

Cela semble être similaire avec Comment créer un compte parse _User à partir d'un jeton Google Google?

Voici ma réponse dans ce fil:


1. Nouvel utilisateur

Le flux est comme ci-dessous:

  1. L'utilisateur autorise et un jeton est acquis
  2. Nous créons un nouvel utilisateur avec un mot de passe aléatoire

Vous pouvez créer un utilisateur ParseUser en utilisant le code suivant dans la méthode newChooseAccountIntent() qui renvoie un courrier électronique. 

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. Utilisateur de retour

C’est là que la plupart des gens sont restés bloqués, comme j’ai effectué des recherches sur Internet. Le flux est comme ci-dessous:

  1. L'utilisateur autorise et l'application reçoit un jeton
  2. Nous passons ce jeton à Cloud Code pour le valider. Nous devons vérifier si ce jeton est signé par Google et s'il nous est destiné ( Android-developers (2013)).
  3. Une fois que vous pouvez vérifier que le jeton est valide, vous pouvez interroger l'utilisateur dans Cloud Code à l'aide de la méthode Parse.Cloud.useMasterKey() et renvoyer la clé de session à l'aide de la méthode getSessionToken() sur le résultat de la requête.
  4. Utilisez la clé de session pour enregistrer l'état de connexion sur le disque en appelant la méthode becomeInBackground

Pour valider le jeton , vous pouvez envoyer Parse.Cloud.httprequest à ce noeud final: https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=. Ceci est indiqué dans Documentation Google Identity . Vous recevrez les données ci-dessous:

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

Les éléments à comparer sont "aud", "azp" et "email", qui sont traduits en audience, soirée autorisée et email.

Pour interroger l'utilisateur actuel sur 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
});

Remarque: Assurez-vous que vous avez la portée suivante pour que l'e-mail apparaisse lorsque vous vérifiez le code Cloud: https://www.googleapis.com/auth/plus.profile.emails.read

7
Ralphilius

Il y a une question à ce sujet sur les questions de Parse. C'est juste ici et je suis à peu près sûr que cela répond à vos questions.

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

Il est lié au blog d'analyse, qui propose des solutions de contournement.

Il dit que vous pouvez ajouter n'importe quelle connexion dans ParseUser. Vous feriez quelque chose comme ça: 

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

Un autre site où vous devriez jeter un oeil: https://parse.com/tutorials/adding-third-party-authentication-to-your-web-app

Ce dernier est officiel et a un exemple de code

3
cristianorbs
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.
                }
            }
        });
    }
1
Arun Shankar

Pour ce faire, j'ai utilisé le code suivant 

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

Faites-moi savoir si cela vous aide ou si vous avez utilisé autre chose.

1
Akshay

Essaye ça

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

})

0
Aditya