假设我们有两个网站example.com &不同域中的Example.net。这两个站点的用户数据是相同的,所以我们可以用相同的用户名和密码登录这两个站点。
当用户单击example.com上的注销按钮时,我们也必须从example.net注销他们。两个网站都是在同一个浏览器(不同的选项卡)上打开和登录的。
当用户从example.com注销时,是否有可能破坏example.net的会话cookie ?
由于这两个站点之间不共享任何登录信息,因此它们都保持独立的会话数据,并且您不能修改其他一些网站的会话数据。
一个解决方案是编写一个API与另一个网站通信,销毁会话数据。
的例子:
Tab 1: Opened "示例。com"并以"alice"登录
Tab 2: Opened "示例。net"并以"alice"登录
, 现在,"相互注销",做以下。,
当你在标签1 (.com域名)点击"注销"时,它应该转到:
- http://example.net/api/remote_logout.php?userid=alice
- 和重定向到:
- http://example.com/logout.php
- http://example.com/api/remote_logout.php?userid=alice
- 和重定向到
- http://example.net/logout.php
您需要有一个中间站点或web服务来跟踪用户会话,即abc.com和xyz.com站点共同使用
在这两个站点上,您都可以每隔一定的时间发送一个ajax请求,以检查中间服务的用户会话的有效性。如果用户在任何一个站点登出,会话将被破坏。所以当来自其他站点的ajax请求检查时,它会关闭会话,因此您可以编写代码来销毁cookie或任何您想要它做的事情。
下面是我在Drupal中的做法。如果您使用任何CMS,那么将有一个特定的方式来做到这一点,但核心结构是相同的,以便在PHP环境中支持它。当一个站点收到内部登录请求时,使用给定的用户名和密码登录到另一个站点。
- 首先登录到网站,并获得cookie令牌等,以进行与用户需求相关的其他内容。
// Build request data
$user_login_method = 'POST';
$user_login_retry = 0;
$post_data = array('username' => trim($username), 'password' => trim($password));
$user_login_data = http_build_query($post_data, null, '&');
// Send a request with the data to other site
$login_request = drupal_http_request($other_site_login_url, $user_login_headers, $user_login_method, $user_login_data, $user_login_retry);
// Look for set cookie header value in the response
if(isset($login_request->headers['Set-Cookie'])) {
// Set the cookie name and do the rest based on values
}
- 第二种是调用其他站点的注销url来注销用户。请记住,您必须使用登录调用时返回的cookie值,但如果您从注销页面向其他站点进行ajax调用,则没有办法解决。
如果您查看Drupal站点API以获取有关drupal_http_request方法的更多信息
我会尝试使用会话处理在数据库中存储数据。