web-dev-qa-db-fra.com

Exemple Java comment se connecter avec un compte Facebook sur GAE en utilisant OAuth

Je cherchais beaucoup, lisais de nombreux blogs, articles, tutoriels, mais je n’avais pas jusqu’à présent un exemple concret que je pouvais utiliser avec un compte dans ma tête pour me connecter à mon application.

Je sais que je dois utiliser OAuth, obtenir des jetons, des autorisations, etc.

Tout le monde peut partager un exemple? (sur GAE/Java)

39
LeandroRezende

Voici comment je le fais sur App Engine:

Étape 1) Enregistrez une "application" sur Facebook (cf. https://developers.facebook.com/ ). Vous donnez à Facebook un nom pour l'application et une URL. L'URL que vous enregistrez est l'URL de la page (jsp ou servlet) que vous souhaitez gérer la connexion. À partir de l'inscription, vous obtenez deux chaînes, un "identifiant d'application" et un "secret d'application" (ce dernier étant votre mot de passe, ne le donnez pas et ne l'écrivez pas en html).

Pour cet exemple, supposons que l'URL que j'enregistre soit " http://myappengineappid.appspot.com/signin_fb.do ".

2) À partir d'une page Web, par exemple avec un bouton, vous redirigez l'utilisateur vers l'URL suivante sur Facebook, en substituant l'identifiant de votre application à "myfacebookappid" dans l'exemple ci-dessous. Vous devez également choisir les autorisations (ou "étendues") que vous souhaitez demander à l'utilisateur (cf. https://developers.facebook.com/docs/reference/api/permissions/ ). Dans l'exemple, je demande uniquement l'accès au courrier électronique de l'utilisateur.

(Une chose utile à savoir est que vous pouvez également transmettre une chaîne facultative qui sera renvoyée inchangée dans le paramètre "state". Par exemple, je passe la clé du magasin de données de l'utilisateur, afin que je puisse récupérer l'utilisateur lorsque Facebook renvoie la clé. pour moi, je ne fais pas cela dans l'exemple.)

Voici un extrait de code jsp:

<%@page import="Java.net.URLEncoder" %>
<%
    String fbURL = "http://www.facebook.com/dialog/oauth?client_id=myfacebookappid&redirect_uri=" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do") + "&scope=email";
%>

<a href="<%= fbURL %>"><img src="/img/facebook.png" border="0" /></a>

3) Votre utilisateur sera transféré sur Facebook et invité à approuver les autorisations demandées. Ensuite, l'utilisateur sera redirigé vers l'URL que vous avez enregistrée. Dans cet exemple, il s'agit de " http://myappengineappid.appspot.com/signin_fb.do " qui, dans mon fichier web.xml, est mappé sur le servlet suivant:

import org.json.JSONObject;
import org.json.JSONException;

import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import Java.io.IOException;

import Java.net.URL;
import Java.net.URLConnection;
import Java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SignInFB extends HttpServlet {

    public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {            
        String code = req.getParameter("code");
        if (code == null || code.equals("")) {
            // an error occurred, handle this
        }

        String token = null;
        try {
            String g = "https://graph.facebook.com/oauth/access_token?client_id=myfacebookappid&redirect_uri=" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do", "UTF-8") + "&client_secret=myfacebookappsecret&code=" + code;
            URL u = new URL(g);
            URLConnection c = u.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
            String inputLine;
            StringBuffer b = new StringBuffer();
            while ((inputLine = in.readLine()) != null)
                b.append(inputLine + "\n");            
            in.close();
            token = b.toString();
            if (token.startsWith("{"))
                throw new Exception("error on requesting token: " + token + " with code: " + code);
        } catch (Exception e) {
                // an error occurred, handle this
        }

        String graph = null;
        try {
            String g = "https://graph.facebook.com/me?" + token;
            URL u = new URL(g);
            URLConnection c = u.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
            String inputLine;
            StringBuffer b = new StringBuffer();
            while ((inputLine = in.readLine()) != null)
                b.append(inputLine + "\n");            
            in.close();
            graph = b.toString();
        } catch (Exception e) {
                // an error occurred, handle this
        }

        String facebookId;
        String firstName;
        String middleNames;
        String lastName;
        String email;
        Gender gender;
        try {
            JSONObject json = new JSONObject(graph);
            facebookId = json.getString("id");
            firstName = json.getString("first_name");
            if (json.has("middle_name"))
               middleNames = json.getString("middle_name");
            else
                middleNames = null;
            if (middleNames != null && middleNames.equals(""))
                middleNames = null;
            lastName = json.getString("last_name");
            email = json.getString("email");
            if (json.has("gender")) {
                String g = json.getString("gender");
                if (g.equalsIgnoreCase("female"))
                    gender = Gender.FEMALE;
                else if (g.equalsIgnoreCase("male"))
                    gender = Gender.MALE;
                else
                    gender = Gender.UNKNOWN;
            } else {
                gender = Gender.UNKNOWN;
            }
        } catch (JSONException e) {
            // an error occurred, handle this
        }

        ...

J'ai supprimé le code de traitement des erreurs, car vous voudrez peut-être le traiter différemment que moi. (En outre, "Genre" est bien sûr une classe que j'ai définie.) À ce stade, vous pouvez utiliser les données pour tout ce que vous voulez, comme pour enregistrer un nouvel utilisateur ou rechercher un utilisateur existant pour vous connecter. Notez que le " La chaîne "myfacebookappsecret" doit bien sûr être le secret de votre application sur Facebook.

Vous aurez besoin du paquet "org.json" pour utiliser ce code, que vous pouvez trouver à l’adresse: http://json.org/Java/ (il suffit de prendre les fichiers .Java et de les ajouter à votre code dans une la structure du dossier org/json).

J'espère que ça aide. Si quelque chose n'est pas clair, veuillez commenter et je mettrai à jour la réponse.

Ex animo, - Alexander.

****METTRE À JOUR****

Je veux ajouter quelques informations, je vous prie de m'excuser si cela semble un peu excessif.

Pour pouvoir connecter un utilisateur via son compte Facebook, vous devez savoir quel utilisateur du magasin de données dont nous parlons. S'il s'agit d'un nouvel utilisateur, créez un nouvel objet utilisateur (avec un champ appelé "facebookId", ou appelez-le comme vous le souhaitez, dont la valeur provient de Facebook), conservez-le dans le magasin de données et connectez-vous à l'utilisateur.

Si l'utilisateur existe, vous devez avoir le champ avec facebookId. Lorsque l'utilisateur est redirigé depuis Facebook, vous pouvez récupérer le facebookId et consulter le magasin de données pour trouver l'utilisateur auquel vous souhaitez vous connecter.

Si vous avez déjà des utilisateurs, vous devrez les laisser se connecter comme vous le faites habituellement pour les connaître, puis les envoyer à Facebook, récupérer le facebookId et mettre à jour leur objet utilisateur. De cette façon, ils peuvent se connecter en utilisant Facebook la prochaine fois.

Autre petite remarque: un écran sur Facebook sera présenté à l'utilisateur pour lui permettre d'accéder à toutes les portées que vous demandez, il n'y a aucun moyen de les éviter (moins vous demandez de portées, moins elles semblent intrusives). Cependant, cela ne se produit que la première fois qu'un utilisateur est redirigé (à moins que vous ne demandiez plus d'étendues plus tard, il vous redemandera).

52
yngling

Vous pouvez essayer face4j https://github.com/nischal/face4j/wiki . Nous l'avons utilisé dans notre produit http://grabinbox.com et en avons fait appel à des sources ouvertes. Cela fonctionne bien sur GAE.

Il existe un exemple sur le wiki qui devrait vous aider à intégrer la connexion à Facebook en quelques minutes.

face4j utilise oAuth 2.0 et l'API graphique de Facebook.

6
Nischal

J'ai eu beaucoup de difficulté à essayer de mettre en place la signature OAuth. J'ai passé beaucoup de temps à essayer de résoudre un problème alors que mes jetons n'étaient pas autorisés, ce qui est apparemment un problème courant. Malheureusement, aucune des solutions ne fonctionnant pour moi, je me suis donc contenté d'utiliser Scribe , une bibliothèque astucieuse Java OAuth qui offre l'avantage supplémentaire de prendre en charge d'autres fournisseurs que Facebook (par exemple Google, Twitter, etc.).

3
Pixel Elephant
1
Peter Knego

Vérifiez les API Java de Facebook. 

Autres exemples: http://code.google.com/p/facebook-Java-api/wiki/Exemples

0
Adrian