FB.getLoginStatus不会触发回调函数

12

我有一个难题。难题意味着我已经在网络、StackOverflow和整个FBJS SDK文档中搜索过,但都没有找到答案。

我正在构建一个页面选项卡应用程序,在其中我想让粉丝们确认参加活动。因此,我必须检查用户是否已登录,如果没有登录,则必须进行登录。听起来很容易,但是FB.getLoginStatus不会触发回调函数。以下是代码摘录:

FB.init({
   appId: window.appID,
   status: true,
   xfbml: true,
   cookie: true,
   oauth: true,
   channelUrl: 'http://example.com/fb/channel.html'
 }); 
然后我简单地调用了FB.getLoginStatus,当然是在用户点击按钮之后,但它似乎没有做任何事情。
我已经检查了沙盒模式、FB.init成功、应用程序设置和开发环境中的URL。我可以调用FB.ui,尽管使用方法为'oauth'的FB.ui会出现错误消息,提示“不能将'redirect_uri'参数与已弃用的'next'参数一起使用”。这非常奇怪,因为我没有使用“next”参数。但是当我将next设置为未定义时,它可以正常工作,我可以得到窗口,但它会显示“给定的URL不被应用程序配置允许”。除此之外,我可以登录,然后获得access_token。但在新窗口中,getLoginStatus仍然没有做任何事情。
所以欢迎任何建议。
谢谢, Tamas
更新:
function onBodyLoad() { //on body onload
    FB.init({
     appId: window.appID,
     status: true,
     xfbml: true,
     cookie: true,
     oauth: true,
     channelUrl: 'http://example.com/fb/channel.html'
    });     
   }
...
function getName() { // on button onclick
 FB.getLoginStatus(function(response){
  if (response.authResponse)
   {
    window.loggedIn = true;
    debugString('Logged in');
   } else
   {
    window.loggedIn=false; 
    debugString('Not logged in');
   }
}, true);
if (window.loggedIn === undefined)   {
     debugString('getLoginStatus did not exec'); // I always get this message
  }

}

更新2:我在不同的URL上创建了一个新应用程序,并将其配置为独立网站。在那里这些代码可以完美地工作,我可以获取登录状态,可以登录等。在FB的上下文中和使用FB JavaScript SDK的独立网站之间是否有任何差异?


你能提供更多的代码吗? - ifaour
7个回答

24

FB.getLoginStatus在网站运行的域名与注册应用程序的域名不同时,不会触发回调函数。通常我在本地或暂存服务器上开发时会遇到这种情况。

例如,如果您在example.com上注册了站点,而临时服务器为example.mystagingserver.com,则回调将不会触发。在这种情况下,您需要在Facebook中创建第二个应用程序,并使用新应用程序的应用程序ID和密钥。


我不知道发生了什么事,但昨天我再次检查了应用程序设置,应用程序域显示为可删除标签,而不是我过去看到的字符串,然后 - 哇啦 - 一切都像一个顺畅运行的机器一样工作。 - Sándor Tamás

3

我遇到了相同的问题,但只有一些用户遇到了这个问题。

最后我发现如果你的应用程序是沙箱模式,非开发人员用户仍然可以将你的应用程序视为页面选项卡。但是调用getLoginStatus会默默失败(即使记录已打开)。

花了一段时间才弄清楚,希望这能为其他人节省一些时间。


2

我正在使用这段代码,它很成功。我不太确定其中的差异在哪里..但我正在使用异步FB加载器。

 window.fbAsyncInit = function() {
   FB.init({ appId: 'XXXXXX', //change the appId to your appId
             status: true, 
             cookie: true,
             xfbml: true,
             oauth: true});

 function authEvent(response) {

   if (response.authResponse) {
          //user is already logged in and connected
           FB.api('/me', function(info) {
              login(response, info);
            });
    } else {
          //user is not connected to your app or logged out
           button.onclick = function() {
            FB.login(function(response) {
            if (response.authResponse) {
               FB.api('/me', function(info) {
                   login(response, info);
              });   
                } else {
               //user cancelled login or did not grant authorization
             }
         }, {scope:'email,rsvp_event,status_update,publish_stream,user_about_me'});     
                    }
                }
            }

            // run once with current status and whenever the status changes
            FB.getLoginStatus(updateButton);
            FB.Event.subscribe('auth.statusChange', updateButton);  
        };
        (function() {
            var e = document.createElement('script'); e.async = true;
            e.src = document.location.protocol 
                + '//connect.facebook.net/en_US/all.js';
            document.getElementById('fb-root').appendChild(e);
        }());


        function login(response, info){
            if (response.authResponse) {
                accessToken =   response.authResponse.accessToken;
        userid = info.id;


                userInfo.innerHTML  = '<img src="https://graph.facebook.com/' + info.id + '/picture">' + info.name+"<br /> Your Access Token: " + accessToken;
            }
        }

1
您可以使用以下代码来检查用户是否已登录:
FB.getLoginStatus(function(response) {
    if (response.authResponse) {
        // logged in and connected user, someone you know
    } else {
        // no user session available, someone you dont know
    }
});

来自FB JS SDK文档

你可以用jQuery ready来包装整个代码:

$('document').ready(function(){
    ... above code
})

另外,您可能想要查看这个StackOverflow问题


2
那是个糟糕的部分,因为回调函数不会在getLoginStatus上运行...就像我在原始问题中所说的。我看了你提到的问题,但没有帮助。 - Sándor Tamás
我遇到了同样的问题,只有在用户登录后才会调用FB.getLoginStatus。 - thesmart
我已登录,但没有这样的运气 :O - Jamie Hutber

0

我曾经遇到过同样的问题。我正在处理我们网站的Facebook登录流程。在开发过程中,“FB.getLoginStatus”没有返回响应。我在Facebook应用程序的设置中解决了这个问题:

- 在Facebook中进入“管理应用程序”

- 进入您的应用程序的“Facebook登录”设置

- 将您的开发URL(例如“https://localhost”)添加到“有效的OAuth重定向URI”中

(完成开发后,不要忘记从OAuth重定向URI中删除“https://localhost”。)


0

导致此问题的常见原因是浏览器阻止了cookie,这将导致事件无法触发。另外,请确保您或您的用户没有使用广告拦截器来阻止第三方cookie。

警告示例:

enter image description here


-1

经过广泛的测试,我可以确认,除非您使用有效的应用程序ID,否则记录用户的对话框不会显示。

这些可以在...中找到。

https://developers.facebook.com/apps/{{Application__Id}}/settings/

请确保使用正确的 ID 调用 API。


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