2010-07-25 25 views
20

Tôi đang sử dụng SDK JS cho Facebook dựa trên NEW GraphAPI cho Tự động/Đăng nhập.JS SDK FB.login() hoạt động nhưng hộp thoại bật lên vẫn đang mở sau khi đăng nhập

Có ai gặp vấn đề này khi đăng nhập sau khi FB.login() được gọi qua SDK JS không?

Vấn đề: sau khi tôi khởi tạo bằng cách gọi FB.Init() không đồng bộ (vì tất cả điều này được bọc trong một hàm window.fbAsyncInit) đăng nhập bật lên; Tôi đăng nhập nhưng sau đó cửa sổ bật lên làm mới để hiển thị một trang trắng và cửa sổ bật lên vẫn mở và không đóng ... tại sao? Tôi đang chờ đợi để kiểm tra response.session trong gọi lại FB.login() nhưng có vẻ như tôi không bao giờ lấy lại vì cửa sổ bật lên này dường như chỉ dính vào đó và quá trình này dường như chỉ dừng lại sau khi bạn đăng nhập và tôi đã chỉ ra điều này pop-up sẽ chỉ đóng và trả lại cho tôi response.session trong tự động gọi lại. Tại sao cửa sổ bật lên đó không biến mất?

Tôi đã sao chép url từ cửa sổ bật lên sau khi tôi đăng nhập và hiển thị màu trắng url sau để có vẻ như phản hồi ở đó nhưng tại sao cửa sổ bật lên không đóng để cuộc gọi lại của tôi có thể xử lý Phản hồi??

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} 

tôi đã thông báo rằng khi FB.login() được gọi và đăng nhập pop-up hiện ra, tôi thấy lỗi này trong Firebug nói về nó như thế nào không thích thực tế là tôi đang thử nghiệm trên localhost hoặc một cái gì đó tôi đoán:

ngoại lệ chưa thực hiện: [Ngoại lệ ... "Mã lỗi trả về thành phần: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMLocation.host]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: chrome : //smarterwiki/content/smarterwiki.js :: anonymous :: line 1225 "data: no]

lỗi đó làm phiền tôi ... Tôi cần tìm hiểu lý do tại sao nó xuất hiện và tôi đặt cược bạn tôi không phải là người duy nhất đã thấy điều này khi thử nghiệm cục bộ. Tôi thấy không có thông tin mặc dù trên xử lý sự cố này trên mạng bất cứ nơi nào hoặc trên các diễn đàn Facebook hoặc ở nơi khác. Tôi thấy những người khác đã gặp vấn đề này nhưng không có giải pháp.

Vì vậy, khi bạn đã triển khai, cửa sổ bật lên facebook của bạn chỉ đóng sau khi người dùng đăng nhập hoặc bạn có cần làm điều gì đó đặc biệt để hoàn thành quá trình này không?

Ngoài ra, tôi nhận thấy nếu tôi đóng cửa sổ bật lên theo cách thủ công thì hãy kiểm tra xem cookie đó đã được tạo để chứa phiên của tôi chưa, nó không phải (cookie fbs_[yourappid]). Vì vậy, có vẻ như một cái gì đó kết thúc sớm ở đây. Tôi đã có trong init cookie của tôi: true vì vậy tôi tự hỏi nếu vấn đề này là hộp thoại pop-up không đóng cửa có liên quan đến cookie cũng không được tạo ra phía máy khách trên máy tính thử nghiệm của tôi.

+0

Tôi có cùng một vấn đề. CoffeeAddict, bạn có giải quyết vấn đề này không? – Kate

+0

Tôi gặp sự cố tương tự trong phiên bản Chrome mới nhất và phiên bản SDK SDK mới nhất của Facebook. CoffeeAddict, bạn có thể sửa lỗi này không? – Jaffer

+0

Cùng một vấn đề ở đây. Đã thử URL kênh tùy chỉnh, đảm bảo mọi thứ đều tốt với thông số FB.init của tôi cho OAuth 2.0. Không có gì. Trong Firefox, nó hoạt động tốt. Có lẽ đây chỉ là vấn đề với tải không đồng bộ? Tôi sẽ thử đưa FB một cách đồng bộ. – mikermcneil

