登陆的轮子,你还在造?

​讲讲LDAP,SAML,OpenID,OAuth2这些常见登陆协议以及它们背后的故事

登录是个啥?

登陆这个操做,在咱们平常使用各种网站,应用的时候,几乎是必需要作的事情。在计算机如此普及的今天,输入帐号密码,点击登陆按钮,咱们天天都要重复干不少遍这样的事情。那么就是这个简单的登陆按钮,咱们去探究其背后的秘密。
看下一个最简单的登陆过程,如图:
在这里插入图片描述是否是以为很复杂,看着有点晕?前端

登陆按钮背后,其实包含了注册,登陆与认证,受权,鉴权与访问,四个过程,一共四方参与其中来完成。git

注册,是登陆的前提。
用户须要向网站代表本身是谁,就是网站会分配给用户一个惟一的标识,一般就是用户名,用来肯定用户在浏览网站时的身份。对网站来讲,主要的目的就是为了将每一个用户区分开来,进一步能够将每一个用户的行为与数据区分开来,再进一步能够创建用户与用户的关系。
注册的结果,就是在数据库中会保存下用户的帐号密码。为了安全起见,通常密码都会用MD5加密算法加密后保存,固然也不全是这样。国内以前最大程序员社区网站CSDN由于被黑客攻击,致使帐号密码泄露,发现密码是明文的,引起了很多吐槽,错了,是不少吐槽。 程序员

登陆,目的是完成认证。
帐号密码输入完毕,点击登陆按钮,系统会将数据库中的帐号密码跟输入内容进行比对,彻底相同,则认为经过认证。认证,就是肯定这个用户确实是他本身声称的那个用户。 github

受权,才是关键。
认证完成后,该用户凭什么能进入网站查看,这就须要受权。
重点来了!所谓受权,就是生成一个惟一的口令牌,常见的生成过程,就是将用户名,登陆时间毫秒数,再根据我的喜爱,加一些其它口味的参数,通过MD5加密以后,生成的一串16进制的字符串。这个字符串就是口令牌。
为了让用户不用每次来输入帐号密码,通常这个受权都会有一段有效时间。用户只要凭借有效的受权就能够进入。 算法

访问,以前须要鉴权。
用户得到受权后,对网站的其它功能页面发起访问。每次访问,都要将口令牌做为请求参数。口令牌失效,都会拒绝访问请求。口令牌,通常两种状况下会失效。一是过时了,二是用户主动退出登陆。通常口令牌都有时效性,也就是在固定的时间过去后,再凭借这个口令牌访问系统,系统就会拒绝访问。过时时间越短,口令牌泄漏的可能性越小,安全性就越高。 数据库

整个过程就比如,用户去某大厦参观,先要在大厅前台那,用身份证登记(注册);你往里走就到总入口那,门口的保安队长要求你出示身份证核验后(登陆与认证),会发给你参观证(受权),上面写着你是谁。保安队长会告诉你,参观证24小时有效,过了24小时,你须要从新来保安队长这里领取。用户拿着牌子访问大厦的每一个房间,在每一个房间门口都有一个保安,要求必须出示一下这个参观证才放用户进去(鉴权与访问)。 浏览器

这里顺便插一句,现实生活中,身份证就比如用户名,用户肉身就比如密码。 安全

上面就是最基本的登陆过程,在普通网站中基本够用了。但在企业级产品里,还不够。由于一个企业里面可不止一我的,而是一群人。人一多,就天然有了组织结构。
下图是个常见的企业组织结构:
在这里插入图片描述
企业的组织结构,像一颗倒过来的树,在计算机术语里,这种数据结构就叫树(Tree)。那么在数据库中就须要经过数据来记录这种组织结构关系,咱们定义一种叫组(Group)的概念,每一个组有个惟一标识:组名。当一个用户属于某个组时,在这个用户的数据里面记录下这个组名便可。一样,一个组的数据也能够记录另一个组名,表示这个组属于另一个组。这里看下来有点绕,总之重点就是用数据能表达出这种结构关系就是了。
有了这个结构后,受权的过程就会变得更加复杂了。
企业中的每一个人的权限是不一样的。人数众多状况下,要给每一个人设置对应权限无疑是繁琐的。正好,咱们能够利用组织结构,不一样的组拥有不一样的权限,经过人在不一样组里面,表现出不一样的权限。
所以,受权的过程,就须要查看用户所在的全部组所对应的权限,来判断用户是否有访问当前功能页面的权利。 服务器

