2010-11-30 65 views
8

我正在爲一個簡單的Facebook應用程序登錄。我能夠使用JavaScript SDK成功地呈現登錄/擴展權限在一個彈出窗口,其中的FB.login或下面的代碼對話框:FB.ui({method:'auth.login'...)如何做顯示:'iframe'而不是'popup'?

FB.ui({ method: 'auth.login', 
    perms: 'read_stream,publish_stream', 
    display: 'popup' }, 
    function (rsp) { 
     fg_log('on login');        
     if(rsp.session) { 
      if(rsp.perms) { 
       fg_log('PERMS: ',rsp.perms); 
      } else { 
       fg_log('Hmm. No permissions'); 
      } 
     } else { 
      fg_log('Hmm. No login'); 
     } 
    } 
); 

問題是...我不喜歡彈出窗口很多。從用戶界面的角度來看,我認爲他們感覺不到,就像他們不屬於應用程序的其他部分。讓他們通過JavaScript顯示也需要額外點擊來自用戶的無緣無故 - 爲了解決彈出窗口阻止程序,用戶必須點擊類似登錄按鈕的東西(主要是毫無意義的,因爲到了應用程序知道它需要顯示登錄按鈕,它已經知道用戶需要登錄,並且可能只是提供權限對話框)。

所以,我想,爲什麼不是一個iframe呢?彈出式窗口攔截器沒有問題,很好地嵌入在頁面中,Facebook似乎愛上他們。

在最近的(2.1.2)JavaScript SDK源代碼和Facebook開發人員論壇上的各種其他帖子中的一點點挖掘似乎表明,可以將「display:'iframe'」作爲FB.ui的選項的一部分。

但是當我嘗試它,雖然IFRAME不上來,而不是獲取權限對話框中,我得到:

「與後來的請重試時發生錯誤。」

(注:再次嘗試後產生相同的結果。)

是有沒有竅門得到這個工作,或者是禁止某些原因?

+0

這不是一個真正的答案......但我已經看到了不同的行爲,其中Facebook有時會顯示一個,有時顯示另一個,取決於我無法控制的幾件事情。 – philfreo 2010-11-30 08:02:01

回答

2

嘗試使用FB.login而不是FB..ui。如果用戶已經登錄,並且通過FB.login授予了您要求的權限,則不會有對話框。否則會顯示「內聯」,要求額外的權限/登錄。

當用戶已經登錄時,使用登錄功能獲得更多權限有點違反直覺。但它有效。

+2

這有一個問題 - 在頁面選項卡上,它不會'內聯';這將是一個彈出窗口,可能會被阻止。 – slashwhatever 2012-05-29 15:47:30

1

您可以試試這個:

大約6個月前我使用以下方法。 :)

<div> 
    <a href="#_" onclick="myOuthDialog();">outh dialog</a> 
</div> 
<div id="fb-root"></div> 
<script> 
base_url = 'http/s://path/to/your/site/url'; //Which is set into app setting 
myOuthDialog = function(){ 
    FB.ui({method: 'oauth', 
     client_id:'<!--YOUR APP ID-->', 
     api_key:'<!--YOUR APP ID-->', 
     app_id:'<!--YOUR APP ID-->', 
     canvas:'1', 
     fbconnect:'1', 
     response_type:'code token', 
     perms:'email', 
     scope:'email', 
     redirect_uri:base_url, 
     display:'iframe' 
    }, myCallback); 
} 

myCallback = function(data){ 
    FB.getLoginStatus(function(response) { 
     if (response.status === 'connected') { 
     document.location = base_url; 
     var uid = response.authResponse.userID; 
     var accessToken = response.authResponse.accessToken; 
     } else if (response.status === 'not_authorized') { 
     myOuthDialog(); 
     } else { 
     document.location = base_url; 
     } 
    }, true); 
} 
</script> 
<script> 
    window.fbAsyncInit = function() { 
    FB.init({ 
     appId  : '<!--YOUR APP ID-->', // App ID 
     channelUrl : base_url+'channel.php', // Channel File 
     status  : true, // check login status 
     cookie  : true, // enable cookies to allow the server to access the session 
     oauth  : true, // enable OAuth 2.0 
     xfbml  : true // parse XFBML 
    }); 
    }; 
    (function(d){ 
    var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;} 
    js = d.createElement('script'); js.id = id; js.async = true; 
    js.src = "//connect.facebook.net/en_US/all.js"; 
    d.getElementsByTagName('head')[0].appendChild(js); 
    }(document)); 
</script> 
1

不可能的了(2014年7月),但你總是可以並且仍然可以創建自己的iframe,並與從服務器重定向到一個整版FB登錄頁面填寫。

https://developers.facebook.com/docs/reference/dialogs/oauth/

如果您使用的是URL重定向對話框中執行,那麼這個 將是一個全頁顯示,內Facebook.com所示。這種顯示 類型被稱爲頁面。

的FB IFRAME曾在問題被要求要麼使用display: 'iframe'FB.ui()作爲穆斯塔法建議或使用FB.login()的時間(在某個時間點,它默認爲「對話」模式下,如果FB被正確inited,其他時間你也必須顯示模式)。

這是由於點擊劫持關閉,最有可能的早期2014 &。從以上鍊接的參考:

如果您使用的是JavaScript的SDK,這將默認爲一個彈出窗口 。如有必要,您還可以在使用 JavaScript SDK時強制使用彈出窗口或頁面類型。出於安全原因,iframe和async類型對於 登錄對話框無效。