我想为我的Facebook OAuth2集成设置动态重定向网址。例如,如果我的重定向网址是我的Facebook应用程序:
http://www.mysite.com/oauth_callback?foo=bar
我希望特定请求的重定向URL是这样的,所以在服务器上,我有一些关于如何处理身份验证代码的上下文:
http://www.mysite.com/oauth_callback?foo=bar&user=6234
在提交授权对话框后调用我的重定向,然后我返回一个身份验证代码,但是当我尝试获取访问令牌时,我从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 &code=RECEIVED_CODE
我的所有参数都是URL编码的,代码看起来有效,所以我唯一的猜测是问题参数是我的redirect_uri。我已经尝试将redirect_uri
设置为以下所有内容,但无济于事:
code
参数是否支持自定义重定向URI参数?如果是这样,我是否正确指定它们?如果没有,我会被迫设置一个cookie,还是有一些更好的模式来为我的网站提供上下文?
答案 0 :(得分:91)
我想出了答案;您可以向state
的请求添加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
然后将该状态参数传递给回调URL。
答案 1 :(得分:12)
如果出于任何原因,您无法使用Jacob建议的选项,因为在我的情况下,您可以在传递它之前 urlencode 您的redirect_uri
参数,它会起作用,甚至其中有一个完整的查询字符串,如foo=bar&morefoo=morebar
。
答案 2 :(得分:3)
我试图在this tutorial之后针对API v2.9实施Facebook登录工作流程。我尝试了上述解决方案。 Manuel的答案有点正确,但我观察到的是不需要url编码。另外,您只能传递一个参数。只考虑第一个查询参数,其余的将被忽略。这是一个例子,
通过https://www.facebook.com/v2.9/dialog/oauth?client_id={app-id}&redirect_uri=http://{url}/login-redirect?myExtraParameter={some-value}
您的网址会收到回调。它看起来像http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1}
。请注意,facebook会使用myExtraParameter
进行回调。您可以从回调网址中提取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}
将忽略第一个查询参数后在步骤1中传递的附加参数。另外,请确保查询参数中不包含任何无效字符(有关详细信息,请参阅this)。
答案 3 :(得分:0)
您应使用登录助手来设置自定义state
参数,例如:
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
);
答案 4 :(得分:0)
嘿,如果您使用的是官方的Facebook php skd,则可以这样设置自定义state
参数
$helper = $fb->getRedirectLoginHelper();
$helper->getPersistentDataHandler()->set('state',"any_data");
$url = $helper->getLoginUrl($callback_url, $fb_permissions_array);
答案 5 :(得分:-2)
您最好为每个oAuth提供商/oauth/facebook
,/oauth/twitter
等指定唯一的回调。
如果您确实希望相同的文件响应所有oAuth请求,请将其包含在单个文件中,或使用.htaccess重定向或类似设置设置将在您的服务器上调用同一文件的路径:/oauth/*
> oauth_callback.ext