认证与授权的区别

  • 认证(Authentication,AuthN)即“你是谁”,确认用户身份。
  • 授权(Authoriztion,AuthZ)即“你可以做啥”,根据用户身份授予他访问特定资源的权限。

当用户登录系统时,系统需要先认证用户身份,再依据用户身份授权。认证和授权需要联合使用,才能让用户真正登录并使用应用系统。

单点登录(Single Sign-On,SSO)

多个站点都要登录,但是每个站点都维护一套登录服务太过麻烦,只需要一套SSO系统,就可以帮助用户快捷访问网络中的多个站点。该协议通过多个系统之间的用户身份信息的交换来实现单点登录。用户只需要记忆一个口令,登陆一次,就可以访问多个系统。

SSO是一种实现目标,具体怎么做请看下面各个具体的实现。

image-20230912162058515

CAS

Central Authtication Service,CAS。常见的B/S架构SSO协议。

仅用于AuthN,CAS认证流程包括几部分参与者:

  • Client:通常为使用浏览器的用户
  • CAS Client:实现CAS协议的web应用
  • CAS Server:统一认证的CAS服务器

流程如下:

image-20230912162218906
  1. 用户在浏览器里请求访问web应用example
  2. 浏览器发起一个GET请求访问example的网页 https://www.example.com
  3. 应用example发现当前用户处于未登录状态,Redirect用户至CAS服务器进行认证
  4. 请求CAS服务器
  5. CAS发现用户未登录,要求用户登录
  6. CAS服务器返回登录页面至浏览器
  7. 用户在登录界面中输入用户名和口令(或其他认证方式)
  8. 用户将用户名和口令通过POST,提交给CAS服务器
  9. CAS对用户进行认证,若用户名和口令正确,则生成SSO会话,并把会话ID通过cookie的方式返回至用户的浏览器端(此时,用户在CAS服务端处于登陆状态)
  10. CAS服务器同时也会把用户重定向至CAS Client,并且同时发送一个Server Ticket
  11. CAS Client收到Server Ticket,请求CAS Server对ticket进行校验
  12. CAS Server把校验结果返回给CAS Client,校验结果包括ticket是否合法,以及ticket中包含的用户信息
  13. 至此,CAS Client根据Service Ticket得知登录用户身份,CAS Client处于登录态。

当登录一个Client2时,用户不需要再次认证,跳过5,6,7,8,9这几个步骤。

用的越来越少,因为它之解决认证部分,不授权。

OAuth 2.0

其实是一种AuthZ协议,不用来认证,关注授权本身。但是在实际使用中,授权脱离了认证没有任何意义。

OAuth 2.0解决的主要场景是:第三方应用如何被授权访问资源服务器。整个流程包括以下几个部分:

  • Resource Owner:资源拥有者,通常为终端用户
  • Resource Server:资源提供者
  • Authorization Sever:授权服务器
  • Client:请求访问服务的应用

大致流程如下:

image-20230912171856209

假定一个在线音乐服务,用户zhangsan(Resource Owner)想通过某音视频播放软件(client)来播放在线音乐,但是在播放音乐之前,该音视频软件必须得通过YuFu(即玉符IDaaS)(Authorization Server)认证授权,得到zhangsan的同意之后才能访问在线音乐。

在这个场景中,zhangsan为Resource Owner,在线音乐服务为Resource Server,Client为某音视频播放软件,YuFu作为Authorization Server。

  1. 音视频软件向zhangsan发起授权请求,请求zhangsan同意访问在线音乐服务
  2. 根据不同的授权模式,zhangsan同意该授权,且返回一个"授权"给音视频服务,音视频服务携带zhangsan的授权,请求YuFu颁发一个access_token,用于访问在线音乐
  3. YuFu校验音视频服务自身的合法性之后,颁发access_token
  4. 音视频服务携带access_token,代表zhangsan请求访问在线音乐
  5. 在线音乐服务校验完access_token以后,提供音乐服务。播放器开始播放音乐。

上述是一个抽象的授权流程,而在具体实现中,在前三步中会有几个变种,即不同的授权模式,常见的授权模式包括:

  • Authorization Code Grant:授权码模式,最为常用,最安全,强烈推荐
  • lmplicit Grant:适用于SPA应用,已经不再推荐使用,被PKCE模式所替代
  • Resource Owner Password Credentials Grant:需要把用户的用户名和密码暴露给Client
  • Client Credential Grant:整个流程没有用户的概念,适用于服务端->服务端调用的场景。

可以发现在整个流程中,音视频播放器并不需要知道zhangsan的密码,只是需要得到zhangsan的授权就可以访问在线音乐,而整个授权是由Authorization Server来负责。

本文并不会展开讨论Authorization Code模式,详细协议文档定义请参考:https://tools.ietf.org/html/rfc6749

相比CAS协议,OAuth2.0不同的授权模式能够解决更多的场景,更安全、更流行,且通过PKCE模式能够实现移动端的单点登录,这是其他SSO协议都不具备的。

OpenID Connect

OpenID Connect简称OIDC,是基于OAuth 2.0扩展出的一个协议。除了能实现OAuth2.0的AuthZ,还额外定义了AuthN场景,是当今最流行的协议。

相比OAuth 2,OICD引入了id_token和userinfo相关的概念:

  • OAuth 2.0只是定义了access_token/refresh_token,但是这俩只是为了保护Resource Server的,并没有包含Resource Owner的信息;
  • OIDC引入了id_token的概念,用这个特殊的token来表示这是Resource Owner的身份证:
  • OIDC引入了关于如何获取详细userinfo的Endpoint;
  • OIDC定义了类似于SAML Metadata的Discovery接口,俗称well-known接口:

OIDC协议的登陆授权流程和OAuth2.0基本类似,整个流程的参与者也类似,只不过换了个术语:

  • OpenlD Provider:简称OP,负责认证和授权
  • Relying Party:简称RP,OAuth 2.0中的Client
image-20230912205855338

OIDC协议是目前最主流的SSO标准协议,且对开发者友好,实现起来比较简单。

SAML 2.0

古老的协议,没人用了。

Security Assertion Markup Language,基于XML的标准协议。

简单对比

比较项 CAS OAuth OIDC SAML
支持AuthN ×
支持AuthZ × ×
传输方式 HTTP HTTP HTTP HTTP
票据格式 server ticket,proxy ticket
协议定义为一个opaque的ticket,没有标准格式
acces_token,refresh_token
协议定义为一个opaque的ticket,没有标准格式
acces_token,refresh_token,id_token
access_token,
refresh_token同OAuth2.0,是一个opaque的token,没有标准格式
id_token是一个标准的JWT格式的token,且有标准claim的定义
assertion,AuthNRequest等
基于XML格式,遵循SAML统一格式定义
主要应用场景 B/S架构,基于浏览器的SSO B/S架构,基于浏览器的授权 B/S架构。基于浏览器的SSO和授权
PKCE模式可以用来实现移动端的SSO场景
B/S架构,基于浏览器的SSO
优势 基本没优势 协议实现简单,能解决场景多
成熟度高,社区支持广泛
协议简单易实现,能解决的场景多
成熟度高
可以同时AuthN和AuthZ
最全面的SSP协议之一