2010-02-18 37 views
1

我有一個作爲iFrame構建的Facebook app。我使用的是JavaScript客戶端API通過加載:Facebook API:FB.Connect.requireSession問題

在我的初始化代碼,我用的是requireLogin方法,以確保用戶已授權的應用程序。我發現這是必要的,以便能夠爲記分牌收集用戶的姓名,頭像等。下面是一個典型的代碼片段:

FB_RequireFeatures(["Connect","Api"], function() { 

    FB.Facebook.init("...API_KEY_HERE...", "xd_receiver.htm"); 

    var api = FB.Facebook.apiClient; 
    api.requireLogin(function() { 
     api.users_getInfo(
      FB.Connect.get_loggedInUser(), 
      ["name", "pic_square", "profile_url"], 
      function(users, ex) { 
       /* use the data here */ 
      }); 
    }); 
}); 

這導致了iframe重定向導致Facebook的授權屏幕到我的應用程序iframe中加載。這看起來很垃圾並且對用戶有些混淆,例如有兩個Facebook酒吧等。

問題1:有什麼我可以做的,以清除這個同時仍然作爲一個iFrame實現,仍然使用JavaScript API?

按照FB API documentation

FB.ApiClient.requireLogin

這種方法已被棄用 - 使用 FB.Connect.requireSession代替。

我的經驗,雖然當我用FB.Connect.requireSession代替api.requireLogin它永遠不會被調用。我更喜歡這樣做的推薦方式,但我掙扎着,無法找到一種方法來實現它。我嘗試爲其他兩個參數添加各種參數,但看起來沒有任何效果。我的期望是,這種方法將加載在我的應用程序iFrame中的對話框中,並帶有類似的授權信息。

問題2:我錯過了什麼讓FB.Connect.requireSession正確提示用戶進行授權?

最後,在遊戲結束時,應用程序會提示用戶通過FB.Connect.streamPublish將他們的分數發佈到他們的流中。這導致我...

問題3:我是否正在載入正確的功能?我是否需要「Api」和「連接」?我錯過了其他人嗎?

+0

**注意:**授予的答案是將我推向正確方向的答案,但我自己的答案有代碼段,這是解決方案。 – mckamey 2010-02-21 17:35:39

回答

0

我認爲FB.requireSession只有從FB工程連接網站Facebook的 之外。如果您使用apps.facebook.com上託管的應用程序,請使用php api 來代替,

$ facebook = new Facebook($ appapikey,$ appsecret); $ facebook-> require_login();

或鏈接到登錄頁面。

這些方法來登錄

* Using the PHP client library 
* Directing users to login.php 
* Including the requirelogin attribute in a link or form 
* Using FBML 

只有第2可用於託管在apps.facebook.com

我覺得requirelogin和FBML只有FBML畫布應用工作的iframe應用程序。

看到 http://wiki.developers.facebook.com/index.php/Authorization_and_Authentication_for_Canvas_Page_Applications_on_Facebook

+0

我沒有在PHP中開發,因此他們的客戶端庫對我沒有任何好處。關於重定向到登錄頁面的提示最終解決了我的問題。對於其他讀者來說,XFBML和API調用在iFrame應用中工作正常。 – mckamey 2010-02-21 17:21:58

0

問題1:有什麼我可以做 清理它同時還 使用的JavaScript API實現作爲一個iFrame,還 ?

問題2:我究竟有 越來越FB.Connect.requireSession到 正確提示用戶 授權失蹤?

Please have a look at this.本文討論了正確的使用require session,並提供有關如何實現鏈接。是的,你是對的,requireLogin已被棄用,不會再有幫助。

問題3:我是否正在加載正確的 功能?我是否需要「Api」和 「連接」?我錯過了其他人嗎?

據我所知,你可以同時使用API​​和Connect,基本上你可以在javascript的幫助下訪問facebook的api。

但是,對於iframe應用程序,沒有很好的幫助和對API的最小支持,並提供了一些少數功能。 See this for more info.

這導致了iframe重定向 導致Facebook的授權 屏幕到我的應用程序iframe中加載。 這看起來很垃圾,並且有些 讓使用者感到困惑,例如,有 兩個類似Facebook酒吧等

最後和個人而言,我還沒有看到任何iframe應用程序要求用戶先添加應用程序。這創建您提到的上述兩個酒吧的問題。

我在回答開始時發佈的鏈接有一些有用的鏈接,可幫助您開始並決定下一步或可能對應用進行更改。

感謝,並希望幫助:)

+0

我嘗試使用FBConnect授權,但它是彈出窗口和FBConnect按鈕的奇怪體驗。這種認證/授權的風格在完全外部的網站上效果更好。對於iFrames,解決方案最終是重定向到登錄URL,如果它們尚未登錄,它將成爲授權URL。 – mckamey 2010-02-21 17:33:59

2

這裏是我需要做清理授權過程的變化的總結。看來,iFrames必須完全重定向到正確的授權。我嘗試使用FBConnect授權,但它是彈出窗口和FBConnect按鈕的奇怪體驗。

最終這場比賽我預期的經驗,我已經看到了與其他FB應用:

FB_RequireFeatures(["Connect","Api"], function() { 
    var apiKey = "...", 
     canvasUrl = "http://apps.facebook.com/..."; 

    function authRedirect() { 
     // need to break out of iFrame 
     window.top.location.href = "http://www.facebook.com/login.php?v=1.0&api_key="+encodeURIComponent(apiKey)+"&next="+encodeURIComponent(canvasUrl)+"&canvas="; 
    } 

    FB.Facebook.init(apiKey, "xd_receiver.htm"); 

    FB.ensureInit(function() { 
     FB.Connect.ifUserConnected(
      function() { 
       var uid = FB.Connect.get_loggedInUser(); 
       if (!uid) { 
        authRedirect(); 
        return; 
       } 

       FB.Facebook.apiClient.users_getInfo(
        uid, 
        ["name", "pic_square", "profile_url"], 
        function(users, ex) { 
         /* user the data here */ 
        }); 
      }, 
      authRedirect); 
}); 

對於內部框架,該解決方案是最終重定向到成爲授權URL,如果他們不登錄網址已經登錄。

+0

+1,您修改後的解決方案用於http://stackoverflow.com/questions/3457620/facebook-login-and-iframe-redirection。 – 2010-12-06 12:59:09