说到这里,才真正把登陆有关的关键点都说了一遍,没看明白就再多看几回。读书百遍,其义自见。而后你觉得要结束了吗?没有,登陆的故事其实才刚刚开始...微信

登陆的发展

随着集成电路,半导体等技术的发展,计算机硬件设备愈来愈普及,与此同时互联网也快速发展。在1980-1990年代,是飞速发展的时期。大量的企业开始使用计算机做为主流的办公工具。这时候,企业对软件的需求变得愈来愈大。
企业内部软件系统愈来愈多,简单的登陆就带来了不少困扰:

  • 各个系统都要求员工注册登陆;
  • 每一个系统中都须要维护各自的组织结构;
  • 等一个员工要离职的时候,还须要在每一个系统中将此员工帐号清除;
  • 若是同一员工在不一样系统的帐号密码还不一样,忘记帐号密码就是再广泛不过的状况了;

因而计算机的先贤们,就想能不能将维护用户的帐号密码,公司的组织结构不要如此繁琐?每一个用户只须要一个帐号密码,整个公司也只须要一个组织结构呢?
回顾下登陆的流程,咱们将帐号密码,组织结构独立出来,作成单独的软件系统。那么帐号密码,组织结构这些数据的保存,就都在这个独立的登陆服务系统中,那么验证帐号密码也能够在登陆服务中就完成了。如图:
在这里插入图片描述
在1988年,由当时的国际电报电话咨询委员会(CCITT)推出的X.500计算机目录服务的标准系列协议中,包含由大名鼎鼎的互联网工程任务组(IETF)设计的LDAP协议(Lightweight Directory Access Protocol,轻型目录访问协议)。IETF就是设计TCP/IP协议族的那个标准组织。
协议,其实就是一个文档说明。就是一群大神发现,为了解决相同的问题,菜鸟们造出各类千奇百怪的轮子出来,看着实在难受。因而大神们聚在一块儿开了个会,甩出一篇文档说:照这个作就行。
LDAP协议是基于IP协议上的,意思就是基于互联网,得有网络才能工做。
LDAP协议主要规范了数据存储方式,以及验证帐号密码的过程。LDAP要求帐号密码,组织结构这些信息都保存在其系统中。LDAP也只负责对帐号密码进行验证,其它好比该帐号是否有权限访问当前应用,口令牌相关的验证,应用内部的权限等都不在LDAP的关心范围之类。
LDAP协议中,除了验证帐号密码这个额外的功能外,看上去更像一个数据库,只负责数据存储和读取。它是特别的为了这种数据和数据之间互相关联的数据结构而设计的,这种东西,有个特殊的名字叫:目录服务(Directory service)。LDAP是目录服务中的一种。
目录服务的特色,就是读取快,写入慢。适合频繁读取而不常常写入的数据存储。目录服务的应用范围实际很是之广,有兴趣能够去了解一下。
LDAP有各类各样的实现,实现的意思就是一些公司或者我的,按照LDAP的协议,用代码真正的写出来了一个可运行的软件系统。
著名的LDAP实现有:

  • 微软的AD(Microsoft Active Directory)
  • 开源维护的OpenLDAP

对于通常软件应用,咱们若是称某个应用兼容LDAP协议,也就是意味着,这个应用实现了对LDAP读写的API,这样只须要提供LDAP服务的IP地址等必要信息,该应用就能使用LDAP做为其帐号密码验证的服务了。固然,具体不一样应用对LDAP的使用方法多有不一样,会存在不大不小的差别。
在LDAP的基础上,很好的解决了系统管理员要维护好多份公司结构和帐号密码的问题,对于员工来讲,也只须要记住一个帐号密码就能够登陆全部系统了。这在企业内部系统使用来看,彷佛够用了。

也就在LDAP协议诞生后一年,1989年英国科学家 蒂姆·伯纳斯-李 发明了万维网。蒂姆·伯纳斯-李,就是图片上这位神仙。
在这里插入图片描述
Web领域常常说起的三个概念:

  • 全球网络资源惟一认证系统,统一资源标志符(URI);
  • 超文本标记语言(HTML);
  • 超文本传输协议(HTTP)

