Facebook OAuth:自定义callback_uri参数

我想为我的Facebook OAuth2集成提供dynamicredirecturl。 例如,如果我的redirecturl是在我的Facebook应用程序中:

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

我想要一个特定的请求的redirectURL是这样的,所以在服务器上,我有一些关于如何处理authentication代码的上下文:

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

在授权对话框提交后,我的redirect被调用,我得到一个authentication代码,但是当我尝试获取我的访问令牌时,我得到一个来自Facebook的OAuthException错误。 我的请求看起来像这样(为了清楚起见添加了换行符):

 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
     &代码= RECEIVED_CODE

我的所有参数都是URL编码的,代码看起来有效,所以我唯一的猜测是问题参数是我的redirect_uri。 我已经尝试设置redirect_uri以下所有,无济于事:

  1. 请求到我的网站的实际url
  2. 请求到我的网站的URL,减去code参数
  3. 在我的Facebook应用程序的configuration中指定的URL

是否支持自定义redirectURI参数? 如果是这样,我指定他们正确吗? 如果没有,我会被迫设置一个cookie,或者是否有一些更好的模式为我的网站提供上下文?

我想出了答案。 而不是向redirecturl添加其他参数,您可以将请求的state参数添加到https://www.facebook.com/dialog/oauth

 https://www.facebook.com/dialog/oauth
     ?CLIENT_ID = MY_CLIENT_ID
     &范围= MY_SCOPE
     &REDIRECT_URI = HTTP%3A%2F%2Fwww.mysite.com%2Foauth_callback%3Ffoo%3Dbar
     &状态= 6234

该状态参数然后传递给callbackURL。

如果出于任何原因,您不能使用Jacob提出的选项,那么您可以在传递它之前对您的redirect_uri参数进行urlencode foo=bar&morefoo=morebar ,即使使用像foo=bar&morefoo=morebar这样的完整查询string,它也可以工作。

我试图按照本教程的要求实现一个针对API v2.9的Facebooklogin工作stream程。 我尝试了上述解决scheme。 曼努埃尔的回答是正确的,但我所观察到的是url编码是不需要的。 另外,你只能传递一个参数。 只有第一个查询参数将被考虑,其余的将被忽略。 这里是一个例子,

  1. 通过https://www.facebook.com/v2.9/dialog/oauth?client_id={app-id}&redirect_uri=http://{url}/login-redirect?myExtraParameter={some-value}申请代码

  2. 你会得到一个callback你的url。 它看起来像http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1} 。 请注意,Facebook将使用myExtraParameter进行callback。 您可以从callbackurl中提取myExtraParameter的值。

  3. 然后,您可以通过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}请求访问令牌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}

在第一个查询参数之后,在第一步中传递的附加参数将被忽略。 另外,请确保在查询参数中不包含任何无效字符(有关更多信息,请参阅此处)。

您最好为每个oAuth提供程序指定一个唯一的callback, /oauth/facebook/oauth/twitter等。

如果你真的想让同一个文件响应所有的oAuth请求,可以将它包含在单个文件中,或者设置一个path,使用.htaccessredirect或类似的方法调用服务器上的相同文件: /oauth/* > oauth_callback.ext