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
以下所有,无济于事:
- 请求到我的网站的实际url
- 请求到我的网站的URL,减去
code
参数 - 在我的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编码是不需要的。 另外,你只能传递一个参数。 只有第一个查询参数将被考虑,其余的将被忽略。 这里是一个例子,
-
通过
https://www.facebook.com/v2.9/dialog/oauth?client_id={app-id}&redirect_uri=http://{url}/login-redirect?myExtraParameter={some-value}
申请代码 -
你会得到一个callback你的url。 它看起来像
http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1}
。 请注意,Facebook将使用myExtraParameter
进行callback。 您可以从callbackurl中提取myExtraParameter
的值。 -
然后,您可以通过
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