SSO是为了解决一个用户在鉴权服务器登陆过一次以后,可以在任何应用中畅通无阻,一次登陆,多系统访问,操作用户是实打实的该应用的官方用户,用户的权限和分域以鉴权服务器的存储为准。
OAuth2.0解决的是通过令牌获取某个系统的操作权限,因为有clientId的标识,一次登陆只能对该系统生效,第三方应用的操作用户不是鉴权系统的官方用户,授权权限鉴权中心可以做限制。
OAuth是Open Authority的缩写,是令牌代替用户密码访问应用的又一标准,前面一期介绍过SSO单点登录(SpringBoot模拟单点登录),也是令牌登陆的一种方式。
OAuth2.0最典型的授权码认证方式:
资源服务器和鉴权服务器都是属于资源所有方,也就是最终的服务提供方,第三接入方需要先与鉴权服务器申请合作获取客户编码。
对于资源服务器来说,需要做的是
1 accessToken和clientId的校验
2 token校验通过后要对token访问权限做好限制
对于鉴权服务器来说,需要做的是
1 接受第三方应用的申请,维护clientId
2 提供登入页面,做用户、密码鉴权
3 授权码生成和验证
4 token的生成
5 clientId、token的维护,一般clientId入库,token入内存
OAuth2.0最主要的是授权码方式和简单方式,简单方式就是省略了上面客户端获取code然后交换token的过程。
OAuth2.0授权与单点登录的区别
根据OAuth2.0授权与单点登录的概念,我们可以得知二者至少存在以下几点区别:
从信任角度来看。OAuth2.0授权服务端和第三方客户端不属于一个互相信任的应用群(通常都不是同一个公司提供的服务),第三方客户端的用户不属于OAuth2.0授权服务端的官方用户;而单点登录的服务端和接入的客户端都在一个互相信任的应用群(通常是同一个公司提供的服务),各个子系统的用户属于单点登录服务端的官方用户。
从资源角度来看。OAuth2.0授权主要是让用户自行决定——“我”在OAuth2.0服务提供方的个人资源是否允许第三方应用访问;而单点登录的资源都在客户端这边,单点登录的服务端主要用于登录,以及管理用户在各个子系统的权限信息。
从流程角度来看。OAuth2.0授权的时候,第三方客户端需要拿预先“商量”好的密码去获取Access Token;而单点登录则不需要。
单点登录服务端的设计
对于一个接入单点登录的子系统而言,进行单点登录需要以下两个步骤:
client请求单点登录服务端,获取Access Token;
client因为不能判断给它的Access Token是单点登录服务端返回还是用户伪造,所以需要再次请求单点登录服务端,校验Access Token是否有效,如果有效则返回用户基本信息以及相应的用户在client上所属的角色、权限等信息。