2010-07-25 5 views
20

Ich benutze das JS SDK für Facebook auf der Grundlage der neuen GraphAPI für Auth/Login.JS SDK FB.login() funktioniert aber Pop-up-Dialog bleibt offen nach dem Einloggen

Hat jemand dieses Problem bei der Anmeldung nach FB.login() wurde über das JS SDK aufgerufen?

Das Problem: nachdem ich initialisieren, indem FB.Init() asynchron aufrufen (weil dies alles in einer window.fbAsyncInit Funktion verpackt) die Anmeldung erscheint; Ich logge mich ein, aber dann wird das Pop-up aktualisiert, um eine weiße Seite anzuzeigen, und das Pop-up bleibt geöffnet und schließt nicht ... warum? Ich warte darauf, response.session in der FB.login() Rückruf zu überprüfen, aber es scheint, als ob ich es nie zurückbekommen, weil dieses Pop-up scheint nur dort zu bleiben und der Prozess scheint nur zu stoppen, nachdem Sie eingeloggt sind und ich dachte gerade dies pop-up würde mich einfach schließen und mir die response.session im Callback automatisch zurückgeben. Warum sollte das Pop-up nicht verschwinden?

Ich kopierte die URL aus dem Pop-up, nachdem ich angemeldet bin und weiß die folgende URL, so sieht es aus wie die Antwort ist da, aber warum ist das Popup-Fenster nicht geschlossen, so dass mein Callback verarbeiten kann die Antwort??

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} 

Ich habe bemerkt, dass, wenn FB.login() aufgerufen wird und die Anmeldung Pop-up kommt, ich diesen Fehler in FireBug sehen darüber reden, wie es nicht die Tatsache, dass ich bin Tests über localhost oder etwas, was ich denke:

abgefangene Ausnahme: [Exception ... "Component Fehlercode zurückgegeben: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMLocation.host]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" Ort: „JS Rahmen :: Chrom : //smarterwiki/content/smarterwiki.js :: anonymous :: line 1225 "daten: no]

dieser fehler stört mich ... ich muss herausfinden, warum es aufkommt und ich Ich wette, ich bin nicht der Einzige, der das beim Testen vor Ort gesehen hat. Ich sehe jedoch keine Informationen zur Fehlerbehebung im Internet irgendwo in den Facebook-Foren oder anderswo. Ich sehe, dass andere dieses Problem hatten, aber keine Lösung.

Also, als Sie Ihre implementiert haben, ist Ihr Facebook-Pop-up einfach geschlossen, nachdem der Benutzer angemeldet ist oder mussten Sie etwas Spezielles tun, um diesen Prozess zu beenden?

Ich merke auch, wenn ich das Pop-up manuell schließe, dann gehe, um zu überprüfen, ob dieser Cookie generiert wurde, um meine Sitzung zu enthalten, ist es nicht (der fbs_[yourappid] Cookie). Es sieht also so aus, als würde hier etwas vorzeitig enden. Ich habe in meinem init cookie: true, also frage ich mich, ob dieses Problem war, dass der Pop-up-Dialog nicht schließen ist, dass der Cookie auch nicht clientseitig auf meinem Test-PC erstellt wird.

+0

Ich habe das gleiche Problem. CoffeeAddict, lösen Sie dieses Problem? – Kate

+0

Ich habe das gleiche Problem in der neuesten Version von Chrome und der neuesten Version von Facebook Javascript SDK. CoffeeAddict, konntest du das reparieren? – Jaffer

+0

Das gleiche Problem hier. Ich habe versucht, die URL des benutzerdefinierten Channels zu überprüfen. Stellen Sie sicher, dass alles mit meinen FB.init-Parametern für OAuth 2.0 gut war. Nichts. In Firefox funktioniert es gut. Vielleicht ist das nur ein Problem beim asynchronen Laden? Ich werde versuchen, FB synchron zu bringen. – mikermcneil

Antwort

2

Ich weiß nicht, was Ihr Code ist, aber mein Problem war ich vergessen zu <div id="fb-root"></div> hinzufügen. Mein Code:

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

Wie Sie sehe ich nicht verwenden div fb-root überall, aber es ist requered Book Login Arbeit!

+1

Beachten Sie, dass response.session nach Samstag nicht funktioniert! Sie haben FB.init() mit oauth: true benötigt, um mit OAuth2 auf die JS-API zu migrieren. https://developers.facebook.com/docs/oauth2-https-migration/ – Abby

+0

Um zu erweitern, was Abby gesagt hat, müssen Sie 'response.session' zu' response.authResponse' ändern und die Berechtigungsanfrage von 'perms' ändern zu "scope" –

+0

außer Sie sind nicht mit authResponse das ist die richtige Antwort für mich, ich habe vergessen, die "fb-root" nach dem Verschieben meines Codes hinzuzufügen. –

1

Es scheint, dass Sie den localhost versuchen, können Sie es mit der öffentlichen URL versuchen.

Ich war schon mit diesem Problem konfrontiert. Aber ich habe es gelöst, indem ich die Canvas-URL in der Anwendung als öffentliche URL konfiguriert habe (Beispiel. Www.something.com/test/).

2

Dieses Problem erschien aus dem Nichts für meine Website, als Facebook eine vor kurzem Änderung seiner "all.js".

In einer früheren Version von ihrem Javascript hatte ich ein Problem, das spezifisch für IE ist, und ich kopierte dieses kleine Codeschnipsel von jemandes Beitrag im Internet. Es schien kryptischen, aber löste das Problem damals:

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

Es stellt sich heraus, diese Zeilen für mich dieses Problem verursacht wurden. Ich entfernte sie und das Problem ging weg. Der ursprüngliche IE-spezifische Bug wurde, glaube ich, auch in den letzten "all.js" behoben.

+0

Mir ist das hier gleich aufgefallen. Jetzt muss ich alle meine Apps updaten :-( Anscheinend verursacht der ChannelUrl jetzt auch Probleme im IE, also habe ich ihn entfernt. – sbaechler

+0

sie ändern ihren Code immer ohne vorherige Ankündigung ... Danke, dass du das bemerkt hast. Das Problem wurde behoben! – bcm

2

Ich hatte vor kurzem mit diesem Problem zu kämpfen. Das Problem tauchte von nirgendwo auf, vermutlich von einigen Änderungen im Facebook JS SDK. Für das, was es wert ist, das JS-SDK nie wieder zu verwenden, verschlingen diese zufälligen Probleme meine Zeit.

Wie auch immer, hier ist der Hack, den ich verwendet habe, um das Problem zu umgehen.

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

Grundsätzlich I den Benutzer auf die Face oauth Dialog senden und wenn sie kehre ich das Zugriffstoken aus dem Hash greifen. Ich habe dann den internen Zugriff Token Parameter auf dem Facebook-Objekt gesetzt. Sobald dies erledigt ist, können Sie alle normalen Facebook API Anrufe tätigen.

Hoffentlich hilft das jemand! Für zukünftige Projekte werde ich auf jeden Fall an einem serverseitigen Auth Flow bleiben, Sie haben viel mehr Kontrolle!

1

Dies ist ein funktionstüchtiges Beispiel für mich:

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

Die Website sagt deutlich, dass all.js abgelaufen ist. Allerdings bekomme ich den gleichen Fehler, den Sie nur mit sdk.js bekommen haben. Problem wurde behoben, wenn zu dem abgeschriebenen all.js ging zurück

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

Verwandte Themen