都是他的我的发明,他还在1990年写编写了第一个网页浏览器。(拜拜Web之神,保佑网页不崩)

Web时代到来啦!
以前的互联网,网站方须要将本身的内容分享出来都要求用户安装特定的应用程序(没错,就跟如今手机APP差很少)。网站方要提供特定程序,对开发难度无疑是个挑战。并且在上世纪90年代初 ,拨号上网的滋滋声伴随的是几KB的网速,用户要下载安装各类五花八门的应用在本身那容量可怜的电脑里,对用户简直是个灾难。
Web的出现就完全改变这一切。名叫WorldWideWeb的万维网在以后几乎成为互联网的代名词。网页浏览器成为用户链接世界的窗口。也正由于Web的发展,普通人买台电脑放在家里再也不像是个摆设。
随着网站愈来愈多,网站类型愈来愈丰富,从开始只是彻底开放式的只读网页,到逐渐拥有一些功能,须要区分用户行为,设定用户权限等等。
是的,他来了,他来了,咱们的主角登陆又出场了,网站也须要登陆了。

Web系统开发起来简单,使得网站爆炸式增加,即便同一家公司也拥有多个网站服务。而用户这边,为了记住这么多网站的帐号密码而疲惫不堪。相对于Web的易用性,登陆各个网站都须要不停的输入帐号密码显得格外繁琐。
能不要这么麻烦吗?
1998年,微软推出了Passport network服务,提供一个全球统一的用户身份服务。网络护照,顾名思义,就是用户注册Passport以后,将用户资料,如:名字,年龄,照片等等信息上传给Passport。其它网站接入Passport以后,用户在使用时就无需再次登陆,用户只须要完成Passport的登陆便可。这种一次登陆就能够访问其它网站的理想,被称为单点登陆(single sign-on,SSO)
Passport失败了,大概是由于人们不信任微软。可是SSO的理念却引发了同行们的注意。SSO的想法就是将身份提供者(Identity provider,IDP),服务提供者(Service provider,SP)完全分离,用户用IDP提供的身份就能够在Web世界畅通无阻。
这里面最让人头疼的实际上是安全问题。如何保证用户的身份在逻辑上不能被冒充,才是最难的题目。数据加密,数字签名(Digital Signature)等各类密码学知识恰好解决了这个问题。这就是另一大块的内容,暂且按下不表。

在2001年由OASIS组织安全服务技术委员会(Security Services Technical Committee)推出了SAML(安全主张标记语言,Security Assertion Markup Language),就是提出了对SSO实现的总体技术和安全规范。
SAML是以XML为基础,不用JSON的缘由,大概是由于JSON一直在1999年才发明,2004年之后才流行起来逐渐取代了XML。在这以前,XML一直是做为网络通信的标准格式。
在SAML协议中,实际上也包含了能够发送帐号属性等登录外的扩展部分。SAML协议实际内容不少,就不一一介绍,这里只围绕单点登陆来讲明。
SAML协议里,约定了参与SSO的三方:浏览器,身份提供者(IDP),服务提供者(SP),以及这三方相互的通信次序,加密方法,传输数据格式。
在2005年推出了SAML 2.0,与老版本1.1互不兼容,可是解决的问题思路是同样的,2.0也是最新的协议,大概流程以下图:
在这里插入图片描述
跟LDAP的流程作一个对比,LDAP协议里只负责用户身份的认证,不包含受权过程。在SAML协议中,不只包含身份认证,还包含是否容许用户访问当前网站内容的受权部分。
LDAP服务与应用之间是毫无条件的充分信任,LDAP几乎是做为应用的远程数据库通常的存在。而在SAML中,SP与IDP不只须要在事前互相信任(互换签名公钥与IP地址),还要在认证过程当中防止他人伪造而进行数据校验。由于SAML定义的SP与IDP是在互联网上相互独立的站点。
同时能注意到SAML协议很是依赖浏览器重定向功能,而LDAP协议都是应用与LDAP服务间的直接通信。
浏览器重定向,其实就是指当前你访问的页面主动跳转到另一个网站的网页上去,在跳转的过程当中能够给此次访问网页的请求上附加上一些数据用来完成数据传输。

