2010-07-21 52 views
5

我正在構建一個使用Django在iframe中加載的Facebook畫布應用程序。我希望登錄過程類似於Zynga所做的那樣工作。在這種方法中,如果您未登錄,您將被重定向到Facebook登錄頁面,然後轉到應用程序的權限請求頁面(沒有任何彈出窗口)。使用新圖形API在Facebook畫布應用程序中進行身份驗證

至於我可以告訴Zynga的必須使用FBML,只是轉發到的URL看起來像:

http://www.facebook.com/login.php?api_key=[api_key]&canvas=1&fbconnect=0&next=[return_url]

反正有沒有實現的Python應用程序類似的效果加載在iframe中?

有一種方法here,顯示瞭如何使用新的PHP SDK來實現正確的重定向,但我試圖用新的Python SDK其中只有方法:

def get_user_from_cookie(cookies, app_id, app_secret): 
""" 
Parses the cookie set by the official Facebook JavaScript SDK. 
cookies should be a dictionary-like object mapping cookie names to 
cookie values. 
... 
""" 

我有一些工作使用的JavaScript SDK和get_user_from_cookie方法代碼:

<div id="fb-root"> 
<script src="http://connect.facebook.net/en_US/all.js"></script> 
</div> 

<script type="text/javascript"> 
FB.init({ apiKey: 'apikey', status: true, cookie: true, xfbml: true}); 

FB.Event.subscribe('auth.login', function(response) { 
    // Reload the application in the logged-in state 
    window.top.location = 'http://apps.facebook.com/myapp/'; 
}); 
</script> 
<fb:login-button>Install MyApp</fb:login-button> 

這種方法的問題是,它需要用戶點擊一個按鈕來登錄,然後通過彈出認證的屏幕工作。 (注:如果我直接調用的FB.login一個彈出也會發生)

所以...有沒有使用JavaScript SDK重定向到登錄頁面,而不是加載它作爲一個彈出的方法嗎?

感謝您的幫助! --Eric

回答

13

是否有使用JavaScript的 SDK重定向到 登錄頁面,而不是加載它作爲一個 彈出的方法嗎?

否。JavaScript SDK將打開一個新窗口,而不是重定向當前窗口。

爲了與授權對話框的全屏幕版本呈現給用戶,你需要將它們重定向到https://graph.facebook.com/oauth/authorize?client_id={{ application_id }}&redirect_uri={{ redirect_uri }}。請注意,您不能從服務器端代碼執行此操作,因爲這隻會重定向iframe,而Facebook不允許。您需要一個重定向父窗口的中間文檔。

<!DOCTYPE html> 

<!-- 
This document redirects the parent window to the authorization 
dialog automatically, or falls back to a link if the client does not 
support JavaScript. 
--> 

<html> 
    <head> 
    <script type="text/javascript"> 
     window.parent.location = 'https://graph.facebook.com/oauth/authorize?client_id={{ application_id }}&redirect_uri={{ redirect_uri }}'; 
    </script> 
    </head> 

    <body> 
    You must <a target="_top" href="https://graph.facebook.com/oauth/authorize?client_id={{ application_id }}&redirect_uri={{ redirect_uri }}">authorize this application</a> in order to proceed. 
    </body> 
</html> 

一旦用戶授權的應用程序時,他或她將被重定向到,你可以用你的redirect_uri規定和Facebook將填充各種美味信息的GET參數signed_request(見the documentation on signed requests)的URI代表用戶向Facebook發送請求。請注意,如果您計劃將此已簽名的請求(或其他任何內容)保存到畫布應用程序中的cookie中,則需要在頁眉中設置緊湊的P3P策略;否則,所有版本的Internet Explorer都將忽略您的Cookie。

P3P: CP="IDC CURa ADMa OUR IND PHY ONL COM STA"

我寫了一個庫,使得它很容易使搭載的Django,它照顧到所有的這些東西對你的Facebook畫布應用。它被稱爲Fandjango,它在github上可用。

+1

您可以使用javascript中的top.location將它們重定向到授權頁面 – BeRecursive 2010-11-11 12:06:30

+0

@BeRecursive:是的。這正是我所說的。 – 2010-11-11 12:09:12

+0

爲什麼在編碼時將其重定向到具有該代碼的頁面,然後將其注入頁面? – BeRecursive 2010-11-11 12:10:39

相關問題