随着互联网的发展,web应用的复杂度也一直在提升,单体的web应用已经不能满足复杂的业务需求。
例如百度的搜索、新闻、百科、贴吧,其实本质上都是不同的网站。
当用户使用这些平台的时候,当然不希望用户在每一个平台都有一个单独的账号,不然的话用户和开发者可能都会有想哭的冲动。
所以就需要一种用户登录一次就可以访问所有相互信任的应用的系统,这种系统就叫单点登录系统 SSO Single Sign On
同一域名下实现单点登录
同一个系统的多个站点,在同一个顶级域名下如,*.baidu.com,
让这些站点共享同一个顶级域名的cookie,
这样只要一个站点登录了,所有的站点就都可以拿到登录认证信息。
同一域名下 cookie登录的两个缺点:
- 不一定能够保证,所有的子系统都在同一个顶级域名下,
- 各个站点要分别实现一套登录认证功能
- 分布式服务,无法解决 cookie问题
解决:jwt token认证
SSO单点登录解决:域名可能不一致的问题,需要实现统一登录认证功能。
鉴权与授权概念
系统指的是:识别用户身份,然后允许用户访问符合其身份权限的资源。
- 识别用户身份,这一步我们称之为鉴权
- 允许用户访问符合其身份权限的资源,这一步我们称之为授权
单站点应用中,很少会将鉴权与授权分开来讨论,因为登录功能简单。
现代的 web站点的鉴权与授权都趋于多样化。比如在鉴权的时候我们可以使用
- 账号密码
- 手机短信验证码
- OAuth
- 人脸识别等
不同站点对于授权的需求和权限的体系都是各不相同的。
由于鉴权与授权的多样化与不同,为了降低耦合,提高内聚,就有必要将鉴权与授权过程分开看待。
一般来讲当各站点需要,同一套认证体系的时候,其实他们的鉴权体系是统一的,而授权过程则可能各不相同。
现实生活中的类似问题:
当我们认定一个人,是我们公司的员工的时候,
就有一个统一的部门,制作和发放给我们员工一张工作证;
然后员工更具这张工作证上的信息不同,决定了他在公司各个部门中能干什么不能干什么。
单点登录实现思路
- 制作一个,统一认证站点来负责鉴权这一步,
- 当用户访问,我们的一个站点的受保护资源的时候,先将用户重定向到统一认证站点,
- 如果用户未登录,就跳到,统一认证站点的登录界面进行登录,
- 登录成功之后,生成一个用户的身份票据 accessToken(就像工作证一样),然后将 accessToken信息返回给用户访问的站点,
- 如果用户已登录,则跳过登录步骤,直接将用户的身份信息 accessToken返回给用户访问的站点,
- 然后不同的站点再根据自己的授权体系,决定用户是否能够访问响应的资源。