20

我正在使用基于 NEW GraphAPI for Auth/Login 的 JS SDK for Facebook。

有人在FB.login()通过 JS SDK 调用后登录时遇到此问题吗?

问题:在我通过异步调用初始化之后FB.Init()(因为这一切都包含在一个window.fbAsyncInit函数中),登录弹出;我登录了,然后弹出窗口刷新显示一个白页,并且弹出窗口保持打开状态并且没有关闭...为什么?我正在等待检查FB.login()回调中的 response.session 但似乎我永远不会找回它,因为这个弹出窗口似乎只是停留在那里,并且该过程似乎在您登录后就停止了,我只是想出了这个弹出窗口-up 会自动关闭并在回调中向我返回 response.session。为什么弹出窗口不会消失?

我在登录后从弹出窗口中复制了 url,并在下面的 url 中显示为白色,所以看起来响应就在那里,但是为什么那个弹出窗口没有关闭,所以我的回调可以处理响应?

http://static.ak.fbcdn.net/connect/xd_proxy.php#?=&cb=f18fe0b7c66da54&origin=http%3A%2F%2Flocalhost%2Ff3745f32ed63a7a&relation=opener&transport=postmessage&frame=f18adb488566372&result=user_photos&session={%22session_key%22%3A%222.vH4SVCisnh8HJWjEI1Vy_Q__.3600.1280106000-100001379631246%22%2C%22uid%22%3A%22100001379631246%22%2C%22expires%22%3A1280106000%2C%22secret%22%3A%22TH45WFg8I_5r_cOoVIujjg__%22%2C%22access_token%22%3A%22132444323462464|2.vH4SVCisnh8HJWjEI1Vy_Q__.3600.1280106000-100001379631246|q123iPQcKY45xWXtOZ2ebOOZTQQ.%22%2C%22sig%22%3A%22a75e85af2354292bfdcf90b9d319ebf7%22}

我确实注意到,当调用 FB.login() 并且出现登录弹出窗口时,我在 FireBug 中看到了这个错误,说它不喜欢我在 localhost 上进行测试的事实或我猜的东西:

