关于鉴权和授权,之前写过不少文章:
但是,聊到的点都比较散,没有系统归纳到底这些年处理登录是如何演变的?于是,才有了这篇历史版
背景知识1:什么是鉴权与授权?
- 鉴权 Authentication,指对于一个声明者所声明的身份权利,对其所声明的真实性进行鉴别确认的过程。
例子:用户名张三,密码******,用户名和密码通过挖财验证,登陆成功 - 授权 Authorization,一般是指获取用户的委派权限。
例子:我是张三,有权访问git/client/jizhang,因为gitlab给我进行了授权
可见,先有鉴权,才有授权。而登录,其实就是鉴权的过程。但是,现在的登录服务,同时做了鉴权和授权的工作,所以,用户是感知不到这两个阶段的明显区别。
背景知识2:登录的痛点在哪里?
- 场景1: 如果一个企业有非常多的内部系统,且每个系统都需要单独注册,登录,那么,员工维护那么多账号密码,估计要疯掉的。
- 场景2:非常多的小型Web应用,没有能力或者不想做自己的登录系统,那么,是否可以用一些公开,通用的登录服务呢?
所有痛点都指向一个问题:需要一个三方平台,可以提供统一登录能力(包括鉴权与授权)
下面,让我们看下历史是如何演进的。
第一阶段:LDAP
LDAP协议(Lightweight Directory Access Protocol,轻型目录访问协议),是基于IP协议上的。
特点:
- 规范了数据存储方式(账号密码,组织结构等信息),以及验证账号密码的过程。
- 只负责对账号密码进行验证,也就是说,只做鉴权,不做授权。
- 除了验证账号密码这个额外的功能外,看上去更像一个数据库,只负责数据存储和读取。
为了这种数据和数据之间互相关联的数据结构而设计的东西,有个特殊的名字叫:目录服务(Directory service)。LDAP是目录服务中的一种。
第二阶段:单点登录(single sign-on,SSO)- SAML协议
万维网兴起之后,网站的登录诉求喷涌而出(PC Web时代),这时,而每个站点针对不同用户,又可能有不同的授权机制。比如论坛系统,系统管理员,管理员,用户,游客,他们可访问的菜单权限,数据权限,都是不同的。
于是,授权必不可少。
SSO出现的初衷,是为了提供一个全球统一的用户身份服务,达到一次登录就可以访问其它网站的理想。
在2001年由OASIS组织安全服务技术委员会推出了SAML(安全主张标记语言,Security Assertion Markup Language,以XML为基础),提出了对SSO实现的整体技术和安全规范。
SAML协议里,约定了参与SSO的三方:浏览器,身份提供者(IDP),服务提供者(SP),以及这三方相互的通讯次序,加密方法,传输数据格式。
与LDAP不同,SAML协议登录过程,非常依赖浏览器重定向功能,而LDAP协议都是应用与LDAP服务间的直接通讯。
第三阶段:去中心化的OpenID
说简单点,OpenID的目的就是建立一个统一的SSO的方式,而不用在意IDP服务的提供方。
用户可以使用自己的IDP服务,或者选择一个可信任的IDP服务提供方,在这个IDP服务上完成注册。那么只要SP站点能使用OpenID的方式,用户就可以完成登录了。
第四阶段:OAuth2
Android,ios等智能手机兴起,移动时代来临。此时,强依赖浏览器重定向的SAML协议就显得不太合时宜了,于是OAuth2出现,更好的支持SSO登录。
OAuth 2.0是一个关于授权(authorization)的开放网络标准,特点为:
- IDP与SP需要明确的知道对方,所以在授权流程开始之前, SP需要在IDP服务注册,通过审核,拿到特定公钥,这就是注册过程。
- IDP被进一步细分。在SP与服务提供者之间,设置了一个授权层,SP不能直接登录服务提供者,只能登录授权层,授权完成之后,才能通过令牌获取资源(大部分情况下,下面两个服务的提供商为同一个):
- 资源服务器(Resource Server) - 存放用户资源和信息
- 授权服务器(Authorization Server) - 给三方颁发授权令牌(access token)
- 不强依赖浏览器重定向,可支持移动场景(参考移动应用微信登录开发指南)
以微信授权登录为例,"应用程序"是三方应用,"授权服务器"和“资源服务器”都是微信。
小结
所以,回答自己之前的那个问题,SSO和OAuth 2.0是什么关系?
答案:无论是OAuth 2.0,还是SAML协议,OpenID等,都是为了实现SSO的手段。