singleSignOn

小龙 753 2021-08-30

singleSignOn(SSO)单点登录,就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次之后,即可获得访问单点登录系统中其他相关联的系统和应用软件的权限。在不同系统或应用软件之间切换时不需要再重复登录。比如:一个企业中有许多的系统,OA、销售呀等等,如果每个系统都要登录一次,员工每次上班光登录系统都要耗费许多时间;引入了SSO之后,多个系统只需要登录一次,即可全部访问。
SSO的实现关键在于OAuth2协议,OAuth2协议是目前最流行的授权机制,用来授权第三方应用,获取用户数据。OAuth2协议为用户提供了一个安全的、开放而又简单的规范表中。与其他的授权方式不同OAuth2协议不会触及到用户的账号信息(如账号,密码)。因此OAuth是开放安全的。

OAuth2

OAuth2要解决的问题
比如:用户要访问我们自己的一个网站,但是用户不想注册账号,而是希望同第三方登录,如微信,QQ等。但是如果直接提供账号密码的方式登录,会存在很大的安全隐患:
1、提供了账号和密码,第三方应用可以获取全部的数据(好友,群)
2、这种方式授权只有在修改密码之后才能将授权收回。同理,如果你授权了很多网站,那么修改密码之后所以网站的授权都会被收回,下一访问还需要一一授权。
3、密码泄露的可能性大大提高,有些网站的安全性不高,可能将用户的账号密码泄露。一旦泄露后果非常严重。

OAuth2协议就是为了解决上面的问题而诞生的。OAuth规范了授权的方式,不采用账号和密码方式进行授权,而是采用令牌的方式(Token)来解决问题。从根源上解决了问题。应用通过令牌去获取用户的信息。

1.1 OAuth2涉及的角色

  • 资源所有者(Resource Owner):通常称为“用户(user)”,如用户的昵称,头像等这些都是用户所拥有的,用户只是将这些资源放到了服务提供商的资源服务器中。
  • 第三方应用(Third-party application):又称为客户端(client),比如说我们的官网想要使用微信、QQ的资源(昵称,头像等),那我们的网站相对于微信、QQ就是第三者,我们的网站也被称为第三方应用。
  • 认证服务器(Authorization Server):专门用来对资源所有者的身份进行认证的,对要访问的资源进行授权、产生令牌的服务器。想访问资源必须向通过认证服务器由资源所有者授权之后才能访问。
  • 资源服务器(Resource Server):存储用户的资源(昵称,头像等),严重令牌的有效性。比如:微信的资源服务器存储了微信用户的信息,淘宝的资源服务器存储了淘宝的用户信息。(注意:认证服务器和资源服务器虽然是两个解决,但他们可以是同一台服务器,同一个应用)
  • 服务器提供商(Service Prodiver):如微信、QQ(包含认证和资源服务器)

1.2 OAuth2认证流程

OAuth在第三方应用服务提供商之间设置了一个授权层(authorization layer)第三方应用不能直接登录服务提供商,只能通过授权层第三方应用于用户区分开来。第三方应用通过授权层获取令牌(Token),获取到令牌之后拿着令牌去访问服务器提供商。这个令牌和密码是不同的,令牌可以指定授权层令牌的权限范围和有效期,服务提供商根据权限范围和有效时长,向第三方应用开放对应的资源

1.2.1 认证流程图

image.png

1.3 OAuth2协议的授权模式

1.3.1 授权方式

  • 授权码模式(Authorization Code):功能最完整,流程最严密的授权模式。国内各大服务提供商(微信、QQ)都采用的此模式进行授权。可以确定是用户同意授权;而令牌是认证服务器发放到第三方应用服务器上,而不是浏览器上。
  • 简化模式(Implicit):令牌是发送到浏览器上,osuth客户端运行在浏览器中,通过JS脚本去申请令牌。
  • 密码模式(Resource Owner Passwored Creadentials):将用户名和密码传过去,直接获取access_token。用户同意授权动作是在第三方应用上完成的,而不是认证服务器上,第三方应用申请令牌的时候,直接带着用户名和密码去向认证服务器申请令牌。这种方式认证服务器就无法判断用户是否真的同意授权了,用户名面膜可能是第三方应用盗取来的
  • 客户端证书模式(client credentials):用的较少,当一个第三方应用自己本身需要获取资源(而不是已用户的名义获取)客户端模式就十分有用。