80 votes

Facebook OAuth : paramètres de callback_uri personnalisés

J'aimerais avoir une URL de redirection dynamique pour mon intégration Facebook OAuth2. Par exemple, si mon URL de redirection est la suivante dans mon application Facebook :

http://www.mysite.com/oauth\_callback?foo=bar

J'aimerais que l'URL de redirection pour une demande spécifique soit quelque chose comme ceci, de sorte que sur le serveur, j'ai un certain contexte sur la façon de traiter le code d'authentification :

http://www.mysite.com/oauth\_callback?foo=bar&user=6234

Ma redirection est invoquée après l'envoi de la boîte de dialogue d'autorisation et je reçois un code d'autorisation, mais lorsque j'essaie d'obtenir mon jeton d'accès, je reçois une erreur OAuthException de la part de Facebook. Ma requête ressemble à ceci (les retours à la ligne ont été ajoutés pour plus de clarté) :

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

Tous mes paramètres sont codés en URL, et le code semble valide, donc ma seule hypothèse est que le paramètre problématique est mon redirect_uri. J'ai essayé de définir redirect_uri à tout ce qui suit, en vain :

  1. L'URL réelle de la requête vers mon site
  2. L'URL de la requête vers mon site, moins le nom de l'utilisateur. code paramètre
  3. L'URL spécifiée dans la configuration de mon application Facebook

Les paramètres URI de redirection personnalisés sont-ils pris en charge ? Si oui, est-ce que je les spécifie correctement ? Si ce n'est pas le cas, serai-je obligé de définir un cookie, ou existe-t-il un meilleur modèle pour fournir un contexte à mon site Web ?

106voto

Jacob Points 33729

J'ai trouvé la réponse : plutôt que d'ajouter des paramètres supplémentaires à l'URL de redirection, vous pouvez ajouter une balise de type state à la demande de 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

Ce paramètre d'état est ensuite transmis à l'URL de rappel.

0 votes

Mais le paramètre d'état ne peut contenir que des caractères numériques, n'est-ce pas ?

8 votes

Non, il peut contenir n'importe quelle donnée arbitraire. Au moment où j'ai écrit ceci, je mettais un objet JSON entier dans ce paramètre (codé en URL, bien sûr).

12 votes

L'état est destiné à un hachage aléatoire et indéchiffrable pour empêcher le CSRF. Existe-t-il un moyen de résoudre ce problème ?

12voto

Manuel Pedrera Points 3199

Si, pour une raison quelconque, vous ne pouvez pas utiliser l'option suggérée par Jacob, comme c'est mon cas, vous pouvez urlencode votre redirect_uri avant de le passer et cela fonctionnera, même avec une chaîne de requête complète comme foo=bar&morefoo=morebar en elle.

6 votes

Pouvez-vous donner un exemple ?

0 votes

Cela fonctionnait pour moi de cette manière, puis j'ai arrêté ; maintenant, je "partage" le site web de l'entreprise. state pour la protection de XSRF et pour ma propre identité est la solution pour moi.

0 votes

Cela ne fonctionne plus, du moins pas dans mon cas. Il ne renvoie que le premier paramètre de la chaîne de requête lors de la redirection à partir de l'authentification.

4voto

mert Points 621

J'ai essayé d'implémenter un flux de travail de connexion Facebook avec l'API v2.9 suivant ce tutoriel . J'ai essayé les solutions décrites ci-dessus. La réponse de Manuel est en quelque sorte correcte, mais ce que j'ai observé est que l'encodage url n'est pas nécessaire. De plus, vous ne pouvez passer qu'un seul paramètre. Seul le premier paramètre de la requête sera pris en compte, le reste sera ignoré. Voici un exemple,

  1. Demandez un code via https://www.facebook.com/v2.9/dialog/oauth?client_id={app-id}&redirect_uri=http://{url}/login-redirect?myExtraParameter={some-value}

  2. Vous obtiendrez un rappel pour votre url. Cela ressemblera à http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1} . Notez que facebook ferait un callback avec myExtraParameter . Vous pouvez extraire la valeur de myExtraParameter de l'url de rappel.

  3. Ensuite, vous pouvez demander un jeton d'accès avec 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}

Les paramètres supplémentaires passés à l'étape 1 après le premier paramètre de la requête seront ignorés. Veillez également à ne pas inclure de caractères non valides dans votre paramètre de requête (cf. ce pour plus d'informations).

-1voto

Dallas Clark Points 435

Il est préférable de spécifier un callback unique pour chaque fournisseur oAuth, /oauth/facebook , /oauth/twitter etc.

Si vous voulez vraiment que le même fichier réponde à toutes les requêtes oAuth, incluez-le dans les fichiers individuels ou définissez un chemin d'accès qui appellera le même fichier sur votre serveur en utilisant des redirections .htaccess ou quelque chose de similaire : /oauth/* > oauth_callback.ext

-1voto

Max Points 461

Vous devez définir votre state en utilisant l'assistant de connexion comme tel :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X