未捕获的异常:[异常...“组件返回失败代码:0x80004005 (NS_ERROR_FAILURE) [nsIDOMLocation.host]”nsresult:“0x80004005 (NS_ERROR_FAILURE)”位置:“JS 框架 :: chrome://smarterwiki/content/smarterwiki.js :: 匿名 :: 第 1225 行“数据:无]

这个错误困扰着我......我需要弄清楚它为什么会出现,我敢打赌我不是唯一一个在本地测试时看到这个的人。我在 Facebook 论坛或其他地方的任何地方都看不到有关在网络上解决此问题的任何信息。我看到其他人有这个问题,但没有解决方案。

所以当你实现你的,你的 Facebook 弹出窗口是在用户登录后关闭还是你需要做一些特别的事情来完成这个过程?

另外,我注意到如果我手动关闭该弹出窗口,然后检查是否生成了该 cookie 以包含我的会话,它不是(fbs_[yourappid]cookie)。所以看起来有些事情在这里过早地结束了。我的 init cookie: true 所以我想知道这个问题是否是弹出对话框没有关闭是否与我的测试 PC 上没有在客户端创建的 cookie 有关。

4

6 回答 6

2

当 facebook 最近对其“all.js”进行更改时,这个问题突然出现在我的网站上。

在他们的 javascript 的早期版本中,我遇到了一个特定于 IE 的问题,我从互联网上某人的帖子中复制了这段代码片段。看似晦涩难懂,却解决了当时的问题:

  // http://developers.facebook.com/bugs/204792232920393

  // Hack to fix http://bugs.developers.facebook.net/show_bug.cgi?id=20168 for IE7/8/9.
  FB.UIServer.setLoadedNode = function (a, b) { FB.UIServer._loadedNodes[a.id] = b; };
  FB.UIServer.setActiveNode = function(a, b) { FB.UIServer._active[a.id]=b; };

事实证明,这些线路对我造成了这个问题。我删除了它们,问题就消失了。我相信,IE 特有的原始错误也已在最新的“all.js”中得到修复。

于 2012-02-15T01:05:19.060 回答
2

我不知道你的代码是什么,但我的问题是我忘记添加 <div id="fb-root"></div>. 我的代码:

<div id="fb-root"></div>
<script src="http://static.ak.fbcdn.net/connect/en_US/core.js"></script>
<script>
    FB.init({ apiKey: 'app key'});
</script>
<div class="fbloginbutton" id="fb-login" onclick="Login();">
<span id="fb_login_text" >Login with Facebook</span>
</div>
<asp:Label ID="errMsg" runat="server"></asp:Label>
<script type="text/javascript">
    function Login() {
        FB.login(function(response) {
            document.getElementById('fb_login_text').innerHTML = 'Logout';
            if (response.session) {
                FB.api('/me', function(response) {
                    var str;
                    str = response['id'] + ";" +
                            response['name'] + ";" +
                            response['first_name'] + ";" +
                            response['last_name'] + ";" +
                            response['link'] + ";" +
                            response['birthday'] + ";" +
                            response['gender'] + ";" +
                            response['email'];
                    alert(str);
                });
            }
            else {
                document.getElementById('fb_login_text').innerHTML = 'Login with Facebook';
            }
        }, { perms: 'user_birthday,email' });
    };
</script> 

如您所见,我在任何地方都没有使用 div fb-root ,但它需要 facebook 登录工作!

于 2010-08-04T13:47:43.683 回答
2

我最近在这个问题上苦苦挣扎。这个问题不知从何而来,大概是由于 Facebook JS SDK 的一些变化。对于我计划不再使用 JS SDK 的价值,这些随机问题占用了我的时间。

无论如何,这是我用来解决这个问题的技巧。

var accessToken, fb_response;

if (window.location.hash.length < 30) {
  window.location = "http://www.facebook.com/dialog/oauth?client_id=YOUR_ID&redirect_uri=YOUR_URL&scope=YOUR_PERMISSIONS&response_type=token";
} else {
  fb_response = window.location.hash;
  accessToken = fb_response.substr(14, fb_response.indexOf("&expires") - 14);
  FB._authResponse = {
    accessToken: accessToken
  };
  window.location.hash = "";
  FB.api("/me", function(profile) {
    if (profile.id) {
       app_init();
    } else {
       alert("Problem connecting to Facebook");
    }
  }); 
}

基本上,我将用户发送到 Facebook oauth 对话框,当他们返回时,我从哈希中获取访问令牌。然后我在 Facebook 对象上设置内部访问令牌参数。完成此操作后,您可以进行所有正常的 Facebook Api 调用。

希望这可以帮助某人!对于未来的项目,我肯定会坚持使用服务器端身份验证流程,你有更多的控制权!

于 2012-04-20T10:21:54.993 回答
1

This is a working sample for me:

<!DOCTYPE html>
<html>
  <head>
    <title>Facebook Client-side Authentication Example</title>
  </head>
  <body>
    <div id="fb-root"></div>
    <script>
      // Load the SDK Asynchronously
      (function(d){
         var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
         if (d.getElementById(id)) {return;}
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/en_US/all.js";
         ref.parentNode.insertBefore(js, ref);
       }(document));

      // Init the SDK upon load
      window.fbAsyncInit = function() {
        FB.init({
          appId      : '00000000000000', // Your App ID
          channelUrl : '//'+window.location.hostname+'/channel', // Path to your Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies to allow the server to access the session
          xfbml      : true  // parse XFBML
        });

        // listen for and handle auth.statusChange events
        FB.Event.subscribe('auth.statusChange', function(response) {
          if (response.authResponse) {
            // user has auth'd your app and is logged into Facebook
            FB.api('/me', function(me){
              if (me.name) {
                document.getElementById('auth-displayname').innerHTML = me.name;
              }
            })
            document.getElementById('auth-loggedout').style.display = 'none';
            document.getElementById('auth-loggedin').style.display = 'block';
          } else {
            // user has not auth'd your app, or is not logged into Facebook
            document.getElementById('auth-loggedout').style.display = 'block';
            document.getElementById('auth-loggedin').style.display = 'none';
          }
        });

        // respond to clicks on the login and logout links
        document.getElementById('auth-loginlink').addEventListener('click', function(){
          FB.login();
        });
        document.getElementById('auth-logoutlink').addEventListener('click', function(){
          FB.logout();
        }); 
      } 
    </script>

    <h1>Facebook Client-side Authentication Example</h1>
      <div id="auth-status">
        <div id="auth-loggedout">
          <a href="#" id="auth-loginlink">Login</a>
        </div>
        <div id="auth-loggedin" style="display:none">
          Hi, <span id="auth-displayname"></span>  
        (<a href="#" id="auth-logoutlink">logout</a>)
      </div>
    </div>

  </body>
</html>
于 2012-06-12T20:21:59.620 回答
1

看来您正在尝试本地主机,您可以使用公共网址尝试一下。

我已经面临这个问题。但是我通过将应用程序中的画布 url 配置为公共 url(例如 www.something.com/test/)来解决它。

于 2011-09-28T12:07:50.277 回答
0

该网站明确表示 all.js 已过期。但是,我得到了与 sdk.js 相同的错误。回到折旧的 all.js 时问题已解决

// Old SDK (deprecated)
js.src = "//connect.facebook.net/en_US/all.js";

// New SDK (v2.x)
js.src = "//connect.facebook.net/en_US/sdk.js";

脸书 SDK

于 2016-02-25T21:54:52.733 回答