2010-03-31 25 views
5

Próbuję zaimplementować witrynę logowania jednokrotnego na Facebooku Connect. Pierwotnie miałem przycisk Connect (<fb:login-button>), który użytkownik musiał kliknąć za każdym razem, gdy chciał się zalogować. Teraz mam już działa funkcje automatycznego logowania i wylogowania. Oznacza to, że moja witryna wykryje zalogowane konto Facebooka i automatycznie je uwierzytelni, jeśli znajdzie pasujące do jednego z kont użytkowników mojej strony i automatycznie deauthenticate, jeśli sesja na Facebooku zostanie utracona. Mam również przycisk ręcznego wylogowania, który wyloguje użytkownika zarówno z mojej strony, jak i Facebooka. Wszystkie te działają poprawnie, ale teraz mój oryginalny przycisk Connect nie jest wyświetlany nieprawidłowo. Po prostu pokazuje się jako zwykły XHTML (tj. Wygląda na zwykły tekst - nie przycisk - i nie można go skasować) i nie stosuje się XFBML. Oto kod podstawowy:Przycisk logowania do serwisu Facebook Connect nie renderowany

Na każdej stronie:

<body> 
{...} 
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script> 

<script type="text/javascript> 
FB.init('APIKey', '/xd_receiver.htm'); 

var isAuth; // isAuth determines if the user is authenticated on my site 
      // it should be true on the logout page, false on the login page 
FB.ensureInit(function(){ 
    var session = FB.Facebook.apiClient.get_session(); 
    if (session && !isAuth) { 
     PageMethods.FacebookLogin(session.uid, session.session_key, FBLogin, FBLoginFail); 
     // This is an AJAX call that authenticates the user on my site. 
    } else if(!session && isFBAuth) { 
     PageMethods.FacebookLogout(FBLogout, FBLogoutFail); 
     // This is an AJAX call that deauthenticates the user on my site. 
    } 
    // the callback functions do nothing at the moment 
}); 
</script> 

{...} 
</body> 

Na stronie logowania: (ta strona nie jest widoczna dla zalogowanych użytkowników)

<body> 
{...} 
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script> 

<script type="text/javascript> 
    FB.init('APIKey', '/xd_receiver.htm'); 
    {...} // auto-auth code as on every page 
</script> 

<!-- This is the button that fails to render --> 
<fb:login-button v="2" onlogin="UserSignedIntoFB();" size="large" autologoutlink="true"><fb:intl>Login With Your Facebook Account</fb:intl></fb:login-button> 

<script type="text/javascript"> 
    function UserSignedIntoFB() { 
     {...} // posts back to the server which authenticates the user on my site & redirects 
    } 
</script> 
{...} 
</body>  

Na stronie wylogowania: (ta strona nie jest widoczna dla zalogowanych użytkowników out)

<body> 
{...} 
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script> 

<script type="text/javascript> 
    FB.init('APIKey', '/xd_receiver.htm'); 
    {...} // auto-auth code as on every page 
</script> 

<script type="text/javascript"> 
    function FBLoggedOut() { 
     {...} // posts back to the server which deauthenticates the user on my site & redirects to login 
    } 

    function Logout() { 
     if (FB.Facebook.apiClient.get_session()) { 
      FB.Connect.logout(FBLoggedOut); // logs out of Facebook if it's a Facebook account 
      return false; 
     } else { 
      return true; // posts back if it's a non-Facebook account & redirects to login 
     } 
    } 
</script> 
<a onclick="return Logout();" href="postback_url">Sign Out</a> 
{...} 
</body> 

Niektóre rzeczy mam już spojrzał na:

  • Automatyczne logowanie i wylogowywanie działają znakomicie. Mogę zalogować się i wylogować z Facebooka na innej karcie, a moja strona zauważy zmiany sesji i odpowiednio je zaktualizuje.
  • Wydaje się, że wylogowanie działa poprawnie: po kliknięciu, deauthenticates użytkownika i loguje je z Facebook, zgodnie z przeznaczeniem.
  • Wydanie wydaje się być zwykle zdarza się po wylogowaniu użytkownika Facebooka, ale dzieje się to sporadycznie; może się zdarzyć, zanim się zalogują i zniknie po kilku minutach/odświeżeniu.
  • Niektóre pliki cookie pozostają po procesie logowania/wylogowania, ale ich usunięcie nie rozwiązuje problemu.
  • Ponowne uruchomienie przeglądarki nie rozwiązuje problemu.
  • Użytkownik jest zdecydowanie wylogowany z Facebooka i mojej witryny, gdy wystąpi problem. Sprawdziłem sesje Facebooka i uwierzytelnianie witryny.
  • Wszystkie wywołania skryptów zewnętrznych są wyświetlane poprawnie.
  • Edycja: Również, gdy przycisk logowania powoduje renderowanie, działa poprawnie.

Mam podejrzenie, że jest jeszcze coś muszę robić po wylogowaniu (jak wyczyszczenie sesji lub ciasteczka), ale według wszystkiego Czytałem o Facebook Connect, wszystko co musisz zrobić, to zadzwonić do wylogowania funkcja (i deauthenticate na mojej stronie serwera). Naprawdę jestem w stracie; czy ktokolwiek ma jakieś pomysły, co może być nie tak?

+0

najpierw spróbuję usunąć wszystkie oprócz FeatureLoader.js.php ładowanie + FB.Init + i sprawdź, czy wszystko jest w porządku. zależy od wyników tego eksperymentu, musisz kontynuować debugowanie. – zerkms

+0

Cóż, robię to na razie i wygląda na to, że działa, bez możliwości automatycznego logowania. Chciałbym tylko wiedzieć, gdzie idę źle. – tloflin

Odpowiedz

6

Upewnij się, że wywołasz facebook js include (FeatureLoader) na BARDZO KOŃCU twojej strony, więc twoja strona renderuje, a następnie JS Facebooka robi trochę magii po fakcie, aby zmienić tekst w przycisk. w przeciwnym razie jest to wyścig między wywołaniem serwerów fb a ładowaniem zawartości stron w przeglądarce ...

przynajmniej na ten problem napotkałem.

+1

Wstępnie akceptuję to jako odpowiedź, ponieważ wydaje się, że to zachowanie zniknęło, chociaż nie do końca przetestowałem. – tloflin

Powiązane problemy