Umgang mit der Facebook-Autorisierung - was ist mit dem Parameter "state", der von auth zurückkommt?

  • Die Facebook-API ist heute nicht mein Freund ...

    Ich versuche, die Grundlagen der FB-Autorisierung zu ermitteln, insbesondere in beiden Fällen des Benutzers, der der App den Zugriff auf die angeforderten Berechtigungen erlaubt und nicht zulässt. (Ich hatte ein funktionierendes Login-Schema mit fb: login-button, mit Ausnahme des Teils "allow", der mit fb: login-button nicht möglich zu sein scheint.)

    Das Problem: Wenn der Benutzer Zugriff gewährt, erhält mein Server zwei Treffer:

    • Ein POST von Facebook für den post_authorization-Rückruf meiner App , das eine signierte_Anfrage enthält, die letztendlich verwendet wird, um auf das Zugriffstoken des Benutzers zuzugreifen, und

    • ein GET von meiner eigenen Website des form "GET /?state=aLongStringOfEncodedCharacters".

    Ich kann keine Erklärung für diesen GET-Aufruf oder den" Status "finden. Parameter - dies scheint einer der Orte zu sein, an denen sich die FB-Dokumentation vor kurzem entwickelt hat. http://developers.facebook.com/docs/authentication/ bezieht sich auf ein GET, das eine zurückgibt Parameter "Code"; Meine Anwendungsdefinition auf Facebook verweist auf den post_authorization-Rückruf, er wird jedoch an keiner Stelle der Authentifizierungsseite erwähnt. Arggh. Kann jemand da draußen erklären, was los ist und wie ich diesen Authentifizierungsprozess lösen kann? Vielen Dank!

    22 November 2011
    Jim Miller
2 answers
  • Sie erhalten auch beide Parameter code und state. Mit dem Parameter code können Sie ein access_token abrufen, indem Sie diese URL erhalten.

     https://graph.facebook.com/oauth/access_token?
           client_id=YOURAPPID&
           redirect_uri=YOUR_CALLBACK_URL&
           client_secret=YOUR_SECRET&
           code=CODE_PARAM_YOU_RECEIVED;
     

    Der Parameter state lautet CSFR-Schutz.

    Wenn Sie sich diesen Code ansehen (von der Seite, die Sie gepostet haben),

        if(empty($code)) {
         $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
         $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
           . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
           . $_SESSION['state'];
    
         echo("<script> top.location.href='" . $dialog_url . "'</script>");
       }
    
       if($_REQUEST['state'] == $_SESSION['state']) {
             //getting access_token here      
       }
       else {
         echo("The state does not match. You may be a victim of CSRF.");
       }
     

    Sie werden sehen, dass Sie (oder zumindest dieses Beispiel) einen md5() Hash-Zufallsstring an Facebook senden.

    Sie sollten prüfen, ob es mit dem empfangenen identisch ist. Andernfalls könnten Sie / Ihr Kunde ein Opfer von CSFR sein

    22 November 2011
    Martin.Álvaro García
  • FBRLH_state Sitzung ist nicht festgelegt, dieser Hash kann in $_GET['state'];

     <?php 
    session_start();
    $_SESSION['FBRLH_state'] = $_GET['state'];
     
    gefunden werden
    11 December 2017
    Andrei Todorut