Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用OAuth使用Facebook帐户登录Google App Engine的Java示例_Java_Facebook_Google App Engine_Oauth_Facebook Oauth - Fatal编程技术网

如何使用OAuth使用Facebook帐户登录Google App Engine的Java示例

如何使用OAuth使用Facebook帐户登录Google App Engine的Java示例,java,facebook,google-app-engine,oauth,facebook-oauth,Java,Facebook,Google App Engine,Oauth,Facebook Oauth,我搜索了很多,读了很多博客、文章和教程,但直到现在还没有找到一个使用Facebook帐户登录到我的应用程序的有效示例 我知道我必须使用OAuth,获取令牌、授权等 有人可以分享一个例子吗?查看facebook的java API 其他示例:您可以尝试face4j。我们已经在我们的产品上使用了它,并且已经为任何人开放了它的来源。它在GAE上运行良好 wiki上有一个例子,可以帮助您在几分钟内将登录与facebook集成 face4j使用了oAuth 2.0和facebook graph API。您可

我搜索了很多,读了很多博客、文章和教程,但直到现在还没有找到一个使用Facebook帐户登录到我的应用程序的有效示例

我知道我必须使用OAuth,获取令牌、授权等


有人可以分享一个例子吗?

查看facebook的java API

其他示例:

您可以尝试face4j。我们已经在我们的产品上使用了它,并且已经为任何人开放了它的来源。它在GAE上运行良好

wiki上有一个例子,可以帮助您在几分钟内将登录与facebook集成


face4j使用了oAuth 2.0和facebook graph API。

您可以看看LeanEngine,服务器部分:

以下是我在App Engine上的操作方式:

步骤1)在Facebook上注册“应用程序”(参见)。你给Facebook一个应用程序的名称和一个url。您注册的url是要处理登录的页面(jsp或servlet)的url。从注册中可以得到两个字符串,“应用程序ID”和“应用程序机密”(后者是您的密码,请勿泄露或用html编写)

对于本例,假设我注册的url为“”

2) 在一个网页上,比如说用一个按钮,你将用户重定向到Facebook上的以下url,在下面的例子中用你的应用程序id替换“myfacebookappid”。您还必须选择要询问用户的权限(或“范围”)(参见)。在这个例子中,我只要求访问用户的电子邮件

(需要知道的一件有用的事情是,您还可以传递一个可选字符串,该字符串将在“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>
我已经删除了错误处理代码,因为您可能希望以与我不同的方式处理它。(当然,“性别”是我定义的一个类。)此时,您可以将数据用于任何您想要的用途,例如注册新用户或查找现有用户登录。请注意,“myfacebookappsecret”字符串当然应该是来自Facebook的应用程序机密

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

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

前阿尼莫,-亚历山大

****更新****

我想补充几点信息,如果其中有些内容有点过分,我深表歉意

为了能够通过用户的Facebook帐户登录,您需要知道我们讨论的数据存储中的哪个用户。如果是新用户,很简单,创建一个新的用户对象(带有一个名为“facebookId”的字段,或任何你想调用的字段,其值可以从Facebook获得),将其保存在数据存储中并让用户登录

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

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


另一个小提示:用户将在Facebook上看到一个屏幕,要求允许你的应用程序访问你要求的任何范围,但这是没有办法的(尽管你要求的范围越少,侵入性似乎就越小)。但是,这种情况只在用户第一次被重定向时发生(除非您稍后请求更多作用域,否则它会再次请求)。

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

我没有看到您验证
签名的\u请求
属性来验证用户/请求是否实际有效,但除此之外,这些确实是需要采取的步骤…Alexander,使用此代码,如果用户登录facebook并打开我的GAE,它会自动检查facebook帐户吗?或者用户总是需要单击某个地方进行“身份验证”?使用此代码可以做两件事。(1) 允许新用户单击“使用facebook注册”和(2)允许现有用户只需单击“使用您的facebook帐户登录”即可登录。它们都可以单击相同的链接,当上面的servlet运行时,您可以检查数据库并查看是否有具有此facebookId的注册用户。如果是,您可以登录该用户。如果没有,则可以创建新用户并存储facebookId。是的,如果用户已登录facebook并已批准任何权限,则此代码将使该用户登录,而无需单击任何位置。另外一个小提示:您当然也可以允许应用程序的现有用户登录facebook(即使用facebookId更新其用户对象)。例如,这可以通过在我简要提到的状态参数中传递用户的数据存储密钥来实现,然后让上面的servlet获取它并使用facebookId更新用户(或者您可以使用会话来检测用户)。Alexander,thx谢谢您的所有想法,今晚,我将尝试在我的应用程序上运行它。我不相信facebook java api 3.0.4是最新的FB认证文档。相反,我遵循了接受答案中的步骤,然后使用restfb框架。@s_t_e_v_e我并不感到惊讶;FB改变API的频率比模特改变衣服的频率更高;)很高兴听到您找到了解决方案:)
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
        }

        ...