SAML的介绍差很少这些,这里我就不打算给你作一个什么生动形象的比喻来帮你理解这个事情了,相对有点抽象,反复看几遍,毕竟后面的更抽象。

实际上,除了SAML之外,同期还有很多其它协议或者方法提供SSO的解决方案,本质上都大同小异。任何SSO方案里,SP与IDP这两个概念都是最关键的两个角色。
在Web世界里,SSO理念被你们承认,也就获得了普遍的应用。好比如今咱们在不少网站提供的微信登陆,微博登陆,都是SSO的一种实现。
互联网公司的某个产品用户有一点基数,就但愿经过登陆进一步扩大本身的影响,都纷纷实现本身的SSO方案。因而网上就会充斥着很是多的登陆。国外就有Google登陆,Facebook登陆,Twitter登陆等等,国内就有微信登陆,微博登陆,QQ登陆,支付宝登陆等等,也不少。你一个互联网公司没个登陆都很差意思跟人打招呼。
在这里插入图片描述
像图片上这样,看着是否是也挺闹心的。
对用户来讲,这些互联网产品我都得用啊,不是说好的用了SSO我就只须要一个帐号密码了吗?咋仍是这样呢?
再看看各大互联网公司,业务之间多少存在互相竞争,谁也不待见谁,统一?打通?门都没有。感受SSO最初的美好愿望就要落空了。
写到这里,按照基本剧情,英雄就该出现了。

一个叫布莱德的程序员在1999年的时候,开发了一个相似博客同样的社区网站。运营的还不错,有了好几百万用户。你看,互联网公司,几百万用户,感受能够开始作本身的SSO登陆了。可此次布莱德不想作一个跟巨头们同样的东西,毕竟就算作出来估计也打不过。那要不要尝试去中心化的路子?
去中心化这个概念随着比特币流行而火爆了起来,其实去中心化这个概念很早就有了。中心化的意思就是用户在使用某项服务时,全部的访问请求都须要向同一个主体的服务器地址发送。好比每一个微信用户的客户端,都是在跟腾讯公司的服务端交流,A发送给B一条消息,都是A先发送给腾讯服务端,再由腾讯服务端转发给B。A是不能经过其它公司或我的的服务端发送给B消息的。相似这样,全部用户都围着中间一个服务端,就管这种叫中心化的服务。
去中心化呢?就是并无固定的一个服务商提供服务,任何人只要他愿意的话,均可以做为服务端来给用户服务,用户也能够自由的切换服务端。这种方式显然是不符合已经拥有大量用户的互联网公司的利益,但却迎合了用户和中小企业抱团取暖的需求。
因而布莱德在2005开始了一个叫OpenID的项目开发,这个项目在软件社区中获得了响应,愈来愈多的人参与进来,以后愈来愈多的人开始使用。OpenID的目的就是创建一个统一的SSO的方式,而不用在乎IDP服务的提供方。用户彻底能够本身启动一个IDP的服务,或者选择一个用户信任的IDP服务提供方,在这个IDP服务上完成注册。那么只要SP站点能使用OpenID的方式,用户就能够完成登陆了。
大体流程如图:
在这里插入图片描述
由于提供OpenID的IDP服务并不肯定在哪,因此在打开IDP的登录页面以前,用户须要在SP提供的一个符合OpenID标准的表单上,输入下本身帐号所在的IDP地址信息,以便让SP找到相应的IDP服务。
并且值得注意的是,OpenID只提供了认证,而并无受权。也就是说OpenID的IDP只确认了确实有这个帐号,而这个帐号能不能访问该网站的内容,OpenID的IDP并不关心。
OpenID这种去中心化的特色,让帐号这种资源或者权力再也不被大企业独占而成为一种可能,在社区里面很快就广受欢迎。此后国外的一些主流网站也逐渐开始支持OpenID,国内互联网公司估计还没那么快想得开。

