不需要弹出窗口的方式进行Facebook登录?

16

我正在尝试创建一个简单的Facebook应用程序,但在授权方面似乎总是被弹出窗口拦截器所阻止。因此,我的代码如下:

FB.init({
        appId  : THEAPPPIDDDD,
            status : true,
            cookie : true,
            xfbml  : true,
   });


FB.login(function(response) {
           if (response.authResponse) {
               FB.api('/me', function(response) {
               FB.logout(function(response) {
                               console.log('Logged out.');
                           });
                   });
           } else {
               console.log('User did not authorize.');
           }
       });

非常感谢,任何帮助都将不胜感激。


我认为没有弹出窗口是无法进行Facebook登录的 - 这是设计上的。这将会存在安全问题。为了防止大多数弹出拦截器拦截弹出窗口,您需要确保弹出窗口是直接因用户点击而产生的。未经用户发起的弹出窗口往往会被阻止。 - Robin Winslow
5个回答

29

我知道这个问题可能是另一个问题的重复:停止Facebook弹出窗口拦截器。我重新发布这个问题是为了帮助戴夫·张。我已经为我的一个网站改编了这段代码。在以下代码中,替换YOUR_APP_ID和您的网站URL,那么Facebook登录就不会再有弹出窗口了。

//Javascript
var uri = encodeURI('http://example.com');
FB.getLoginStatus(function(response) {
    if (response.status === 'connected') {
        window.location.href=uri;
    } else {
        window.location = encodeURI("https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri="+uri+"&response_type=token");
    }
});

这将直接重定向而不是打开弹出窗口。


1
在 Facebook 中,当在 iframe 中重定向时,应始终使用 top.location.href = 'URI_TO_REDIRECT' - orloxx
我尝试使用重定向方法,但是我收到了错误消息,说我的域名未包含在应用程序中。但是我已经做过了。 请查看此图像http://ibb.co/d8bBrm,请查看第二张图片,在那里我声明了应用程序域 - http://ibb.co/erMBrm - Abhay Srivastav 1小时前 - Abhay Srivastav
如果您尚未登录,则会将您发送到一个页面,上面显示“未登录:您尚未登录。请登录后重试。” - ricks

3

当涉及到Facebook时,登录过程应该始终由用户发起。因此,您应该在某个按钮的点击事件中启动您的登录代码。

只需在按钮点击事件中调用您的代码,问题就可以得到解决。


1
为了避免通过弹出窗口进行登录,您应该在服务器端启动身份验证。

有些应用程序只是客户端 - 因此使用按钮可以避免弹出问题。 - Alexander Mills

1

对于这个很有用的旧问题,我有一个小更新。我一直在收到错误信息,说该域名不被允许,但实际上它是允许的:

无法加载URL:此URL的域名未包含在应用程序的域中。要能够加载此URL,请将您的应用程序的所有域和子域添加到应用程序设置中的App Domains字段中。

因此,在进行了一些研究后,我发现您需要更改Facebook应用程序设置以允许这种导航:

  1. 强制使用HTTPS
  2. 对重定向URI使用严格模式
  3. 嵌入式浏览器OAuth登录(如果您使用应用程序Web视图) 需要启用设置

0

如果弹出窗口的操作不是由用户引起的事件触发,那么弹出窗口拦截器将始终被激活。例如,如果您尝试在加载事件上执行弹出窗口操作,则浏览器很可能会使用弹出窗口拦截器。另一方面,如果您在单击事件或按键事件上触发弹出窗口,则弹出窗口拦截器的触发可能性较小。

您还可以采用一种方法,使您的应用程序检测到是否已阻止弹出窗口。您可以在此处阅读更多相关信息。

正如其他答案中提到的那样,如果您希望完全不使用弹出窗口进行身份验证过程,则需要在服务器端使用OAuth进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接