2010-07-25 71 views
20

我使用基于新的GraphAPI的Facebook的JS SDK用于身份验证/登录。JS SDK FB.login()工作,但弹出对话框保持打开登录后

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

问题:后我初始化通过调用FB.Init()异步的(因为这一切都包裹在一个window.fbAsyncInit功能)登录弹出;我登录后,弹出窗口刷新显示白色页面,弹出窗口保持打开状态,不会关闭......为什么?我正在等待检查FB.login()回调中的response.session,但似乎我从来没有回过头来,因为这个弹出窗口似乎只是停留在那里,在你登录后这个过程似乎停止了,我只是想到了这一点弹出窗口会关闭,并自动返回回调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()被调用,登录弹出来了,我看到在萤火此错误谈到如何不喜欢我测试过的事实我想:

未捕获的异常:[异常...]组件返回失败代码:0x80004005(NS_ERROR_FAILURE)[nsIDOMLocation.host]“nsresult:”0x80004005(NS_ERROR_FAILURE)“位置:”JS框架:: chrome ://smarterwiki/content/smarterwiki.js :: anonymous :: line 1225“data:no]

那个错误困扰我......我需要弄清楚它为什么会出现,而我打赌你我并不是唯一一个在本地测试过的人。我没有看到任何信息,但无论是在Facebook论坛还是其他地方,都可以通过网络进行故障排除。我看到其他人有这个问题,但没有解决。

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

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

+0

我有同样的问题,问题得到了解决。 CoffeeAddict,你解决这个问题吗? – Kate 2010-08-04 09:38:03

+0

我在最新版本的Chrome和Facebook的JavaScript SDK的最新版本中遇到同样的问题。 CoffeeAddict,你能解决这个问题吗? – Jaffer 2011-05-24 12:04:26

+0

这里同样的问题。尝试了自定义频道网址,确保我的FB.init参数适用于OAuth 2.0,所有内容都很好。没有。在Firefox中,它工作正常。也许这只是异步加载的问题?我会尝试同步带FB。 – mikermcneil 2011-09-06 01:01:50

回答

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登录工作!

+1

请注意,星期六后,response.session将无法使用!您需要使用oauth调用FB.init():true以使用OAuth2迁移到JS API。 https://developers.facebook.com/docs/oauth2-https-migration/ – Abby 2011-09-27 07:26:26

+0

为了扩大Abby的说法,您需要将'response.session'更改为'response.authResponse',并将权限请求从'perms'到'范围' – 2011-12-30 23:57:44

+0

除了你没有使用authResponse这是我的正确答案,我忘了在移动我的代码后添加“fb-root”。 – 2012-04-05 16:06:19

1

看来你正在尝试本地主机,你可以试试它与公共网址。

我已经遇到了这个问题。但我通过在应用程序中将画布URL配置为公共URL(例如www.something.com/test/)来解决此问题。

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”中也被修复了。

+0

我注意到了这里。现在我必须更新我所有的应用程序:-( 显然channelUrl现在引起IE上的问题,所以我删除了它。 – sbaechler 2012-02-15 17:21:54

+0

他们总是在不通知的情况下更改他们的代码......感谢您发现此问题。 – bcm 2012-02-15 23:36:15

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调用。

希望这可以帮助别人! 对于未来的项目,我一定会坚持服务器端的认证流程,你有更多的控制!

1

这是一个工作样本对我来说:

<!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> 
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"; 

facebook sdk