在进行多站点统一账号管理时,有以下几个关键点:
- 设计公共登录平台——
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
,当然还是根据自身需求具体开发。