12

我有一个难题。困难意味着我搜索了网络和 StackOverflow 以及整个 FBJS SDK 文档,但没有找到答案。

我正在构建一个页面选项卡应用程序,我想让粉丝参与 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,尽管使用方法:'oauth' 的 FB.ui 我收到一条错误消息,指出““redirect_uri”参数不能与“next”参数一起使用,已弃用。”。这很奇怪,因为我没有使用“下一个”参数。但是当我在未定义旁边设置时,它工作正常,我得到窗口,但它显示“应用程序配置不允许给定 URL。”。期待,我可以登录,然后我得到了 access_token。但是在新窗口中,getLoginStatus 仍然没有做任何事情。

所以欢迎任何建议。

谢谢, 塔马斯

更新

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 上创建了一个新的应用程序,它被配置为一个独立的网站。这些代码可以完美运行,我可以获取LoginStatus,我可以登录等。在 FB 的上下文中和在独立网站中使用 FB JavaScript SDK 有什么区别吗?

4

7 回答 7

24

FB.getLoginStatus当您在与您注册应用程序的域不同的域上运行网站时,不会触发回调。当我在本地或登台服务器上开发时,我通常会发现自己处于这种情况。

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

于 2011-09-29T15:32:50.933 回答
3

我只是遇到了同样的问题,尽管它只发生在某些用户身上。

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

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

于 2012-02-27T16:44:30.723 回答
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;
            }
        }
于 2011-09-25T02:49:40.553 回答
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

于 2011-09-23T01:11:49.547 回答
0

我有同样的问题。我正在处理我们网站的 facebook 登录过程。在开发过程中,“FB.getLoginStatus”没有返回响应。我在 facebook 上的应用程序设置中修复了它:

- 在 facebook 中转到“管理应用程序”

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

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

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

于 2019-05-27T15:16:36.010 回答
0

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

警告示例:

在此处输入图像描述

于 2019-11-14T14:45:33.503 回答
-1

对我来说,经过广泛的测试可以确认登录用户的对话框不会显示,除非您使用有效的Application ID

这些可以在

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

只需确保使用正确的 ID 调用 api。

于 2016-06-20T16:01:15.110 回答