Java示例如何使用OAuth在GAE上使用Facebook帐户登录

时间:2012-03-05 12:54:14

标签: java facebook google-app-engine oauth facebook-oauth

我搜索了很多,阅读了很多博客,文章和教程,但直到现在还没有得到一个可以使用脸书帐户登录我的应用程序的工作示例。

我知道我必须使用OAuth,获取令牌,自动曝光等......

任何人都可以分享一个例子吗? (在GAE / JAVA上)

5 个答案:

答案 0 :(得分:52)

以下是我在App Engine上的表现:

步骤1)在Facebook上注册“app”(参见https://developers.facebook.com/)。你给Facebook一个应用程序的名称和一个网址。您注册的URL是您要处理登录的页面(jsp或servlet)的URL。从注册中你得到两个字符串,一个“应用程序ID”和一个“应用程序秘密”(后者是你的密码,不要透露或用html写出来)。

对于这个例子,假设我注册的网址是“http://myappengineappid.appspot.com/signin_fb.do”。

2)从网页上,用按钮说,您将用户重定向到Facebook上的以下网址,在下面的示例中将您的应用ID替换为“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中映射到以下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
        }

        ...

我已经删除了错误处理代码,因为您可能希望以不同于我的方式处理它。 (另外,“性别”当然是我定义的类。)此时,您可以将数据用于任何您想要的数据,例如注册新用户或查找现有用户登录。请注意“ myfacebookappsecret“字符串当然应该是Facebook的应用秘密。

您将需要“org.json”包来使用此代码,您可以在以下位置找到它:http://json.org/java/(只需获取.java文件并将它们添加到org / json文件夹结构中的代码中)

我希望这会有所帮助。如果有任何不清楚的地方,请发表评论,我会更新答案。

前animo, - 亚历山大。

**** **** UPDATE

我想添加一些信息,如果其中一些看起来有些过分,我表示歉意。

为了能够通过他/她的Facebook帐户登录用户,您需要知道我们正在谈论的数据存储区中的哪个用户。如果它是一个新用户,那么,创建一个新的用户对象(带有一个名为“facebookId”的字段,或者你想要调用它的任何字段,你从Facebook获得它的价值),将它保存在数据存储区中并将用户登录。< / p>

如果用户存在,则需要具有facebookId的字段。当用户从Facebook重定向时,您可以获取facebookId,并查看数据存储区以找到您要登录的用户。

如果您已有用户,则需要让他们以您通常的方式登录,以便您知道他们是谁,然后将其发送到Facebook,获取facebookId并更新其用户对象。这样,他们可以在下次使用Facebook登录。

另一个小注意事项:用户将在Facebook上看到一个屏幕,要求允许您的应用访问您要求的任何范围,没有办法解决这个问题(您要求的范围越小,看起来越不干扰,虽然)。但是,这只会在用户第一次被重定向时发生(除非您稍后要求更多范围,然后再次询问)。

答案 1 :(得分:6)

你可以试试face4j https://github.com/nischal/face4j/wiki。我们已经在我们的产品http://grabinbox.com上使用它,并且已经开放供任何人使用。它适用于GAE。

维基上有一个例子可以帮助你在几分钟内将登录与facebook集成。

face4j使用oAuth 2.0和facebook图谱API。

答案 2 :(得分:3)

尝试自己实施OAuth签名时遇到了很多困难。我花了很多时间尝试使用我的令牌调试问题而不是实际获得授权 - 这显然是一个常见问题。不幸的是,没有一个解决方案适合我,所以我最终只使用Scribe,一个漂亮的Java OAuth库,除了Facebook(例如Google,Twitter等)之外还有其他提供商支持的额外好处

答案 3 :(得分:1)

答案 4 :(得分:0)

检查facebook的java API。

其他示例:http://code.google.com/p/facebook-java-api/wiki/Examples