77

我想为我的 Facebook OAuth2 集成提供一个动态重定向 URL。例如,如果我的重定向 URL 在我的 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以下所有内容,但无济于事:

  1. 对我网站的请求的实际 URL
  2. 对我的站点的请求的 URL,减去code参数
  3. 我的 Facebook 应用程序配置中指定的 URL

是否支持自定义重定向 URI 参数?如果是这样,我是否正确指定它们?如果没有,我会被迫设置一个 cookie,还是有更好的模式来为我的网站提供上下文?

4

6 回答 6

104

我想出了答案;state您可以向请求添加参数,而不是向重定向 URL 添加其他参数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
    &状态=6234

然后将该状态参数传递给回调 URL。

于 2011-06-24T16:28:33.137 回答
12

如果出于任何原因,您不能使用 Jacob 建议的选项,因为这是我的情况,您可以在传递参数之前对参数进行 urlencode,即使使用完整的查询字符串,它也会起作用redirect_urifoo=bar&morefoo=morebar

于 2012-04-27T09:07:46.573 回答
4

我试图按照本教程针对 API v2.9 实现 Facebook 登录工作流。我尝试了上述解决方案。Manuel 的回答有点正确,但我观察到的是不需要 url 编码。另外,您只能传递一个参数。只考虑第一个查询参数,其余的将被忽略。这是一个例子,

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

  2. 你会收到你的网址的回调。它看起来像http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1}。请注意,facebook 会使用myExtraParameter. myExtraParameter您可以从回调 url中提取值。

  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}

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

于 2017-07-11T04:58:58.293 回答
-1

您应该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
    );
于 2020-04-02T04:46:10.000 回答
-1

你最好为每个 oAuth 提供者指定一个唯一的回调/oauth/facebook/oauth/twitter等等。

如果您真的希望同一个文件响应所有 oAuth 请求,请将其包含在单个文件中,或者设置一个路径,使用 .htaccess 重定向或类似的方法在您的服务器上调用同一文件:/oauth/*>oauth_callback.ext

于 2016-06-13T04:22:24.380 回答
-1

嘿,如果您使用的是官方 facebook php skd,那么您可以state像这样设置自定义参数

$helper = $fb->getRedirectLoginHelper();
$helper->getPersistentDataHandler()->set('state',"any_data");
$url = $helper->getLoginUrl($callback_url, $fb_permissions_array);
于 2020-11-18T16:16:23.967 回答