单点登录:
用户想要凭借在 A 站点登记的的身份访问 B 站点,那么得先去 A 站点请求一个 token,建议用 JWT 形式 jwt.io 。
拿到这个 token 后,用户将这个 token 给 B 站点。至于怎么给,可以是 A 站点跳转到 B 站点的同时附带一个 token 在 query 里面(?token=xxx ),或者 post 同时跳转到 B (不知道前端能不能跨域 post+跳转)。
这个 token 附带该用户在 A 站点登记的信息,比如 id。B 站点用这个 id 来区分用户的身份。
B 站点怎么确认这个 token 的合法性?因为这个 token 是用户传递给 B 的,所以会被伪造。所以 token 里面还要附带签名(这也是 jwt 的标准)。同时 B 也要有 A 的公钥。2) 也可以 B 向 A 发起查询,但是会有网络和磁盘开销。
万一用户修改密码怎么办?一个解决方案是 A 在 token 里面加上过期时间(这也是 jwt 标准)。过期后,用户将 token 传递给 B,B 发现过期,所以让用户重新去 A 站点,重新输入密码,重新请求 token。
还可以用 B 向 A 发起查询的方式,每个请求都查询一遍。或者当用户在 A 系统修改密码时,A 向 B 推送废除 token 的消息。这类设计的安全系数高,消除了不一致窗口(窗口长度<=token 过期时间),但是开发难度大,并且提高了系统的耦合程度。