gpt4 book ai didi

javascript - 带有 OAuth 2.0 的新 JS SDK 在 fbsr_ cookie 中保存子域?

转载 作者:可可西里 更新时间:2023-11-01 02:56:10 26 4
gpt4 key购买 nike

编辑:此错误已记录,并确认为 Facebook bug 。现在已经修复了!



我正在测试我的更新以转移到新的 JS SDK。我的应用程序跨域的多个子域运行。在旧的 JDK 上,我是这样调用的:

FB.init({
appId: [APP_ID],
status: false,
cookie: true,
xfbml: true
});
FB.login();

在新的 JDK 上,它看起来像这样:

FB.init({
appId: [APP_ID],
status: false,
cookie: true,
xfbml: true,
oauth:true
});
FB.login();

使用 cookie 管理器 FF 插件,您可以看到旧版本会在 mydomain.com 上设置 cookie,但新版本会将其设置为 www.mydomain.com - 这意味着我的其他子域无法访问该 cookie。

澄清一下:问题是我不能在不同的子域上使用 facebook cookie,而且如果我在每个子域上登录它们,我也必须从每个子域中注销它们

最佳答案

如果您在通过 Javascript API 调用 FB.init() 时将 oauth 设置为 true,您现在将获得 fbsr_APP_ID cookie 而不是 fbs_APP_ID cookie(注意“r”)。它包含签名请求和部分 oauth 迁移。

如果您使用 PHP SDK,它应该会处理更改。

但是,网站文档似乎没有使用新的 get_facebook_cookie() 函数进行更新:https://developers.facebook.com/docs/guides/web/

它仍然使用旧的 cookie 格式。您可以在此处找到如何解析已签名的请求:

http://developers.facebook.com/docs/authentication/signed_request/

然后,您需要通过此处的文档将 cookie 中的“code”参数转换为 access_token:developers.facebook.com/docs/authentication/(没有 http://因为 StackOverflow 垃圾邮件预防)

我在新的 PHP SDK 的源代码中进行了一些研究以弄清楚这一点,因为所有文档似乎都没有更新。

我正在使用的完整代码是上面的组合,并进行了一些额外的修改以使用旧的或新的 cookie 格式,如下所示。新的 get_facebook_cookie() 函数会返回一些额外的数组元素(algorithm、code、issued_at、user_id)并且一些数组元素不再设置(base_domain、secret、session_key、sig)。大多数人寻找的主要参数很可能已设置(uid、access_token 和 expires)

function get_facebook_cookie($app_id, $app_secret) {
if ($_COOKIE['fbsr_' . $app_id] != '') {
return get_new_facebook_cookie($app_id, $app_secret);
} else {
return get_old_facebook_cookie($app_id, $app_secret);
}
}

function get_old_facebook_cookie($app_id, $app_secret) {
$args = array();
parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
ksort($args);
$payload = '';
foreach ($args as $key => $value) {
if ($key != 'sig') {
$payload .= $key . '=' . $value;
}
}
if (md5($payload . $app_secret) != $args['sig']) {
return array();
}
return $args;
}

function get_new_facebook_cookie($app_id, $app_secret) {
$signed_request = parse_signed_request($_COOKIE['fbsr_' . $app_id], $app_secret);
// $signed_request should now have most of the old elements
$signed_request[uid] = $signed_request[user_id]; // for compatibility
if (!is_null($signed_request)) {
// the cookie is valid/signed correctly
// lets change "code" into an "access_token"
$access_token_response = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=$app_id&redirect_uri=&client_secret=$app_secret&code=$signed_request[code]");
parse_str($access_token_response);
$signed_request[access_token] = $access_token;
$signed_request[expires] = time() + $expires;
}
return $signed_request;
}

关于javascript - 带有 OAuth 2.0 的新 JS SDK 在 fbsr_ cookie 中保存子域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7206204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com