【问题标题】:How to detect the redirect to retrieve access_token via java如何检测重定向以通过 java 检索 access_token
【发布时间】:2012-01-14 10:54:51
【问题描述】:

我开始使用 facebook Graph API,我将通过 java 使用一些简单的 HTTP 请求来检索访问令牌。

关注https://developers.facebook.com/docs/authentication/ 我创建了一个新应用,但我没有域,所以 我向

发出 HTTP 请求

www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&
redirect_uri=https://www.facebook.com/connect/login_success.html

对于服务器端流程,我想通过 URL 中的代码重定向到成功页面。然后我会使用这段代码向

发出另一个 HTTP 请求

graph.facebook.com/oauth/access_token? client_id=YOUR_APP_ID&redirect_uri=YOUR_URL& client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

最后得到我的访问令牌。

我同时使用了java.net.HttpURLConnectionorg.apache.http.HttpResponse, 但是,在这两种情况下,执行第一个调用我得到的响应是 Facebook 登录页面的 HTML。

如果我使用这个 HTML 创建一个网页,然后我只需单击登录按钮(不插入用户名和密码),我就会得到带有代码的成功页面!

在 HTML 中,按钮 Login 的提交字段为空,我无法检索重定向 URL...我可以读取 <meta> 标记中生成 auth_token 的备用链接(它是什么?它是与普通的 access_token 完全不同...)。

所以我要问的是:

  1. 可以通过某种方式检测隐藏重定向 使用java.net.HttpURLConnectionorg.apache.http.HttpResponse?

  2. 如果是,机制如何?和auth_token有关系吗?

  3. 如果没有,是否可以与其他库一起使用? (我也用过restfb, 但他们似乎需要一个“手动”插入的访问令牌作为 arg,我也看到了 facebook-java-api 但它看起来很旧)。


另外,如果我登录 Facebook,通过 Java 执行第一个 HTTP 调用,我会得到 Facebook 登录页面的 HTML 作为响应。

使用 HTML 创建网页,然后我只需单击登录按钮(无需插入用户名和密码),我将获得带有 URL 中 code 参数的 success.htm 页面。

如果我在浏览器中直接使用原网址,可以直接获得success.htm页面,中间没有段落。

所以我认为问题在于 cookie 的管理:在 Java 中(在 Eclipse 中执行)我无法访问浏览器的 cookie。

我尝试重定向以使用 Servlet,但收到有关域的错误: ServletURL 不是 Facebook 域或为我的应用注册的“站点 URL”(实际上我没有为我的应用设置站点 URL……这是问题的核心)。

无论如何这里 http://developers.facebook.com/docs/authentication/ 在应用类型 > 他们说的桌面应用部分中:

[...] 在用户授权您的应用 [我允许一切] 后,我们 使用访问令牌将用户重定向回 redirect_uri URI 片段:[...]

检测此重定向,然后从 URI 中读取访问令牌 使用您选择的框架提供的任何机制。 [...]

所以我认为仍然可以通过 Java 检测到这个重定向。怎么样?

【问题讨论】:

    标签: java facebook-graph-api redirect access-token


    【解决方案1】:

    如果您还没有域,我建议您使用 localhost 作为域。这样您就可以在本地 Web 服务器/本地应用程序上对其进行测试。

    使用 HttpURLConnection 可以正常工作。 我们就是这样做的。

    Redirect to: 
    "https://graph.facebook.com/oauth/authorize?" +
                "client_id=" + clientId + "&" +
                "redirect_uri=" + URLEncoder.encode(returnUrl, "utf-8") 
    // After redirect to the return url do the following:
    
    //Make a http request to 
    "https://graph.facebook.com/oauth/access_token?client_id=" +
                "client_id=" + clientId + "&" +
                "redirect_uri=" + URLEncoder.encode(returnUrl, "utf-8")  + "&"+
                "client_secret=" + clientSecret + "&"+
                "code=" + request.getParameter("code");
    

    这将返回一个访问令牌,您可以使用该令牌查询 facebook

    【讨论】:

    • 好的!非常感谢!我解决了编辑我的应用程序的基本设置并将“localhost:8080”设置为网站的问题。现在我可以使用一些 Servlet 检索代码和 access_token。所以我认为不使用 java.net.HttpURLConnection(或 org.apache.http.HttpResponse)和facebook.com/connect/login_success.html 作为重定向 URI 是不可能获得 access_token 的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2011-03-19
    • 2016-02-11
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    相关资源
    最近更新 更多