How to do FB.ui({ method: 'auth.login' ...) with display: 'iframe' instead of 'popup'?
我正在为一个简单的 Facebook 应用程序登录。我可以使用 JavaScript SDK 在弹出窗口中使用 FB.login 或以下代码成功显示登录/扩展权限对话框:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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'); } } ); |
问题是……我不太喜欢弹出窗口。从 UI 的angular来看,我认为他们感觉不舒服,就像他们不属于应用程序的其余部分一样。让它们通过 JavaScript 显示还需要用户无缘无故地进行一次额外的点击——为了绕过弹出窗口拦截器,用户必须点击登录按钮之类的东西(基本上没有意义,因为到那时应用程序知道它需要显示一个登录按钮,它已经知道用户需要登录并且还可以只显示权限对话框)。
所以,我想,为什么不用 iframe 来代替呢?弹出窗口拦截器没有问题,很好地嵌入到页面中,Facebook 似乎很喜欢它们。
在最近的 (2.1.2) JavaScript SDK 源代码和 Facebook 开发者论坛上的各种其他帖子中稍作挖掘似乎表明可以将"display: 'iframe'"作为选项的一部分传递给 FB.ui。
但是当我尝试它时,虽然 iframe 确实出现了,但我没有得到权限对话框,而是得到:
"An error occurred with . Please try again later."
(注意:稍后再试会产生相同的结果。)
有什么技巧可以让它工作,还是因为某种原因被禁止?
不再可能(2014 年 7 月),但您始终可以并且仍然可以创建自己的 iframe,并使用从您的服务器重定向到完整页面 FB 登录的页面填充它。
请参阅 https://developers.facebook.com/docs/reference/dialogs/oauth/:
If you are using the URL redirect dialog implementation, then this
will be a full page display, shown within Facebook.com. This display
type is called page.
FB iframe 在提出问题时工作,要么按照 Mustafa 的建议将
此功能已关闭,很可能是 2014 年初
尝试使用 FB.login 而不是 FB..ui。如果用户已经登录,并通过 FB.login 授予了您要求的权限,则没有对话框。否则会显示一个"内联"请求额外的权限/登录。
在用户已经登录的情况下使用登录功能获得更多权限有点违反直觉。但它确实有效。
你可以试试这个:
我大约在 6 个月前使用了以下方法。 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | outh dialog 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); } 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)); |