Facebook是如何管理用户会话的?

4

我对 Facebook 如何在其不同的 Web 应用程序(Facebook 和 Messenger)中管理用户会话感到好奇。当我进入 Messenger Web 应用程序时,它知道我已登录 Facebook 并允许我使用该应用程序。我想知道哪些技术可以让我实现这一点(也许是 Redis?)或他们如何共享同一会话。

1个回答

3

messenger.comfacebook.com 发送 ajax 请求,以获取用户是否已在其中登录的信息。

一旦您在 messenger.com 中进行身份验证,就会获得一个新的会话,它独立于 facebook.com 会话。

可以在开发人员工具的网络选项卡中查看所发出的请求:

POST https://www.facebook.com/login/async_sso/messenger_dot_com/?dpr=1&__a=1

这个端点允许 messenger.com 进行跨域请求(因为有这个响应头):

access-control-allow-origin: https://www.messenger.com

x-auth-result中,关于您的Facebook账户的信息以base64格式发送,并使用JSON.parse(atob(...))进行解析。
例如,我的信息看起来像这样:
X-Auth-Result: eyJ1c2VyaWQiOi....sd1EifQ==

然后他们执行:

var n = m.getResponseHeader('X-Auth-Result');
if (n) {
    var o = JSON.parse(atob(n));
    c('Arbiter').inform('messengerdotcom_fb_session_info', o);
}

在我的案例中,o 会看起来像这样:

{
    "userid": "1000....756",
    "name": "Ionică Bizău",
    "secret": "P0....r",
    "persistent": true,
    "initial_request_id": "AfU...lwQ"
}

接着,他们最终可以在按钮中显示您的全名。

当用户未登录时,Facebook会发送一个userid: "0"

{
  "userid":"0",
  "initial_request_id":"A6...YOd"
}

非常好的答案!感谢您的时间! - Lucas León
他们如何在浏览器中在两个域之间共享初始数据? - Qamar
@Qamar 没错,你说得对: messenger.com 在此上下文中从 facebook.com 获取初始数据(facebook.commessenger.com 信任)。 - Ionică Bizău

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接