一、单点登录概念
什么是单点登录?单点登录全称
Single Sign On
(以下简称
SSO
),
是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。用户登录成功之后,会与sso认证中心及各个子系统建立会话,用户与sso认证中心建立的会话称为,用户与各个子系统建立的会话称为
全局会话
。
局部会话
二、单点登录的两种方式
1.同域名共享cookie
如果你的所有平台都是在同一个域名下,那么可以使用
同域名共享cookie
的方式来完成单点登录的信息共享。
将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。
然而,可行并不代表好,共享 cookie 的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。
因此,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录
2、SSO认证授权登录
上一种方法有很大的局限性,如果跨域名,就实现不了,这里我们可以借助第三方授权来实现。要实现多个平台单点登录,前提是多个平台必须要有一个唯一的账号,如手机号,邮箱,或用户名,这样才可以判断出是哪个用户。
具体实现思路
假如公司有两个不同域名或IP下的管理网站,http://a.com,http://b.com,我们想要输入用户名和密码登录a.com, 即可自动登录http://b.com,怎么实现呢?
登录http://a.com后会在a平台产生会话信息,如果我们登录b.com,怎么判断该用户已经登录a平台了,然后自己登录?这里我们需要借助第三方平台来做授权验证,即c.com,该授权中心维护一套共有的账号和密码,当用户访问 http://a.com 后,我们会跳转到 c.com,并带上http://a.com 这个来源访问地址,在http://c.com 中判断是否有登录,如果未登录,则给出登录界面,登录成功后,则产生会话信息,同时生成一个授权Token,保存在http://c.com cookie 中,然后返回给原地址,如果已经登录(即已经授权过了),则拿到cookie中保存的Token信息然后回跳到原来的访问地址,http://a.com 判断有Token信息,则拿着这个Token发送http请求到c.com,判断该Token是否有效,如果有效,则返回给用户信息,然后http://a.com拿到信息后,自动登录a.com;
当访问 http://b.com 时,也会去 http://c.com 中判断是否已经授权过了,因为http://a.com 已经授过权了,则会给http://b.com 返回授权Token,然后http://b.com 判断该Token是否有效,如果有效,则会返回给用户信息,http://b.com 自动登录,这就是单点登录的一个简单的流程。
一个完整的流程图:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMhVTOmJmYmZmY2EGZzIWNxIjMiNDMkBTN4MTOlJWY58CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
以上内容希望帮助到大家, 很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家 ,需要请戳这里链接 或 者关注咱们下面的知乎专栏
PHP架构师圈子zhuanlan.zhihu.com