Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Facebook Connect problem
Forum PHP.pl > Forum > XML, AJAX > AJAX
indexx
Witam

Męczę się z pewnym problemem odnośnie logowania z konta facebook na stronie, dane pobieram, wszystko jest ok ale za żadne skarby nie mogę wywołać pozwoleń dot email, tzn pobieram tylko podstawowe dane, a potrzebuję jeszcze email

Normalne wywołanie to:
  1. $facebook->getLoginUrl();


a, żeby uzyskać pozwolenie powinien wyglądać tak:

  1. $facebook->getLoginUrl(array('perms'=> 'email'));



Link nie zmienia się, a powinno zostać doklejone &perms=email

Ale niestety nie działa, czy ktoś już korzystał z tego i może wie jak ten problem rozwiązać?
#luq
Kod
'req_perms' => 'email'
gordon34
kontynuje watek. a jak potem wyswietlic taki adres albo np zapisac go do bazy ?!

dodalem do swojego
  1. $facebook->getLoginUrl(array('req_perms'=> 'email'));


ale niestety teraz mi nie przechodzi przez logowanie. nic w sesje nie wlatuje. co radzicie ?
pozdrawiam
#luq
Zapisać do bazy? A po co? Nie widzę najmniejszego sensu.
Po prostu robisz coś takiego:

  1. $session = $facebook->getSession();
  2. if(!$session){
  3. $url = $facebook->getLoginUrl(array('req_perms'=> 'email'));
  4. echo "<script type='text/javascript'>top.location.href = '$url';</script>";
  5. exit();
  6. }
  7.  
  8. // a tutaj wchodzi tylko user który zaakceptował dostęp appa do swoich danych
melkorm
Do sessji chyba zawsze możesz się dobrać, dopiero jak
  1. $fb->api('/me');

Rzuci wyjątkiem (FacebookApiException) to albo nie ma sessji, albo nie zaakceptował uprawnień.
#luq
Niee.

Sesja jest potrzebna do jakiejkolwiek operacji na graph api, tj popranie danych o userze, jego znajomych etc.
Sesje możemy pobrać (a właściwie to głównie o access_token chodzi) przez metodę getSession(), tak naprawdę nie musi być to zapisane w sesji, to gdzie to się zapiszę zależy od ustawień przeglądarki (tj. czy zaakceptuje ciacho z SIDem, jeśli nie to leci to GETem). Na stronie ustawionej jako główna strona appa w ustawieniach na fb możemy być pewni, że sesje dostaniemy, nie mam jej tylko w przypadku nie zaakceptowania uprawnień dostępowych wink.gif
melkorm
Zrobiłem szybki test:
1. Usunąłem się ze swojej aplikacji na FB.
Wynik:
Otrzymałem normalnie sessję, ponieważ jak sama dokumentacja PHP-SDK mówi:
Cytat
Logged in vs Logged out:
if ($facebook->getSession()) {
echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
} else {
echo '<a href="' . $facebook->getLoginUrl() . '">Login</a>';
}

Manual

A zapytania do API można robić tylko gdy się wykona poprawnie to:
Cytat
To make API calls:
try {
$me = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
}
#luq
Eee... spójrz TUTAJ
Cytat
If the user presses Allow (w sensie że w okienku z pytaniem o pozwolenia), your app is authorized. The OAuth Dialog will redirect (via HTTP 302) the user's browser to the URL you passed in the redirect_uri parameter with an authorization code:

(...)
Cytat
If your app is successfully authenticated and the authorization code from the user is valid, the authorization server will return the access token:
melkorm
Mówimy o różnych sposobach autoryzacji, ty mówisz o tokenach, a ja permanentnej akceptacji aplikacji - wtedy żadnych tokenów nie trzeba.

Ja tylko udowodniłem że sama sesja pozwala tylko stwierdzić czy użytkownik jest zalogowany na FB czy nie, a nie ma w niej żadnych informacji o tym iż zaakceptował naszą aplikację.
yevaud
Cytat(melkorm @ 29.03.2011, 00:57:11 ) *
Mówimy o różnych sposobach autoryzacji, ty mówisz o tokenach, a ja permanentnej akceptacji aplikacji - wtedy żadnych tokenów nie trzeba.

zawsze potrzebny jest token. Mozesz sie autentykowac jako aplikacja, ale wtedy masz token aplikacji. Nawet jesli user dal Ci uprawnienia offline, to dalej o ile sprawdzałem potrzebujesz jego tokenu - musisz go gdzies zapamietac.
Nie ma czegos takiego jak "permanentna akceptacja aplikacji", zawsze akceptujesz aplikacje na pewnych konkretnych warunkach ktore okreslone sa przez uprawnienia. Jesli user zaakceptuje prosbe o nadanie uprawnien dla aplikacji, wtedy aplikacja otrzymuje token. Jesli token sie przedawni, wtedy aplikacja nie ma juz dostepu do danych ktore udostepnial jej token. Nastepnym razem gdy user wejdzie i sie "zaloguje" (czyli utworzy i przekaze token), nie bedzie musial ponownie zgadzac sie na nadanie uprawnien, nawet do tego stopnia ze zostanie "samoczynnie zalogowany" czyli logowanie/przekazanietokenu przebiegnie bez zadnej interakcji z uzytkownikiem.

