2011-08-01 27 views
4

在我的畫布頁中,我嘗試對用戶進行認證它http://developers.facebook.com/docs/guides/canvas/描述的方式,通過使用基本代碼(例如代碼developers.facebook.com):Facebook的帆布認證:沒有signed_request參數重定向後

<?php 

$app_id = "YOUR_APP_ID"; 

$canvas_page = "YOUR_CANVAS_PAGE_URL"; 

$auth_url = "http://www.facebook.com/dialog/oauth?client_id=" 
     . $app_id . "&redirect_uri=" . urlencode($canvas_page); 

$signed_request = $_REQUEST["signed_request"]; 

list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true); 

if (empty($data["user_id"])) { 
     echo("<script> top.location.href='" . $auth_url . "'</script>"); 
} else { 
     echo ("Welcome User: " . $data["user_id"]); 
} 

?> 

問題是,用戶第一次授權我的畫布應用程序時,Facebook在重定向回參數時(如示例代碼中所述)不通過signed_request參數,而是code參數。第二次訪問應用程序時(已經確認權限),它按預期傳遞signed_request參數。

爲什麼第一次通過code參數?當Facebook通過code/signed_request參數時,文檔無法解釋。

+1

我發現問題:對於$ canvas_page,我使用畫布URL(例如http://mysite.com/canvas/)而不是畫布*頁面* URL(例如http://apps.facebook.com/ MYAPP)。 –

回答

2

問題是,對於$canvas_page,我使用畫布URL(例如mysite.com/canvas)而不是畫布頁URL(例如apps.facebook.com/myapp)。

1

Facebook使用代碼參數來驗證您的應用程序。在文檔中,它指出:

*如果用戶按下允許,您的應用程序將被授權。 OAuth對話框會將用戶的瀏覽器重定向到您通過redirect_uri參數傳遞的URL(授權代碼爲*

)要完成授權,您現在必須將代碼參數和應用程序祕密並傳遞給它到Graph API令牌端點(解釋文檔)。這將授予您訪問訪問令牌的權限。從此之後,您的應用程序將不需要此用戶的代碼參數,因爲它們已經過身份驗證。

Facebook使用signed_request與您的應用程序共享信息。該文檔指出了它將通過簽名請求的三種情況。它們是:

  • 一個signed_request傳遞給應用程序在Facebook.com上,當他們被加載到Facebook的環境
  • 一個signed_request傳遞到已在開發應用程序註冊的取消授權回撥任何應用程序,只要給定用戶移除使用App控制板應用
  • 甲signed_request被傳遞給使用該登記插件應用每當用戶成功地與他們的應用程序註冊

因此得出結論,碼參數只發送到驗證AP摺疊,而signed_request被用來在應用程序被授權後傳遞信息。

+0

我無法使用'code'參數來獲取access_token,我從https:// graph.facebook.com/oauth/access_token'(「Invalid redirect_uri」)得到一個OAuthException。該文檔指出:「如果用戶按下允許,您的應用程序將被授權,OAuth對話框將通過HTTP 302將用戶瀏覽器重定向到您在redirect_uri參數中傳遞的URL。在用戶授權您的應用程序後,signed_request參數將在後續請求中包含以下信息......「 - 事實並非如此,在選擇」允許「後,我得到了'code'參數。 –

2

我認爲你需要追加 「& RESPONSE_TYPE =令牌」,以您的身份驗證網址:

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&response_type=token

然後你回來的東西,看起來像:

http://apps.facebook.com/APP_NAME/#access_token=YOUR_APP_ID%YADA_YADA_YADA0&expires_in=3948

你可以用一些Javascript提取它:

if (window.location.hash.length == 1) 
{ 
     var accessToken = window.location.hash.substring(1); 
} 
0

我在這個問題上掙扎了(沒有在signed_request中獲得oauth ID,而是在用戶批准應用程序後獲得了「代碼」)超過了一週,而這篇文章(和其他幾篇文章)幫助我解決了非常接近的問題這個問題(我在使用我的應用程序畫布URL而不是重定向URI中的畫布頁面URL,並且我沒有在設置中指定命名空間)。

做出這些更正後,我遇到了一個不同的問題,即應用程序批准頁面不會顯示給新用戶,而是facebook會引發消息「應用程序有錯誤等等。最後我想我錯過了/在我的重定向網址的畫布頁面網址的末尾..我在https://apps.facebook.com/myappname而不是https://apps.facebook.com/myappname/在重定向uri。添加/在最後解決了問題,當一個新用戶訪問我的應用程序使用https://apps.facebook.com/myappname(如果用戶已經登錄)facebook顯示批准頁面(在收到我的服務器的響應後),一旦用戶批准該應用程序,Facebook發送帶有所需認證代碼的簽名請求到我的應用程序。希望這對任何人都有用否則誰可能會遇到同樣的問題。

1

薩伊 - 並且非常正確。 我也很喜歡這個。 將redirect_uri設置爲我的域名時,我得到了無限重定向循環。 當將redirect_uri設置爲Facebook應用程序url時,我收到一個錯誤消息,說URL不在我的域中,因此無法訪問。 它採取了「/」末解決這個

+0

謝謝你解決了我的問題 – mjs

1

,我與我的畫布應用了同樣的問題,我固定它通過簡單地重定向到我的應用程序的畫布網址的情況下,有一個代碼 GET請求參數。之後,Facebook向我發送包含 signed_request參數的POST請求。下面是Python的Django的片段:

if 'code' in request.GET.keys(): 
    return HttpResponseRedirect(FACEBOOK_CANVAS_URL) 

# ...rest of your canvas handling code here 
0

只是爲了清除混淆代碼參數。當用戶允許應用程序Facebook將始終發送此參數..但是signed_request參數使用後或其他方法發送..它不是在URL中發送..你可以使用$ _REQUEST ['signed_request']來訪問它

0

我有一個類似的問題,當我爲我的應用程序分配一個命名空間時解決了,所以它看起來像應用程序.facebook.com/myapp而不是apps.facebook.com/1234。

0

我遇到了你用firefox描述的問題,並禁用了第三方cookie。

我啓用了第三方cookie,然後signed_request突然可用。