Trả lời

2

Tôi không biết mã của bạn là gì, nhưng vấn đề của tôi là tôi quên thêm <div id="fb-root"></div>. Mã của tôi:

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

Như bạn thấy tôi không sử dụng div fb-root ở bất kỳ đâu nhưng được yêu cầu đăng nhập facebook!

+1

Lưu ý rằng response.session sẽ không hoạt động sau Thứ Bảy! Bạn đã neeed FB.init() với oauth: true để di chuyển lên JS API với OAuth2. https://developers.facebook.com/docs/oauth2-https-migration/ – Abby

+0

Để mở rộng những gì Abby đã nói, bạn cần thay đổi 'response.session' thành' response.authResponse' và thay đổi yêu cầu quyền từ 'perms' đến 'scope' –

+0

bên cạnh bạn không sử dụng authResponse đây là câu trả lời đúng cho tôi, tôi quên thêm" fb-root "sau khi di chuyển mã của tôi. –

1

Dường như bạn đang thử localhost, bạn có thể dùng thử với url công khai không.

Tôi đã gặp sự cố này. Nhưng tôi đã giải quyết nó bằng cách định cấu hình url canvas trong ứng dụng dưới dạng url công khai (ví dụ: www.something.com/test/).

2

Sự cố này đã xuất hiện từ hư không cho trang web của tôi, khi facebook thực hiện thay đổi gần đây với "all.js" của nó.

Trong phiên bản cũ hơn của javascript, tôi gặp sự cố cụ thể với IE và tôi đã sao chép đoạn mã nhỏ này từ bài đăng của ai đó trên internet. Nó có vẻ khó hiểu, nhưng đã giải quyết được vấn đề tại thời điểm đó:

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

Hóa ra những dòng này đã gây ra vấn đề này cho tôi. Tôi đã xóa chúng và sự cố đã biến mất. Lỗi ban đầu cụ thể cho IE cũng đã được sửa, tôi tin rằng, trong "all.js" gần đây nhất.

+0

Tôi nhận thấy điều tương tự ở đây. Bây giờ tôi phải cập nhật tất cả các ứng dụng của mình :-( Rõ ràng channelUrl đang gây ra sự cố trên IE hiện tại cũng tốt vì vậy tôi đã xóa nó – sbaechler

+0

chúng luôn thay đổi mã của chúng mà không cần thông báo ... cảm ơn vì đã phát hiện ra điều này. – bcm

2

Tôi đã gặp khó khăn với vấn đề này gần đây. Vấn đề xuất hiện từ đâu, có lẽ từ một số thay đổi trong Facebook JS SDK. Đối với những gì giá trị của nó tôi có kế hoạch không bao giờ sử dụng JS SDK một lần nữa, những vấn đề ngẫu nhiên ăn lên thời gian của tôi.

Dù sao ở đây là hack mà tôi đã sử dụng để giải quyết vấn đề.

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

Về cơ bản tôi gửi người dùng đến hộp thoại Facebook oauth và khi họ quay lại, tôi lấy mã thông báo truy cập từ băm. Sau đó tôi đặt thông số mã thông báo truy cập nội bộ trên đối tượng Facebook. Một khi điều này được thực hiện, bạn có thể thực hiện tất cả các cuộc gọi Facebook Api bình thường.

Hy vọng điều này sẽ giúp ai đó! Đối với các dự án tương lai, tôi chắc chắn sẽ gắn bó với luồng auth phía máy chủ, bạn có nhiều quyền kiểm soát hơn!

1

Đây là một mẫu làm việc cho tôi:

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

Trang web này nói rõ rằng all.js hết hạn. Tuy nhiên, tôi nhận được cùng một lỗi bạn chỉ nhận được với sdk.js. Vấn đề đã được cố định khi quay trở lại all.js khấu hao

// 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

Các vấn đề liên quan