我对 Facebook 如何在其不同的 Web 应用程序(Facebook 和 Messenger)中管理用户会话感到好奇。当我进入 Messenger Web 应用程序时,它知道我已登录 Facebook 并允许我使用该应用程序。我想知道哪些技术可以让我实现这一点(也许是 Redis?)或他们如何共享同一会话。
我对 Facebook 如何在其不同的 Web 应用程序(Facebook 和 Messenger)中管理用户会话感到好奇。当我进入 Messenger Web 应用程序时,它知道我已登录 Facebook 并允许我使用该应用程序。我想知道哪些技术可以让我实现这一点(也许是 Redis?)或他们如何共享同一会话。
messenger.com
向 facebook.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"
}
messenger.com
在此上下文中从facebook.com
获取初始数据(facebook.com
被messenger.com
信任)。 - Ionică Bizău