Facebook OAuth:自定义callback_uri参数

时间:2011-06-24 03:55:12

标签: oauth-2.0 facebook-oauth

我想为我的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设置为以下所有内容,但无济于事:

  1. 我网站的请求的实际网址
  2. 我网站请求的网址减去code参数
  3. 我的Facebook应用程序配置中指定的URL
  4. 是否支持自定义重定向URI参数?如果是这样,我是否正确指定它们?如果没有,我会被迫设置一个cookie,还是有一些更好的模式来为我的网站提供上下文?

6 个答案:

答案 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编码。另外,您只能传递一个参数。只考虑第一个查询参数,其余的将被忽略。这是一个例子,

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

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

  4. 然后,您可以使用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}

  5. 请求访问令牌

    将忽略第一个查询参数后在步骤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