【发布时间】:2019-08-11 05:02:51
【问题描述】:
我的帐户系统位于accounts.example.com。
当用户在accounts.example.com 登录时,会话ID 将保存在.example.com 上可用的cookie 中(在所有子域中)
subdomain.example.com 在另一台服务器上,它无权访问帐户系统的会话数据和数据库。我如何检查用户是否登录是我获得了会话 ID(因为它在所有子域中都可用)。然后,我使用会话 ID 和密码(保护 HTTP 请求的密码)向帐户服务器发送 HTTP 请求。
来自subdomain.example.com的HTTP请求如下。
$sessionId = $_COOKIE[$sessionCookieName];
$post = http_build_query(
array (
'http_secret' => AUTH_HTTP_SECRET,
'session_id' => $sessionId
)
);
$opts = array('http' =>
array (
'method' => 'POST',
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'content' => $post
)
);
$context = stream_context_create($opts);
$url = 'https://account.example.com/check-login';
$response = @file_get_contents($url , false, $context);
所以,一个 HTTP 请求将被发送到accounts.example.com/check-login。
check-login.phpaccounts.example.com 如下。
$httpSecret = $_POST['http_secret'];
// if it is from an invalid client
if ($httpSecret !== HTTP_SECRET) {
throw new Exception('HTTP Error');
}
$sessionId = $_POST['session_id'];
# set the session ID
session_id($sessionId);
# then, I get the session data and checks if the user is logged in
如果用户已登录,我会将与帐户相关的数据返回给subdomain.example.com。
这种方法是好是坏?
提前致谢。
【问题讨论】:
-
subdomain.example.com 是如何获得密码的?
Then I get session data怎么样?您刚才说您无权访问会话数据,因为子域在另一台服务器上? -
我的意思是,我发送了一个密码:它是保护服务器 HTTP 请求的密码。它不是用户的密码。它只是为了验证 HTTP 请求。明白了吗?
-
明白。那么如何“获取会话数据”呢?那部分是否发生在另一台服务器上,并且您在响应中返回数据?如果您将发生的事情标记在哪里会有所帮助
-
用户如何注销?
-
我编辑了我的答案,用户可以从
accounts.example.com/logout注销。它将删除保存在帐户服务器中的所有会话数据。因此,下一个 HTTP 请求将返回 false 到问题“是否已登录?”