Facebook OAuth: Benutzerdefinierte callback_uri-Parameter

74

Ich hätte gerne eine dynamische Weiterleitungs-URL für meine Facebook OAuth2-Integration. Wenn meine Weiterleitungs-URL beispielsweise in meiner Facebook-App wie folgt lautet:

http://www.mysite.com/oauth_callback?foo=bar

Ich möchte, dass die Umleitungs-URL für eine bestimmte Anforderung ungefähr so ​​lautet, damit ich auf dem Server einen Kontext zur Verarbeitung des Authentifizierungscodes habe:

http://www.mysite.com/oauth_callback?foo=bar&user=6234

Meine Weiterleitung wird aufgerufen, nachdem der Autorisierungsdialog gesendet wurde, und ich erhalte einen Authentifizierungscode zurück. Wenn ich jedoch versuche, mein Zugriffstoken abzurufen, wird von OA ein OAuthException-Fehler zurückgegeben. Meine Anfrage sieht folgendermaßen aus (Zeilenumbrüche wurden aus Gründen der Übersichtlichkeit hinzugefügt):

https://graph.facebook.com/oauth/access_token
    client_id = MY_CLIENT_ID
    & redirect_uri = http% 3A% 2F% 2Fwww.mysite.com% 2Foauth_callback% 3Ffoo% 3Dbar% 26user% 3D6234
    & client_secret = MY_SECRET
    & code = RECEIVED_CODE

Alle meine Parameter sind URL-codiert und der Code sieht gültig aus. Ich vermute also nur, dass der Problemparameter mein redirect_uri ist. Ich habe versucht redirect_uri, alle folgenden Einstellungen vorzunehmen, ohne Erfolg:

  1. Die tatsächliche URL der Anfrage an meine Site
  2. Die URL der Anfrage an meine Site abzüglich des codeParameters
  3. Die in der Konfiguration meiner Facebook-Anwendung angegebene URL

Werden benutzerdefinierte Umleitungs-URI-Parameter unterstützt? Wenn ja, gebe ich sie richtig an? Wenn nicht, werde ich gezwungen sein, ein Cookie zu setzen, oder gibt es ein besseres Muster für die Bereitstellung von Kontext für meine Website?

Jakob
quelle

Antworten:

100

Ich fand die Antwort heraus; Anstatt der Umleitungs-URL zusätzliche Parameter hinzuzufügen, können Sie stateder Anforderung einen Parameter hinzufügen , um https://www.facebook.com/dialog/oauth:

https://www.facebook.com/dialog/oauth
    client_id = MY_CLIENT_ID
    & scope = MY_SCOPE
    & redirect_uri = http% 3A% 2F% 2Fwww.mysite.com% 2Foauth_callback% 3Ffoo% 3Dbar
    & state = 6234

Dieser Statusparameter wird dann an die Rückruf-URL übergeben.

Jakob
quelle
Aber der Statusparameter kann nur Zahlenzeichen enthalten, nicht wahr?
Superscral
8
Nein, es kann beliebige Daten enthalten. Zu dem Zeitpunkt, als ich dies schrieb, habe ich ein ganzes JSON-Objekt in diesen Parameter eingefügt (natürlich URL-codiert).
Jacob
12
Der Status ist für einen zufälligen, nicht erratbaren Hash vorgesehen, um CSRF zu verhindern. Gibt es eine Möglichkeit, dies zu beheben?
CMCDragonkai
2
Interessanterweise wurde in der Dokumentation nicht erwähnt, dass es sich ursprünglich um CSRF handelte. Dies ändert jedoch nichts an der Tatsache, dass dies die einzige Möglichkeit zu sein scheint, beliebige Daten weiterzugeben. Ich nehme an, Sie könnten Ihren Statusparameter zu einer JSON-Struktur machen, die sowohl eine Nonce als auch Ihre Statusdaten enthält, oder die Nonce nur zum Nachschlagen der restlichen Informationen verwenden.
Jacob
Gute Antwort..! Ich habe das für Facebook benutzt. Aber wie machen wir das auch für Twitter? Es funktioniert nicht :(
azzaxp
12

Wenn Sie aus irgendeinem Grund die von Jacob vorgeschlagene Option nicht verwenden können, können Sie Ihren redirect_uriParameter vor dem Übergeben urlencodieren , und er funktioniert auch mit einem vollständigen Querystring wie dem foo=bar&morefoo=morebardarin enthaltenen.

Manuel Pedrera
quelle
6
Könnten Sie ein Beispiel geben?
CMCDragonkai
Früher hat es bei mir so funktioniert und dann einfach aufgehört; Jetzt stateist es für mich die Lösung, den Parameter sowohl für den XSRF-Schutz als auch für meine eigene ID zu "teilen" .
Erik Kaplun
Das funktioniert nicht mehr, zumindest nicht in meinem Fall. Es wird nur der erste Abfragezeichenfolgenparameter zurückgegeben, wenn von der Authentifizierung zurückgeleitet wird.
Filet
3

Ich habe nach diesem Tutorial versucht, einen Facebook-Anmelde-Workflow für API v2.9 zu implementieren . Ich habe die oben beschriebenen Lösungen ausprobiert. Manuels Antwort ist irgendwie richtig, aber ich habe festgestellt, dass keine URL-Codierung erforderlich ist. Außerdem können Sie nur einen Parameter übergeben. Es wird nur der erste Abfrageparameter berücksichtigt, der Rest wird ignoriert. Hier ist ein Beispiel,

  1. Fordern Sie einen Code über an https://www.facebook.com/v2.9/dialog/oauth?client_id={app-id}&redirect_uri=http://{url}/login-redirect?myExtraParameter={some-value}

  2. Sie würden einen Rückruf für Ihre URL erhalten. Es wird so aussehen http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1}. Beachten Sie, dass Facebook mit einen Rückruf tätigen würde myExtraParameter. Sie können den Wert für myExtraParameteraus der Rückruf-URL extrahieren .

  3. Dann können Sie Zugriffstoken mit anfordern https://graph.facebook.com/v2.9/oauth/access_token?client_id={app-id}&client_secret={app-secret}&code={code-from-facebook}&redirect_uri=http://{url}/login-redirect?myExtraParameter={value-extracted-in-step-2}

