Facebook OAuth: parameters de rappel personnalisés

J’aimerais avoir une URL de redirection dynamic pour mon intégration à Facebook OAuth2. Par exemple, si mon URL de redirection est présente dans mon application Facebook:

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

Je voudrais que l’URL de redirection pour une requête spécifique soit quelque chose comme ça, de sorte que sur le serveur, j’ai un peu de contexte sur la façon de traiter le code d’authentification:

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

Ma redirection est appelée après l’envoi de la boîte de dialog d’autorisation et je récupère un code d’authentification, mais lorsque j’essaie d’obtenir mon jeton d’access, je reçois une erreur OAuthException de Facebook. Ma demande ressemble à ceci (des sauts de 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 parameters sont encodés en URL, et le code a l’air valide, donc je suppose que le paramètre problem est mon redirect_uri. J’ai essayé de définir redirect_uri à tous les éléments suivants, sans succès:

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

Les parameters 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?

J’ai compris la réponse. plutôt que d’append des parameters supplémentaires à l’URL de redirection, vous pouvez append un paramètre d’ state à la requête sur 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.

Si, pour une raison quelconque, vous ne pouvez pas utiliser l’option suggérée par Jacob, vous pouvez encoder votre paramètre 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 .

J’essayais d’implémenter un workflow de connexion Facebook contre API v2.9 suite à 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é, c’est que l’encodage d’URL n’est pas nécessaire. De plus, vous ne pouvez passer qu’un seul paramètre. Seul le premier paramètre de requête sera pris en compte, le rest sera ignoré. Voici un exemple,

  1. Demander 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 auriez un rappel pour votre URL. Il ressemblera à http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1} . Notez que facebook ferait un rappel avec myExtraParameter . Vous pouvez extraire la valeur de myExtraParameter partir de l’URL de rappel.

  3. Ensuite, vous pouvez demander un jeton d’access 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}

Le paramètre supplémentaire passé à l’étape 1 après le premier paramètre de requête sera ignoré. Assurez-vous également de ne pas inclure de caractères non valides dans votre paramètre de requête (voir ceci pour plus d’informations).

Vous avez tout intérêt à spécifier un rappel 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 configurez un chemin qui appellera le même fichier sur votre serveur en utilisant des redirections .htaccess ou quelque chose de similaire: /oauth/* > oauth_callback.ext