FB.getLoginStatus不会触发回调函数

时间:2011-09-23 00:13:03

标签: facebook facebook-graph-api oauth facebook-oauth

我遇到了一个棘手的问题。困难意味着我搜索了网络和StackOverflow以及整个FBJS SDK文档并且没有找到答案。

我正在构建一个Page Tab应用程序,我想让粉丝们参加rsvp活动。所以我必须检查用户是否已登录,如果不是,我必须登录。这听起来很简单,但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,尽管FB.ui的方法是:'oauth'我收到一条错误消息,说“”redirect_uri“参数不能与”next“参数一起使用,这个参数已被弃用。”这很奇怪,因为我没有使用“next”参数。但是当我在undefined旁边设置时,它工作正常,我得到了窗口,但它说“应用程序配置不允许给定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 :我在不同的网址上创建了一个新应用,该网址配置为独立网站。这些代码完美无缺,我可以获取登录状态,我可以登录等。在FB的上下文中,在独立网站中使用FB JavaScript SDK有什么区别吗?

7 个答案:

答案 0 :(得分:21)

当您在与注册应用程序的域不同的域上运行网站时,

FB.getLoginStatus不会触发回调。当我在本地或登台服务器上进行开发时,我经常发现自己处于这种情况。

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

答案 1 :(得分:3)

我遇到了同样的问题,但只发生在一些用户身上。

我终于发现,如果您的应用是沙箱模式,那么非开发者用户仍然可以将您的应用视为页面标签。但调用getLoginStatus将无声地失败(甚至打开日志记录)。

花一点时间想出那个,我希望这可以节省一些时间。

答案 2 :(得分:2)

我正在成功使用此代码。我不太确定差异在哪里..但我正在使用ASYNC FB Loader。

 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;
            }
        }

答案 3 :(得分:0)

您可以使用以下代码检查用户是否已登录:

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 Documentation

您可以将整个代码包装在jQuery准备就绪中:

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

您也可以查看this question StackOverflow

答案 4 :(得分:0)

我有同样的问题。我正在研究我们网站的Facebook登录过程。在开发过程中,“ FB.getLoginStatus”未返回响应。我在Facebook上的应用设置中对其进行了修复:

-在Facebook中转到“管理应用”

-转到您应用的“ facebook登录”设置

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

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

答案 5 :(得分:0)

导致这种情况的常见原因是浏览器阻止了cookie,这将导致事件不会触发。另外,请确保如果您或您的用户拥有and广告拦截器,并且该广告拦截器不会拦截第三方Cookie。

警告示例:

enter image description here

答案 6 :(得分:-1)

经过大量测试后,对我来说,除非您使用有效的Application ID

,否则可以确认用户登录对话框不会显示

这些可以在

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

请确保使用正确的ID呼叫api。