Cytat
Zapisać do bazy? A po co? Nie widzę najmniejszego sensu.

po to zeby wyslac userowi email, nawet jesli nie uzywa akurat aplikacji. Po to miedzy innymi sa te smieszne hashowane adresy email ktore leca przez facebook.com(z tego co pamietam zapisywanie innych w Twojej bazie jest niezgodne z regulaminem, ale i tak wszyscy to robia).

Cytat
Sesje możemy pobrać (a właściwie to głównie o access_token chodzi) przez metodę getSession()

sesja to nie do konca jest access token. Access token pobierasz za pomoca getAccessToken smile.gif


btw. co ten temat robi w dziale AJAX ?
#luq
Dlaczego mi dziś nikt nie wierzy sad.gif

http://apps.facebook.com/luq-foo

Kod:
  1. <?php
  2. require_once './facebook.php';
  3.  
  4. $facebook = new Facebook(array(
  5. 'appId' => 'xxx',
  6. 'secret' => 'xxx',
  7. 'cookie' => true,
  8. 'xfbml' => true,
  9. ));
  10.  
  11. $session = $facebook->getSession();
  12. echo '<pre>';
  13. print_r( $session );
  14. echo '</pre>';
  15. if(!$session){
  16. $url = $facebook->getLoginUrl(array(
  17. 'canvas' => 1,
  18. 'fbconnect' => 0,
  19. 'req_perms' => 'email'
  20. ));
  21. echo "<script type='text/javascript'>top.location.href = '$url';</script>";
  22. exit();
  23. }
  24. else{
  25. echo '<pre>';
  26. print_r($facebook->api('/me'));
  27. echo '</pre>';
  28. }
  29. ?>


Po prostu jak masz sesje dla aplikacji i tą aplikację usuniesz z "Aplikacje, z których korzystasz" to dalej masz przydzieloną sesję do niej bo jest ona przydzielana na określony czas...

@up
Cytat
Cytat
Cytat
Zapisać do bazy? A po co? Nie widzę najmniejszego sensu.


po to zeby wyslac userowi email, nawet jesli nie uzywa akurat aplikacji. Po to miedzy innymi sa te smieszne hashowane adresy email ktore leca przez facebook.com(z tego co pamietam zapisywanie innych w Twojej bazie jest niezgodne z regulaminem, ale i tak wszyscy to robia).

Ale to co zwróci getLoginUrl()?

Cytat
Cytat
Sesje możemy pobrać (a właściwie to głównie o access_token chodzi) przez metodę getSession()

sesja to nie do konca jest access token. Access token pobierasz za pomoca getAccessToken smile.gif

Aj tam czepiasz się słówek ;P Oczywiście chodziło mi o to że sesja jest złożona z access_token
  1. /**
  2.   * Gets a OAuth access token.
  3.   *
  4.   * @return String the access token
  5.   */
  6. public function getAccessToken() {
  7. $session = $this->getSession();
  8. // either user session signed, or app signed
  9. if ($session) {
  10. return $session['access_token'];
  11. } else {
  12. return $this->getAppId() .'|'. $this->getApiSecret();
  13. }
  14. }
yevaud
Cytat(#luq @ 29.03.2011, 01:53:43 ) *
Dlaczego mi dziś nikt nie wierzy sad.gif
Po prostu jak masz sesje dla aplikacji i tą aplikację usuniesz z "Aplikacje, z których korzystasz" to dalej masz przydzieloną sesję do niej bo jest ona przydzielana na określony czas...

smile.gif Sesja to nie token. Sesje masz tak dlugo jak dlugo uzytkownik jest zalogowany na facebooku i/lub ma wlaczone ciastka, nie znaczy to wcale ze aplikacja ma token.
Jesli odbierzesz uprawnienia z aplikacji, wtedy token pochodzi jeszcze chwile bo facebook propaguje zmiany, ale po chwili przestaje dzialac, a poniewaz dalej bedziesz go wysylal to facebook go odrzuci i dostaniesz krzaki

btw. dostep do czesci /me jest publiczny, token golej aplikacji wystarcza w pelni. Aby zadzialalo /me wystarczy nieautoryzowana sesja na tokenie zautentykowanej aplikacji

konczac temat sesji/tokenu: Facebookowa sesja moze zawierac token, ale nie musi. Sesja oznacza ze user jest zalogowany w facebooku, dostajesz wtedy w sesji jego uid. W momencie gdy user dodatkowo da uprawnienia dla aplikacji i przekaze jej token, wtedy token dopisywany jest do sesji, ale token nie jest sesja, sesja moze go opcjonalnie zawierac. Jesli nie ma sesji, to znaczy ze wszedl user ktory nie zalogowal sie na facebooku(moze nawet nie ma tam konta)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.