it-swarm.com.de

Java-Beispiel zum Anmelden mit einem Facebook-Konto bei GAE mit OAuth

Ich habe viel gesucht, viele Blogs, Artikel und Tutorials gelesen, aber bis jetzt habe ich kein Arbeitsbeispiel erhalten, bei dem ich mich mit meinem Gesichtsbuchkonto bei meiner Anwendung anmelden konnte.

Ich weiß, dass ich OAuth, Tokens, Autorisierungen usw. verwenden muss.

Jeder kann ein Beispiel teilen? (auf GAE/Java)

39
LeandroRezende

So mache ich es mit App Engine:

Schritt 1) ​​Registrieren Sie eine "App" auf Facebook (vgl. https://developers.facebook.com/ ). Sie geben Facebook einen Namen für die App und eine URL. Die von Ihnen registrierte URL ist die URL zu der Seite (jsp oder Servlet), die Sie mit der Anmeldung behandeln möchten. Bei der Registrierung erhalten Sie zwei Zeichenfolgen, eine "App-ID" und ein "App-Geheimnis" (letzteres ist Ihr Passwort, geben Sie dieses nicht aus oder schreiben Sie es nicht in HTML).

Nehmen wir für dieses Beispiel an, dass die von mir registrierte URL " http://myappengineappid.appspot.com/signin_fb.do " ist.

2) Von einer Webseite aus, z. B. mit einem Button, leiten Sie den Benutzer auf die folgende URL von Facebook um, wobei Sie im folgenden Beispiel Ihre App-ID durch "myfacebookappid" ersetzen. Sie müssen auch auswählen, welche Berechtigungen (oder "Bereiche") Sie dem Benutzer stellen möchten (vgl. https://developers.facebook.com/docs/reference/api/permissions/ ). Im Beispiel bitte ich nur um Zugriff auf die E-Mail-Adresse des Benutzers.

(Eine nützliche Sache zu wissen ist, dass Sie auch eine optionale Zeichenfolge übergeben können, die unverändert im Parameter "state" zurückgegeben wird. Beispielsweise übergebe ich den Datastore-Schlüssel des Benutzers, sodass ich den Benutzer abrufen kann, wenn Facebook den Schlüssel zurückgibt zu mir. Ich mache das im Beispiel nicht.)

Hier ist ein Jsp-Ausschnitt:

<%@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) Ihr Benutzer wird an Facebook weitergeleitet und gebeten, die gewünschten Berechtigungen zu genehmigen. Anschließend wird der Benutzer zu der von Ihnen registrierten URL zurückgeleitet. In diesem Beispiel ist dies " http://myappengineappid.appspot.com/signin_fb.do ", das in meiner web.xml dem folgenden Servlet zugeordnet ist:

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
        }

        ...

Ich habe Fehlerbehandlungscode entfernt, da Sie ihn möglicherweise anders behandeln möchten als ich. (Außerdem ist "Geschlecht" natürlich eine Klasse, die ich definiert habe.) An dieser Stelle können Sie die Daten für beliebige Zwecke verwenden, z. B. für die Registrierung eines neuen Benutzers oder die Suche nach einem vorhandenen Benutzer, um sich anzumelden. myfacebookappsecret "string sollte natürlich Ihre App vor Facebook sein.

Sie benötigen das Paket "org.json", um diesen Code zu verwenden. Sie finden ihn unter: http://json.org/Java/ (Nehmen Sie einfach die .Java-Dateien und fügen Sie sie in einen Code ein org/json Ordnerstruktur).

Ich hoffe das hilft. Wenn etwas unklar ist, kommentieren Sie bitte, und ich werde die Antwort aktualisieren.

Ex animo, - Alexander.

****AKTUALISIEREN****

Ich möchte noch ein paar Informationen hinzufügen, ich entschuldige mich, wenn etwas davon etwas übertrieben erscheint.

Um einen Benutzer über sein Facebook-Konto anmelden zu können, müssen Sie wissen, über welchen Benutzer im Datastore wir sprechen. Wenn es sich um einen neuen Benutzer handelt, erstellen Sie einfach ein neues Benutzerobjekt (mit einem Feld namens "facebookId" oder wie auch immer Sie es nennen möchten, dessen Wert Sie von Facebook erhalten). Behalten Sie es im Datenspeicher bei und melden Sie den Benutzer an.

Wenn der Benutzer vorhanden ist, müssen Sie das Feld mit der facebookId angeben. Wenn der Benutzer von Facebook umgeleitet wird, können Sie die facebookId verwenden und im Datenspeicher nach dem Benutzer suchen, den Sie sich anmelden möchten.

Wenn Sie bereits Benutzer haben, müssen Sie sich wie gewohnt anmelden, damit Sie wissen, wer sie sind. Dann senden Sie sie an Facebook, holen Sie sich die facebookId zurück und aktualisieren Sie ihr Benutzerobjekt. Auf diese Weise können sie sich beim nächsten Mal über Facebook anmelden.

Noch ein kleiner Hinweis: Dem Nutzer wird auf Facebook ein Bildschirm angezeigt, in dem Sie aufgefordert werden, Ihrer App den Zugriff auf die gewünschten Bereiche zu gestatten. Es gibt keinen Weg, um dies zu umgehen (je weniger Bereiche Sie verlangen, desto weniger aufdringlich scheint dies zu sein). Dies geschieht jedoch nur, wenn ein Benutzer zum ersten Mal umgeleitet wird (es sei denn, Sie fordern später weitere Bereiche an, dann werden Sie erneut gefragt).

52
yngling

Sie können face4j https://github.com/nischal/face4j/wiki ausprobieren. Wir haben es auf unserem Produkt http://grabinbox.com verwendet und es für jedermann zur Verfügung gestellt. Es funktioniert gut auf GAE.

Es gibt ein Beispiel im Wiki, das Ihnen helfen soll, das Login mit Facebook in wenigen Minuten zu integrieren.

face4j verwendet oAuth 2.0 und die Facebook-Graph-API.

6
Nischal

Ich hatte große Schwierigkeiten, als ich versuchte, die OAuth-Signatur selbst zu implementieren. Ich habe viel Zeit damit verbracht, ein Problem zu debuggen, bei dem meine Token nicht autorisiert wurden - ein häufiges Problem. Leider hat keine der Lösungen für mich funktioniert, also habe ich nur mit Scribe gearbeitet, einer schicken Java OAuth-Bibliothek, die den zusätzlichen Vorteil hat, andere Anbieter für Facebook (z. B. Google, Twitter usw.) zu unterstützen.

3
Pixel Elephant
1
Peter Knego

Überprüfen Sie die Java-APIs von Facebook. 

Andere Beispiele: http://code.google.com/p/facebook-Java-api/wiki/Examples

0
Adrian