Пример Java, как войти в систему с учетной записью Facebook на GAE, используя OAuth - PullRequest
39 голосов
/ 05 марта 2012

Я много искал, читал много блогов, статей, учебных пособий, но до сих пор не нашел работающего примера, чтобы я мог использовать фейсбук для входа в свое приложение.

Я знаю, что должениспользовать OAuth, получать токены, авторизации и т.д ...

Кто-нибудь может поделиться примером?(на GAE / JAVA)

Ответы [ 5 ]

52 голосов
/ 06 марта 2012

Вот как я это делаю в App Engine:

Шаг 1) Зарегистрируйте «приложение» на Facebook (ср. https://developers.facebook.com/). Вы даете Facebook имя для приложения и URL-адрес. URL-адрес, который вы регистрируете, является URL-адресом страницы (jsp или servlet), которую вы хотите обработать при входе в систему. При регистрации вы получаете две строки: «идентификатор приложения» и «секрет приложения» (последний - ваш пароль, не выдавайте его и не пишите в html).

Для этого примера, скажем, URL-адрес, который я зарегистрировал: "http://myappengineappid.appspot.com/signin_fb.do".

2) С веб-страницы, скажем, с помощью кнопки, вы перенаправляете пользователя на следующий URL в Facebook, подставляя идентификатор вашего приложения для «myfacebookappid» в приведенном ниже примере. Вы также должны выбрать, какие разрешения (или «области действия») вы хотите задать пользователю (см. https://developers.facebook.com/docs/reference/api/permissions/). В примере я прошу доступ только к электронной почте пользователя.

(Полезно знать, что вы также можете передать необязательную строку, которая будет возвращена без изменений в параметре «state». Например, я передаю ключ хранилища данных пользователя, чтобы я мог получить пользователя при прохождении Facebook ключ обратно ко мне. Я не делаю этого в примере.)

Вот фрагмент 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) Ваш пользователь будет перенаправлен на Facebook, и его попросят утвердить запрашиваемые вами разрешения. Затем пользователь будет перенаправлен обратно на URL-адрес, который вы зарегистрировали. В этом примере это "http://myappengineappid.appspot.com/signin_fb.do", который в моем web.xml соответствует следующему сервлету:

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
        }

        ...

Я удалил код обработки ошибок, так как вы можете обрабатывать его иначе, чем я. (Кроме того, «Пол» - это, конечно, класс, который я определил.) На данный момент вы можете использовать данные для чего угодно, например, для регистрации нового пользователя или поиска существующего пользователя для входа в систему. Обратите внимание, что « myfacebookappsecret "строка, конечно же, должна быть секретом вашего приложения от Facebook.

Вам понадобится пакет «org.json», чтобы использовать этот код, который вы можете найти по адресу: http://json.org/java/ (просто возьмите файлы .java и добавьте их в свой код в структуре папок org / json ).

Надеюсь, это поможет. Если что-то неясно, оставьте комментарий, и я обновлю ответ.

Ex animo, - Александр.

**** UPDATE ****

Я хочу добавить несколько кусочков информации, мои извинения, если что-то кажется излишним.

Чтобы войти в систему пользователя с помощью его / ее учетной записи Facebook, вам необходимо знать, о каком пользователе в хранилище данных мы говорим. Если это новый пользователь, просто создайте новый пользовательский объект (с полем с именем «facebookId» или как вы хотите его называть, значение которого вы получаете от Facebook), сохраните его в хранилище данных и войдите в систему.

Если пользователь существует, вам нужно иметь поле с facebookId. Когда пользователь перенаправлен из Facebook, вы можете взять facebookId и посмотреть в хранилище данных, чтобы найти пользователя, в которого вы хотите войти.

Если у вас уже есть пользователи, вам необходимо разрешить им входить в систему так, как вы обычно это делаете, чтобы вы знали, кто они, а затем отправить их в Facebook, вернуть facebookId и обновить объект пользователя. Таким образом, они могут войти через Facebook в следующий раз.

Еще одна небольшая заметка: пользователю будет представлен экран в Facebook с просьбой разрешить вашему приложению доступ к любым областям, о которых вы просите, и нет пути к этому (чем меньше областей, которые вы просите, тем менее навязчивым кажется, хоть). Однако это происходит только в первый раз, когда пользователь перенаправляется (если вы не запросите дополнительные области позже, он будет запрашивать снова).

6 голосов
/ 05 марта 2012

Вы можете попробовать face4j https://github.com/nischal/face4j/wiki.Мы использовали его в нашем продукте http://grabinbox.com и открыли его для всех.Это хорошо работает на GAE.

В вики есть пример, который должен помочь вам интегрировать вход в систему с Facebook за несколько минут.

face4j использует oAuth 2.0 и API графа facebook.

3 голосов
/ 24 сентября 2012

У меня было много трудностей, когда я пытался самостоятельно реализовать подпись OAuth. Я потратил много времени, пытаясь отладить проблему с моими токенами, которые на самом деле не авторизовались - очевидно, это общая проблема. К сожалению, ни одно из решений не сработало для меня, поэтому я просто использовал Scribe , изящную библиотеку Java OAuth, которая имеет дополнительное преимущество поддержки других провайдеров помимо Facebook (например, Google, Twitter и т. Д.)

1 голос
/ 05 марта 2012

Вы можете взглянуть на LeanEngine, серверная часть: https://github.com/leanengine/LeanEngine-Server/tree/master/lean-server-lib/src/main/java/com/leanengine/server/auth

0 голосов
/ 05 марта 2012

Проверьте Java API для Facebook.

Другие примеры: http://code.google.com/p/facebook-java-api/wiki/Examples

...