web-dev-qa-db-fra.com

Facebook OAuth: paramètres personnalisés de callback_uri

J'aimerais avoir une URL de redirection dynamique pour mon intégration Facebook OAuth2. Par exemple, si mon URL de redirection est celle-ci 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 ç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 invoquée après la soumission de la boîte de dialogue d'autorisation et je récupère un code d'authentification, mais lorsque j'essaie d'obtenir mon jeton d'accès, 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 paramètres sont encodés en URL et le code semble valide, donc ma seule supposition est que le paramètre problématique est mon redirect_uri. J'ai essayé de régler redirect_uri à tous les éléments suivants, en vain:

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

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

68
Jacob

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

93
Jacob

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

12
Manuel Pedrera

J'essayais d'implémenter un flux de travail de connexion Facebook contre l'API v2.9 après 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 url n'est pas nécessaire. De plus, vous ne pouvez transmettre qu'un seul paramètre. Seul le premier paramètre de requête sera pris en compte, le reste 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 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 rappel 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}

Le paramètre supplémentaire transmis à 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 this pour plus d'informations).

3
mert