2011-12-06 64 views
0

我開始使用Facebook Graph API,並且我將通過java檢索包含一些簡單HTTP請求的訪問令牌。如何通過java檢測重定向以檢索access_token

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 &碼= THE_CODE_FROM_ABOVE

終於搞定了我的訪問令牌。

我使用了java.net.HttpURLConnectionorg.apache.http.HttpResponse, ,但是在這兩種情況下,我都會執行第一個調用,以獲得Facebook登錄頁面的HTML響應。

如果我使用這個HTML來創建一個網頁,然後我只需點擊登錄按鈕(無需插入用戶名和密碼),我就可以用代碼獲得成功頁面!

在HTML中,按鈕登錄的字段提交是空的,我無法檢索重定向URL ......我只能讀取<meta>標記中生成auth_token的替代鏈接(它是什麼?不同於正常的access_token ...)。

所以我想問的是:

  1. 它可以檢測以某種方式隱藏重定向只是 使用java.net.HttpURLConnectionorg.apache.http.HttpResponsé?

  2. 如果是,機制如何?它與auth_token有關嗎?

  3. 如果沒有,是否可以與其他庫? (我也用restfb, ,但他們似乎需要一個手動插入的訪問令牌作爲 arg,而且我也看到了facebook-java-api,但它看起來很舊)。


另外,如果我登錄了Facebook,執行第一HTTP調用通過Java,我得到的響應Facebook登錄頁面的HTML。

使用HTML創建一個網頁,然後我只需點擊登錄按鈕(不需要插入用戶名和密碼),我可以通過URL中的code參數獲取success.htm頁面。

如果我直接在瀏覽器中使用原始URL,我可以直接獲取success.htm頁面,而不需要中間的段落。

所以我想問題是在管理cookie:在Java(在Eclipse中執行)我無法訪問我的瀏覽器的cookie。

我試圖重定向到使用Servlet,但我得到了有關域的錯誤: ServletURL不是爲我的應用程序註冊的Facebook域或「網站URL」(實際上我沒有爲我的網站設置網址應用程序...這是問題的核心)。

在這裏任何情況下,在部分應用程序類型 http://developers.facebook.com/docs/authentication/ >桌面應用程序,他們說:

[...]用戶授權您的應用程序[我讓一切之後,我們 用戶重定向回到帶有 訪問令牌的redirect_uri URI片段:[...]

檢測到此重定向,然後使用您選擇的框架提供的任何機制從URI 中讀取訪問令牌。 [...]

所以我認爲仍然有可能通過Java檢測到這種重定向。怎麼樣?

+0

感謝你在Facebook查詢! –

回答

2

如果您還沒有域名,我建議您使用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"); 

這將返回一個訪問令牌,你可以用

+0

好的!非常感謝你!我解決了編輯我的應用程序的基本設置並將網站設置爲「http:// localhost:8080」的問題。現在我可以使用一些Servlet檢索代碼和access_token。所以我認爲如果不使用java.net.HttpURLConnection(或org.apache.http.HttpResponse)和https://www.facebook.com/connect/login_success.html作爲重定向URI就無法獲得access_token。 –

+0

如果是正確的答案,您可以做一個upvote/accept – jontro