39 votes

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 jusqu’à présent pas eu d’exemple de travail que je pourrais utiliser pour me connecter à mon compte.

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

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

52voto

yngling Points 486

Voici comment je le fais sur App Engine:

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

Pour cet exemple, disons que l'url que j'ai enregistrer est "http://myappengineappid.appspot.com/signin_fb.do".

2) à Partir d'une page web, avec un bouton, vous rediriger l'utilisateur vers l'url suivante sur Facebook, en remplaçant votre app id "myfacebookappid" dans l'exemple ci-dessous. Vous devez également choisir les autorisations (ou "étendues") vous souhaitez le demander à l'utilisateur (cf. https://developers.facebook.com/docs/reference/api/permissions/ ). Dans l'exemple que j'ai demander l'accès à l'email de l'utilisateur uniquement.

(Une chose utile à savoir est que vous pouvez aussi passer le long d'une chaîne facultative qui sera retourné à l'identique dans le "champ d'application" de paramètre. Par exemple, je passe de l'utilisateur de la banque de données de la clé, donc je peux récupérer l'utilisateur, lors de Facebook passe la touche retour pour moi. Je ne fais pas cela dans l'exemple).

Voici une jsp extrait:

<%@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 transmise à Facebook, et lui demande d'approuver les autorisations que vous demandez. Ensuite, l'utilisateur sera redirigé vers l'url que vous avez enregistré. Dans cet exemple, c'est "http://myappengineappid.appspot.com/signin_fb.do" qui, à mon web.xml les cartes pour la suite de la servlet:

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 enlevé code de gestion d'erreur, comme vous pouvez le gérer différemment de ce que je fais. (Aussi, le "Genre" est une catégorie que j'ai définie.) À ce stade, vous pouvez utiliser les données pour ce que vous voulez, comme l'enregistrement d'un nouvel utilisateur ou rechercher un utilisateur existant pour vous connecter. Notez que le "myfacebookappsecret" chaîne doit bien sûr être votre secret de l'app de Facebook.

Vous aurez besoin de la "org.json" package pour utiliser ce code, que vous pouvez trouver à: http://json.org/java/ (il suffit de prendre le .java fichiers et les ajouter à votre code dans un org/json structure de dossier).

J'espère que cette aide. Si quelque chose n'est pas clair, merci de faire un commentaire, et je mettrai à jour la réponse.

Ex animo, - Alexander.

*Mise à JOUR*

Je veux ajouter quelques bribes de renseignements, toutes mes excuses si certains de ce qui semble un peu excessif.

Pour être en mesure de se connecter à un utilisateur par son/son Facebook compte, vous avez besoin de savoir qui de l'utilisateur dans la banque de données que nous parlons. Si c'est un nouvel utilisateur, facile, créer un nouvel objet utilisateur (avec un champ appelé "facebookId", ou ce que vous voulez l'appeler, dont la valeur que vous obtenez à partir de Facebook), persister dans la banque de données et les journaux de l'utilisateur.

Si l'utilisateur existe pas, vous devez avoir le champ avec le facebookId. Lorsque l'utilisateur est redirigé à partir de Facebook, vous pouvez saisir le facebookId, et de regarder dans le magasin de données pour trouver l'utilisateur auquel vous souhaitez vous connecter.

Si vous avez déjà des utilisateurs, vous devez laisser le journal dans la façon dont vous le faites habituellement, si vous savez qui ils sont, puis les envoyer à Facebook, obtenir le facebookId de retour et de mise à jour de leur objet utilisateur. De cette façon, ils peuvent se connecter en utilisant Facebook la prochaine fois.

Une autre petite remarque: L'utilisateur sera présenté avec un écran sur Facebook demandant pour permettre à votre application d'accéder à tout ce étendues que vous demandez, il n'y a pas moyen de contourner cela (du moins étendues que vous demandez, le moins intrusif, il semble, tout de même). Cependant, cela se produit uniquement la première fois qu'un utilisateur est redirigé (sauf si vous demandez plus étendues plus loin, puis il va demander à nouveau).

6voto

Nischal Points 454

Vous pouvez essayer face4j https://github.com/nischal/face4j/wiki . Nous l'avons utilisé sur notre produit http://grabinbox.com et en avons fait appel à une source ouverte. 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.

3voto

Pixel Elephant Points 6902

J'ai eu beaucoup de difficultés lorsque vous essayez de mettre en œuvre le Protocole de signature de moi-même. J'ai passé beaucoup de temps à essayer de déboguer un problème avec mes jetons pas réellement autorisé - un problème courant apparemment. Malheureusement, aucune des solutions n'a fonctionné pour moi alors j'ai fini par juste en utilisant Scribe, une chouette Java OAuth bibliothèque qui a l'avantage de soutenir d'autres fournisseurs en dehors de Facebook (par exemple: Google, Twitter, etc.)

1voto

Peter Knego Points 57985

0voto

Adrian Points 2320

Vérifiez les API java de facebook.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X