2011-09-07 11 views
5

Zrobiłem kilka wyszukiwań i nie znalazłem niczego, co było związane z moim problemem.Problem z logowaniem na Facebooku nie pasuje do tokenu CSRF

Obecnie próbuję zaimplementować login Facebooka na mojej stronie i mam problemy z uwierzytelnianiem logowania z powodu modowania htaccess do przepisywania adresów URL?

Kod działa doskonale i dostaję zalogowany jeżeli używam go bez mod zasad przepisywania takich jak:

domain.com/view_webhosting.php?webhosting=name 

Ale jak tylko przejść do mod rewrite URL

domain.com/webhosting-name/ 

Wtedy po prostu nie działa i zgłasza błąd "Żeton stanu CSRF nie pasuje do podanego."

w pliku .htaccess wygląda to

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

ktoś ma rozwiązanie problemu jak to? Używam Facebook SDK v3.1.1

Odpowiedz

7

PHP SDK oczekuje, że pole „state”, aby być w $ _REQUEST (wierzę jak parametr GET) po przekierowaniu, zanim będzie można wymienić "kod" dla tokena dostępu. Od base_facebook.php:

protected function getCode() { 
    if (isset($_REQUEST['code'])) { 
    if ($this->state !== null && 
     isset($_REQUEST['state']) && 
     $this->state === $_REQUEST['state']) { 

     // CSRF state has done its job, so clear it 
     $this->state = null; 
     $this->clearPersistentData('state'); 
     return $_REQUEST['code']; 
    } else { 
     self::errorLog('CSRF state token does not match one provided.'); 
     return false; 
    } 
    } 

    return false; 
} 

Twoja RewriteRule może tupnąć na ten param.

2

Zakładam, że masz na myśli PHP SDK?

Wygląda na to, że nie przekazujesz zmiennej żądania "stan" do skryptu PHP. Czytałeś https://developers.facebook.com/docs/authentication/ (w szczególności bity i chroniąc się przed CSRF?).

Również zakładam, że jest to literówka w swoim pytaniu, ale nie powinna być reguła przepisywania:

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?**webhosting**=$1 [L] 
+0

Cześć mrtom Tak, przepraszam, że to tylko typ, pomyślałem, że łatwiej byłoby przeczytać, kiedy przetłumaczyłem go na angielski :) Przykład użycia IM to https://github.com/facebook/php-sdk/blob/master/examples/ example.php i nie ma nic o ochronie CSRF? ten facebook API jest dziwny z różnymi kodami w całym miejscu. ale działa poprawnie, gdy nie używa się modyfikującego adresu url ... – John

1

Spróbuj zmienić RewriteRule do

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L,QSA] 

QSA = Query String dopisywania. Dzięki temu nie stracisz swoich parametrów GET.

7

Dzięki bismark.

Masz rację; nie może uzyskać parametry GET, a rozwiązanie było takie:

Od

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

do

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [QSA,L] 

ciąg kwerendy dołączyć [QSA]

•'qsappend|QSA' (query string append) 
This flag forces the rewrite engine to append a query string part of the substitution string 
to the existing string, instead of replacing it. Use this when you want to add more data 
to the query string via a rewrite rule. 

Dzięki chłopaki , postaw mnie na właściwym tropie!

+1

Jeśli bismark jest poprawny, dobrze jest przyjąć odpowiedź lub przynajmniej głosować. Głosowałem za twoim pytaniem, aby dać ci trochę powtórzenia. – Fionnuala

+0

Witaj Remou, masz absolutną rację, jestem trochę nowy na tej stronie, więc nie wiedziałem, że mogę głosować lub akceptować odpowiedzi :) – John

0

Jeśli ktoś nadal otrzymuje ten błąd po pliku .htaccess, zasugeruję zmianę parametru redirect_uri w pliku PHP, a także URL strony w ustawieniach aplikacji na Facebooku.

I rozwiązać ten błąd zmienia się od

http:domain.com/folder

do

http:domain.com/folder/index.php

-1

naprawiłem to przez (zapominając), aby dopasować zakres/uprawnienia z aplikacji do pozwoleń na developers.facebook.com/app strona ... (tj. Ustawienia aplikacji goto, uprawnienia).

+1

Możesz chcieć być nieco bardziej konkretny. –

0

Kod Facebooka SDK ma błąd podczas sprawdzania tokenów dwa razy w tym samym module obsługi.

edytowany funkcję getCode z facebook.php tak:

protected function getCode() { 
    if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) { 
     return false; 
    } 
    if ($this->state === $_REQUEST['state']) { 
     // CSRF state has done its job, so clear it 
     $this->state = null; 
     $this->clearPersistentData('state'); 
     return $_REQUEST['code']; 
    } 
    self::errorLog('CSRF state token does not match one provided.'); 

    return false; 
} 

być bardziej jasne i nie wskazuje nieprawidłową żeton jeśli wywoływana dwukrotnie.

Aby być jasne, że funkcja ta może być wywołana dwukrotnie na tej samej procedury obsługi adresów URL, jeśli na przykład:

$facebook->getUser(); a następnie w tym samym obsługi $facebook->getLogoutUrl() wtedy getCode() nazywa się dwukrotnie co prowadzi do i nieprawidłowy komunikat o błędzie

Powiązane problemy