Подтвердить что ты не робот

Пример Java, как войти в Google App Engine с помощью учетной записи Facebook, используя OAuth

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

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

Кто-нибудь может поделиться примером?

4b9b3361

Ответ 1

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

Шаг 1) Зарегистрируйте приложение на Facebook (см. https://developers.facebook.com/). Вы даете Facebook имя для приложения и URL. Адрес, который вы регистрируете, - это URL-адрес страницы (jsp или сервлета), с которой вы хотите обрабатывать логин. Из регистрации вы получаете две строки: "Идентификатор приложения" и "секрет приложения" (последний - ваш пароль, не выдавайте это или не записывайте в 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 и попросил одобрить разрешения, которые вы просите. Затем пользователь будет перенаправлен обратно на адрес, который вы зарегистрировали. В этом примере это " http://myappengineappid.appspot.com/signin_fb.do", который в моем веб файле отображается на следующий сервлет:

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 с просьбой разрешить вашему приложению доступ к любым областям, о которых вы просите, нет никакого способа обойти это (чем меньше областей вы запрашиваете, тем менее навязчивым кажется, хоть). Однако это происходит только в первый раз, когда пользователь перенаправляется (если вы не попросите больше областей позже, тогда он снова спросит).

Ответ 2

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

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

face4j использует oAuth 2.0 и API-интерфейс facebook.

Ответ 3

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