在2006年,在Twitter工做的库克正在负责给Twitter支持OpenID的工做。与此同时,社交书签网站Ma.gnolia须要一个解决方案容许使用OpenID的成员受权Dashboard访问他们的服务。
来,咱们来理解一下这个需求。
用户用同一个帐号在甲乙两个站点都有登陆,甲想要调取乙的数据,一般要访问乙,都须要乙的口令牌,才能访问,那若是将乙的口令牌直接告诉甲,那就至关于甲在乙那边有跟用户相等的权力,很难保证甲不拿这些去干些越权的事情。那么,在不将乙的凭证交给甲的前提下,咱们是否是能够额外给甲一个临时受权,这个临时受权,规定好使用时效和使用范围就能够了。乙收到这个临时受权,必定要核验一下究竟是哪一个用户,这样才能准确的给出资源。
基本流程如图:
在这里插入图片描述
因而,库克跟几我的凑一块儿鼓捣了近一年,在2007年推出OAuth协议草案,翻译过来叫“开放受权”,算是给OpenID的一个补充。

你看时间已经来到了2007年,2007发生了一件大事情。
乔布斯发布了第一代苹果手机。
在这里插入图片描述
紧接着2008年HTC推出了第一部Android手机,完全拉开了移动互联网时代的序幕。Web彷佛一时间跟失宠了同样,开发者们大量的投入到了手机APP的开发中去。
以前的SAML协议十分依赖浏览器的重定向功能,在移动手机时代就显得过期了,很差用了。OAuth1.0也是在Web时代诞生的,并且由于第一个版本太复杂,虽然有一些人发现其价值,但一直动静不大。在2009年还发现协议里有个安全漏洞,虽而后来打了个补丁,可是总归影响不太好。
因而OAuth团队就干脆放弃了第一个版本。在2011年5月发布了OAuth2.0草案。OAuth2关注客户端开发者的简易性,同时为Web应用、桌面应用、手机和智能设备提供专门的认证流程。

如今大部分常见的登陆后面都借鉴了OAuth2的受权流程,好比在用微信登陆了一个网站后,老是还要弹出一个页面,问你允不容许该网站使用你的微信头像和名字,这就是受权的过程。只是在微信这个例子里面,IDP和第三方服务都是微信一方。
另外从流程图咱们能够了解到,IDP与SP都是须要互相知道对方的位置,而且在受权流程开始以前,都须要互换公钥来保证信息安全不被伪造,这就是OAuth2的注册过程。
这上面的例子主要是Web下的流程,手机和桌面应用的流程会有所区别,这个感兴趣能够本身查阅相关资料。

在OAuth2推出以后,OpenID的团队在2014年将OAuth2的理念与OpenID相结合,并做出一些简化,发布了OpenID Connect协议。简单理解OpenID Connect就是认证跟OpenID同样,受权跟OAuth2同样。其实内部技术细节有很多差异,但这里就不细说了。

就这样,伴随着软件和互联网的发展,登陆相关技术也随着大神和英雄们的出现悉数登场。从LDAP,SAML,OpenID,OAuth2这一路的发展,也不太短短30年光景,不得不感慨计算机技术突飞猛进的速度。
企业信息化水平也随着计算机技术的发展不断进步,企业依赖软件的程度也愈来愈高。企业使用的这些软件,由于不一样的时间,不一样的需求,而采用了各类不一样的登陆技术,这使得企业内部想作到真正意义上的SSO依然面临诸多问题。
那咱们能不能再进一步去解决这些问题,至少在企业内部能真正意义上作到SSO呢?用统一的帐号登陆,既能登陆这些有年头的软件系统,能轻松接入现有流行的软件系统,还能给将来待开发的软件系统予以必定规范和帮助?

龙归科技在2019年开发并推出一款代号ArkID开源项目:龙归一帐通,就是针对企业目前在实现SSO方面的问题而提出的解决方案。
在这里插入图片描述
ArkID兼容本文介绍的和没介绍的现有流行的各种用户登陆协议,包括LDAP,SAML2,OpenID,OAuth2等等,同时ArkID还对外提供完整的API,方便接入各类新老系统,完成真正的单点登陆。
ArkID支持帐号同步,各种第三方帐号登陆(如微信,钉钉等),支持企业组织结构,支持应用受权。
ArkID彻底能够跟LDAP同样,做为远程帐号与组织结构数据库,甚至支持了对应用内权限的相关数据存储。
ArkID提供的登陆页面,容许自定义名字和颜色。同时将基于Vue的前端页面和管理后台开源,能够为所欲为的定制。
ArkID一样支持了完整的登陆日志,支持了用户行为审计。

一帐通产品页:https://www.longguikeji.com/product/arkid
源代码:https://github.com/longguikeji/arkid-core

相关文章
相关标签/搜索