5

Dokumentacja mówi: "redirect_uri - (opcjonalnie) Adres URL przekierowania użytkownika, gdy proces logowania/autoryzacji jest zakończony. Użytkownik zostanie przekierowany do Adres URL zarówno sukcesu powodzenia, jak i niepowodzenia, dlatego musisz sprawdzić parametry błędów w adresie URL, jak opisano w dokumentacji uwierzytelniającej. Jeśli ta właściwość nie zostanie określona, ​​użytkownik zostanie przekierowany do bieżącego adresu URL (tj. URL strony, na której znajduje się ten adres URL) wywołano metodę, zazwyczaj bieżący adres URL w przeglądarce użytkownika). " Istnieje więc metoda przechwytywania, jeśli użytkownik odmówił autoryzacji/uprawnień, ale link do odpowiedniej dokumentacji już nie istnieje (https://developers.facebook.com/docs/authentication/).facebook php sdk - catch, jeśli użytkownik nie dał uprawnień (uwierzytelnianie nie powiodło się)

Dla prostoty, redirect_uri jest taki sam jak adres wyjściowego pliku php, a kod PHP jest tak proste, jak:

require 'facebook.php'; 
$facebook = new Facebook(array(
    'appId' => 'X', 
    'secret' => 'Y', 
)); 
$user = $facebook->getUser(); 
if ($user) { 
    try { 
    $user_profile = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    error_log($e); 
    $user = null; 
    } 
} 
if (!$user) { 
    $params = array(
    'scope' => 'read_stream, friends_likes', 
    'redirect_uri' => 'http://myapp.com/app' 
); 
    $loginUrl = $facebook->getLoginUrl($params); 
} 

ktoś wie jak złapać te informacje?

Odpowiedz

11

można zrobić następujące czynności, aby sprawdzić uprawnienia:

$permissions = $facebook->api("/me/permissions"); 
if(array_key_exists('publish_stream', $permissions['data'][0])) { 
    // Permission is granted! 
    // Do the related task 
    $post_id = $facebook->api('/me/feed', 'post', array('message'=>'Hello World!')); 
} else { 
    // We don't have the permission 
    // Alert the user or ask for the permission! 
    header("Location: " . $facebook->getLoginUrl(array("scope" => "publish_stream"))); 
} 
+0

Wygląda na to, że jest jedyną opcją dostępne teraz ... Dziwne, mógłbym się założyć, że był sposób, aby zrobić to inaczej;) –

0

Należy zauważyć, że w najnowszym PHP facebook SDK, nie ma metody -> api. Wydaje się również, że problemem jest korzystanie z tego czeku (czasami) w celu uzyskania uprawnień. Podczas korzystania ze starszego SDK czasami (losowo przez użytkownika wydawało się) niektórzy użytkownicy otrzymywali "OAuthException: (# 412) Użytkownik nie zainstalował aplikacji", mimo że sprawdzenie debuggera dostępu do toka FB pokazało odpowiednie uprawnienia. Po aktualizacji do nowego zestawu SDK i ustaleniu nowego sposobu uzyskiwania prostej listy uprawnień, wszystko znów działało.

Znalezienie tego rozwiązania zajęło mi dużo kopania na stronie internetowej FB, więc wklejam go tutaj, aby, mam nadzieję, uratować kogoś jeszcze kilka godzin. Prawdziwym ratunkiem było moje odkrycie metody getDecodedBody (bardzo trudna do znalezienia sztuczka w dokumentach FB). Mój przykład po prostu sprawdza dla publish_actions.

$fb = new Facebook\Facebook([ 
    'app_id' => your_app_id, 
    'app_secret' => your_secret, 
    'default_graph_version' => 'v2.2', 
]); 

$badperms=true; //start by assume bad permissions 

try { 
    $response = $fb->get('/me/permissions', $at); 
    $perms = $response->getDecodedBody(); 

    if($badperms){ 
     foreach($perms['data'] AS $perm){ 
      if($perm['permission']=='publish_actions' && $perm['status']=='granted') $badperms=false; 
     } 
    } 

} catch(Facebook\Exceptions\FacebookResponseException $e) { 
    log("MSG-received facebook Response exception!! ".$e->getMessage()); 
} catch(Facebook\Exceptions\FacebookSDKException $e) { 
    log("MSG-received facebook SDK exception!! ".$e->getMessage()); 
} 

if($badperms) { 
    //do something like reflow auth 
} 
0

prostu miałem ten sam problem, nie wiem jak traktować działania Cancel (zarówno w php facebook google API i OAuth2).

Rozwiązanie jest znacznie łatwiejsze niż oczekiwano.

Odpowiedź w przypadku braku akceptacji uprawnień (w ogóle) zawiera co najmniej jeden parametr/zmienną: błąd w adresie URL.

na Facebooku, że reakcja wygląda następująco:

błędu = Odmowa dostępu & Error_Code = 200 & ERROR_DESCRIPTION = Uprawnienia + błąd & ERROR_REASON = user_denied

na google można dostać tylko

error = access_denied

ale powinno wystarczyć.

Właśnie sprawdzam, czy błąd jest ustawiony i jeśli jest ustawiony, przekierowuję odpowiedź na moją stronę logowania.

Mam nadzieję, że komuś pomoże, ponieważ tak naprawdę nie udokumentowano tego kroku. Przy okazji: wersja facebook API: v5 wersja Google API OAuth2: 2.0 (myślę - google doc jest naprawdę bałagan, jeśli chodzi o znalezienie najnowsze wersje)

Powiązane problemy