在进行多站点统一账号管理时,有以下几个关键点:
- 设计公共登录平台——
passport通行证 - 使用
cookie跨域进行多站点登录 - 统一账号管理接口
设计请求流程图:
1.设计公共登录平台—— passport 通行证
设计统一存储各个站点账号数据库:用户表 passport_user
2.使用 cookie 跨域进行多站点登录
关键点在于此,登录成功后,跨域生成 cookie ,进行多站点访问。
比如登录 www.a.com 站点时,登录地址去请求 passport 平台(也可以统一登陆页面,来源链接是自己的站点就重定向回去,不是就跳转的默认站点),成功返回 js 脚本:
http://www.b.com/cookie.php 代码:
去请求其他站点生成跨域 cookie ,也可以在URL后面加上一些加密的参数去请求,提高安全性。
然后访问 www.b.com 时就可以带上 www.a.com 生成的 cookie
3. 统一账号管理接口

每个站点设置 API 统一用户数据到 passport 平台。保证用户数据能一致性。
用户的注册,修改密码等操作同步到 passport 平台,最好设置一些加密参数进行请求。
备注:
- 各个平台由于密码加密方式不同,请求通行证平台时,最好把各个平台密码加密代码收集到通行证平台。现在都是框架开发,加密代码都是可以提取出来的。例:123456789101112131415161718192021222324252627282930//yii2 密码加密方式/***$password 用户密码*$hash 加密的用户密码*/public function validatePassword($password, $hash){if (!is_string($password) || $password === '') {throw new InvalidParamException('Password must be a string and cannot be empty.');}if (!preg_match('/^\$2[axy]\$(\d\d)\$[\.\/0-9A-Za-z]{22}/', $hash, $matches)|| $matches[1] < 4|| $matches[1] > 30) {throw new InvalidParamException('Hash is invalid.');}if (function_exists('password_verify')) {return password_verify($password, $hash);}$test = crypt($password, $hash);$n = strlen($test);if ($n !== 60) {return false;}return $this->compareString($test, $hash);}
同样 Laravel ThinkPHP CI 等密码加密方式也是可以提取出来的,当然 自己写的更就更方便了。
关于
cookie存储的有效性,只要有一个站点的cookie过期那么就要重新生成有效的cookie,建议每个站点的cookie过期时间统一一下。通行证平台创建的
user表可以根据自己需求改动,这里只是做个案例。原理了解后,其实2个以上的站点这样做更好点,例:
user在a站点登陆后passport平台返回js脚本代码生成一个token的cookie,当用户访问b站点的时候带上token在去请求通行证去验证token,验证通过后返回b站点登录信息。同理b访问c站点也是。当然访问之前判断是否已经在跳转的站点登陆了进行判断即可。只是有个缺点:第一次新开其他站点的时候,不是在站点跳转时无法同步登陆。之所以这样是不想遍历请求每个站点生成cookie,当然还是根据自身需求具体开发。