5

Dokumentation sagt: "redirect_uri - (optional) Die URL zum Umleiten des Benutzers, sobald der Anmelde -/Autorisierungsprozess abgeschlossen ist. Der Benutzer wird an die weitergeleitet URL sowohl bei erfolgreichem als auch bei fehlgeschlagenem Login, daher müssen Sie die Fehlerparameter in der URL überprüfen, wie in der Authentifizierungsdokumentation beschrieben.Wenn diese Eigenschaft nicht angegeben ist, wird der Benutzer zur aktuellen URL (dh der URL der Seite, auf der diese URL angegeben ist) weitergeleitet Methode wurde aufgerufen, in der Regel die aktuelle URL im Browser des Benutzers). " So gibt es eine Methode zu fangen, wenn Benutzer Authentifizierung/Berechtigungen verweigert, aber Verknüpfung mit der entsprechenden Dokumentation nicht mehr existiert (https://developers.facebook.com/docs/authentication/).facebook php sdk - catch, wenn der Benutzer keine Berechtigungen erteilt hat (Authentifizierung fehlgeschlagen)

Für die Einfachheit ist redirect_uri derselben Adresse wie eine PHP-Datei starten, und die PHP-Code ist so einfach wie:

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

Jeder weiß, wie diese Informationen zu fangen?

Antwort

11

Sie Folgendes tun können die Berechtigungen zu überprüfen:

$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

Es ist wie es aussieht, ist die einzige Option, jetzt verfügbar ... Seltsam, ich würde wetten, dass es einen Weg gab, es anders zu machen;) –

0

Es sollte beachtet werden, dass in der neuesten PHP Facebook SDK gibt es keine Methode -> api. Es scheint auch ein Problem zu bestehen, dass diese Prüfung (manchmal) verwendet, um Berechtigungen zu erhalten. Bei der Verwendung des älteren SDK erhielten einige Benutzer (nach dem Zufallsprinzip des Benutzers) "OAuthException: (# 412) User hat die Anwendung nicht installiert", obwohl eine Überprüfung des Debuggers des FB-Zugriffstokens die entsprechenden Berechtigungen aufwies. Nachdem ich auf das neue SDK aktualisiert und den neuen Weg gefunden habe, um eine einfache Datenliste von Berechtigungen zu erhalten, hat alles wieder funktioniert.

Ich brauchte viel Zeit auf der FB-Website, um diese Lösung zu finden, also füge ich sie hier ein, um hoffentlich jemand anderen ein paar Stunden zu retten. Sie retteten meine Entdeckung der getDecodedBody-Methode (ein sehr schwer zu findender Trick in FB-Dokumenten). In meinem Beispiel wird nur nach publish_actions gesucht.

$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

Ich hatte gerade das gleiche Problem, ich wusste nicht, wie die Aktion abbrechen behandeln (beide in facebook php api und Google oauth2).

Die Lösung ist viel einfacher als erwartet.

Die Antwort im Falle einer nicht akzeptierten Berechtigung kommt mit mindestens einem Parameter/einer Variablen: Fehler in der URL.

In Facebook diese Antwort wie folgt aussieht:

error = access_denied & error_code = 200 & ERROR_DESCRIPTION = Berechtigungen + Fehler & ERROR_REASON = user_denied

für Google erhalten Sie nur die

Fehler = Zugriff_deniert

aber es sollte genug sein.

Ich überprüfe nur, ob der Fehler gesetzt ist und wenn es gesetzt ist, leite ich die Antwort auf meine Login-Seite um.

Ich hoffe, es wird jemandem helfen, weil es diesen Schritt wirklich nicht dokumentiert ist. By the way: Version von Facebook API: v5 Version von Google-API OAuth2: 2.0 (ich glaube - google doc wirklich ein Chaos ist, wenn es um die neuesten Versionen kommt)

Verwandte Themen