php – 跨域登录 – 在数据库中存储什么?

我正在开发一个允许我通过各种域登录同一系统的系统. (www.example.com,www.mydomain.com,sub.domain.com等)

到目前为止,以下主题构成了我研究的基础:
Single Sign On across multiple domains
Cross web domain login with .net membership

我想要发生的是,如果我登录主域并访问从属域上的页面自动登录到从属域.

显然如果我没有登录主人,我需要输入我的用户名和密码.

演练:
    1.用户登录站点
    2.用户导航到从站点
    3.从站点重定向到主站点以查看用户是否已登录.
    4.如果用户登录主服务器,则记录RFC 4122令牌ID并将其发送回从站点.
    5.然后,Slave站点在中央数据库中查找令牌ID并将该用户记录下来.

这可能最终会在不止一次的PHP和Apache实例上运行,所以我不能只存储:

token_id, PHP_session_id, created

我存储和使用它有什么问题:

token_id, username, hashed_password, created

哪个在使用时被删除,或在x秒后自动删除.

解决方法:

基本的想法是你所引用的链接,但它也谈论会话管理 – 忘记在数据库中存储什么 – 你需要做的就是在主服务器和客户端上启用会话.并将经过身份验证的用户名存储在会话中(主要是为了查看用户是否已通过身份验证).

  1. User navigates to client site
  2. Client site re-directs to master site to see if User is logged in.

否 – 如果从站点确定用户未经过身份验证,则只从重定向站点(称为客户端变得混乱).

忘记RFC 4122 – 它只是一种聪明的方式来获取在您称为会话标识符的帖子中使用的uuids. PHP已经生成了非常好的值.

您需要将某种消息从主服务器传递回从服务器,该服务器提供用户ID以及用户已在URL中进行身份验证的事实(您无法跨域传输cookie,也无法在域中执行POST重定向).这样做的一个显而易见的方法是在主服务器和从服务器上共享秘密,然后….

$redirect_to='http://slave.example.com/sso_lander.PHP?auth_token=' 
       . encrypt($some_random_alphanum_chars 
         . '/' . $user . '/' 
         . time(), $shared_secret);
header("Location: $redirect_to", true, 303);

然后在奴隶上:

if (!($_SESSION['authenticated_user']) && $_GET['auth_token']) {
    $auth_token=explode('/',decrypt($_GET['auth_token'], $shared_secret));
    if ((abs($auth_token[2]-time())<3) {
          // if more than 3 seconds after generate - DO NOT USE
          $_SESSION['authenticated_user']=$auth_token[1];
    }
}

请注意,上面仅用于说明 – 仍然有一个小窗口可用于重放攻击和其他应该整理的东西 – 更好的解决方案是从属生成一个挑战,它存储在本地会话中并复制到主服务器.主设备在加密回复中包含此内容.但是这个代码有点复杂.

C.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...