Zusätzlicher Parameter, der in Schritt 1 nach dem ersten Abfrageparameter übergeben wurde, wird ignoriert. Vergewissern Sie sich auch nicht enthalten ungültige Zeichen in der Abfrage - Parameter (siehe diese für weitere Informationen).

mert
quelle
Vielleicht verzeiht der Facebook-Server, aber Sie sollten unbedingt eine URL-Codierung durchführen redirect_uri. Es ist nicht gültig, eine nicht codierte Sekunde ?in der URL oder &s zu haben, da dies die Parameterliste mehrdeutig macht. Wenn Sie eine URL-Codierung durchführen, müssen Sie sich nicht darum kümmern, "ungültige Zeichen" im Parameter zu vermeiden. Ihre zusätzlichen Parameter werden wahrscheinlich aufgrund Ihrer fehlenden Codierung "ignoriert" &(wie könnte es unterscheiden, ob es sich um ein Parametertrennzeichen oder einen Teil davon handelt callback_uri?)
Jacob
@mert Ich habe meine Rückruf-URL in "Gültige OAuth Redirect URIs" des Facebook-Anmeldeprodukts unter Client OAuth Settingshinzugefügt, ohne zusätzliche Parameter hinzuzufügen. Es funktioniert nicht in meinem FallURL Blocked: This redirect failed because the redirect URI is not whitelisted in the app’s Client OAuth Settings. Make sure Client and Web OAuth Login are on and add all your app domains as Valid OAuth Redirect URIs.
Puneet
0

Sie sollten Ihren benutzerdefinierten stateParameter mithilfe des Anmeldehilfsprogramms als solches festlegen :

use Facebook\Facebook;
use Illuminate\Support\Str;

$fb = new Facebook([
    'app_id' => env('FB_APP_ID'),
    'app_secret' => env('FB_APP_SECRET'),
    'default_graph_version' => env('FB_APP_VER'),
]);

$helper = $fb->getRedirectLoginHelper();

$permissions = [
    'public_profile',
    'user_link',
    'email',
    'read_insights',
    'pages_show_list',
    'instagram_basic',
    'instagram_manage_insights',
    'manage_pages'
];

$random = Str::random(20);

$OAuth2Client = $fb->getOAuth2Client();

$redirectLoginHelper = $fb->getRedirectLoginHelper();

$persistentDataHandler = $redirectLoginHelper->getPersistentDataHandler();

$persistentDataHandler->set('state', $random);

$loginUrl = $OAuth2Client->getAuthorizationUrl(
        url('/') . '/auth/facebook',
        $random,
        $permissions
    );
Max
quelle
0

Hey, wenn Sie offizielle Facebook PHP SKD verwenden, können Sie benutzerdefinierte stateParameter wie diese einstellen

$helper = $fb->getRedirectLoginHelper();
$helper->getPersistentDataHandler()->set('state',"any_data");
$url = $helper->getLoginUrl($callback_url, $fb_permissions_array);
Daniel Masih
quelle
-1

Sie sind am besten aus einem einzigartigen Rückruf für jeden oAuth Anbieter Angabe /oauth/facebook, /oauth/twitterusw.

Wenn Sie wirklich möchten, dass dieselbe Datei auf alle oAuth-Anforderungen reagiert, fügen Sie sie entweder in die einzelnen Dateien ein oder richten Sie einen Pfad ein, der dieselbe Datei auf Ihrem Server mithilfe von .htaccess-Weiterleitungen oder ähnlichem aufruft: /oauth/*>oauth_callback.ext

Dallas Clark
quelle