Web数字身份的认证与授权介绍-OpenID、OAuth、SAML
统一数字身份认证与授权中三种最常见的Web安全协议是OpenID,OAuth和SAML。无论是PC客户端还是移动端,第三方应用账户登录已经成为了标配,特别是在网络账户相互打通的前提下,不同平台对身份已经做到了互认。第三方账户在登录时,既要限制用户身份,只让有效注册的用户才能登录,也要根据注册用户的不同身份来控制能浏览的内容,这就需要认证和授权。
本文通过举例来介绍这三种协议的含义和之间的不同。
授权和身份验证基础知识
做为一个面向公众的网站都希望能够对每个用户进行身份验证和授权。身份验证意味着验证某人确实是他们声称的身份。授权意味着决定某个用户能够访问哪些资源,以及允许他们对这些资源执行哪些操作。
对于Facebook或Google等网站,用户可以使用一组凭证登录到一个应用程序。然后可以使用同一组凭证登录相关网站或应用程序。而对于企业来说,可能有一个面向内部的员工门户网站,通过让员工登录门户,并让该门户自动通过其他Intranet站点对用户进行身份验证。这种称为单点登录(SSO)的想法允许用户输入一个用户名和密码可以访问多个应用程序。
这样做对用户来说非常好,他们只需管理相关网站的一个用户名和密码,同时可以避免多次登录。用户(单组)凭证将存储在一个数据库中,而不是存储在多个数据库中的多个凭证。这也意味着各种应用程序的开发人员不必存储密码,而是接受来自可信来源的身份证明或授权。
实施SSO有多种解决方案,三种最常见的Web安全协议是OpenID,OAuth和SAML。
什么是认证、授权、单点登录
认证(Authenticate)和授权(Authorize),是两个容易混淆的概念。认证过程是证实某个用户是他所声明的那个人;授权则要决定一个身份是否能够访问网站资源。由此可见,应用需要先认证用户身份,然后依据用户身份进行授权,二者需要联合使用。

对于微信这样的应用,用户在登录后会得到该账户的身份凭证。如果其他第三方应用信任并接受微信的身份凭证,就可以直接使用该凭证通过第三方的认证而登录。至于登陆之后用户能有权限去做什么,则是要第三方应用根据自己的政策进行授权。有些网站在第一次使用微信账户登录时,需要绑定已用账户,就是因为虽然网站能够通过微信账户的身份认证,但是对于这样的账户没有对应的授权。

对于一个面向体系内部的服务环境,可能有邮箱系统、网上办公系统、财务系统等。如果每个系统都是独立的,那么公司的员工就需要每一个系统都分配一个账户,这样显然是低效且麻烦的。
目前,通用解决方案是单点登录(Single Sign-On,简称SSO),用户在内网中只需登录一次,就可以访问所有相互信任的应用系统。单点登录和统一认证中主要的三个协议是OpenID、OAuth、SAML,被称为单点登录的“三驾马车”。

OpenID(去中心化认证的第三方登录经典模式)
OpenID是一种开放的身份验证标准,由非营利性OpenID Foundation推广。Google,WordPress,Yahoo和PayPal等组织都支持使用OpenId对用户进行身份验证。
用户必须通过OpenID帐户身份提供商(例如,谷歌)得到一个OpenID。然后用户将使用该帐户登录任何接受OpenID身份验证的网站(依赖方)(例如YouTube或其他接受Google帐户登录的网站)。OpenID标准为身份提供者和依赖方之间必须进行的通信提供了框架。
这种交换可以与过海关进行比较。想象一下,爱丽丝是一个想要访问美国的加拿大公民。在边境,美国要求提供身份证明(她的护照)。由于美国政府信任加拿大政府为其公民提供的身份证明,美国接受爱丽丝的护照作为其身份的可靠证据,因此,让她进入美国。在此示例中,Alice是最终用户,US是依赖方,Canada是身份提供者。
这种交换是有效的,因为Alice可以向美国提供来自美国信任的实体的身份证明。同样,依赖方(或用户尝试登录的网站)必须信任验证用户身份的OpenID身份提供者。
谈到单点登录和身份认证,就不得不谈OpenID。最典型的使用实例就是使用Google账户登录其他应用,这一经典的协议模式,为其他厂商的第三方登录起到了标杆的作用,被广泛参考和使用。

OpenID是一个去中心化的数字身份识别框架,属于认证(Authentication)协议。OpenID的创建基于这样一个概念:我们可以通过统一资源标识符(URI)来认证一个网站的唯一身份对于支持OpenID的网站。用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为OpenID身份提供者(Identity Provider, IdP)的网站上注册。
任何网站都可以使用OpenID来作为用户登录的一种方式,也都可以作为OpenID的身份提供者,它既解决了问题而又不需要依赖于中心化的网站来确认数字身份。
OpenID的第一部分是身份验证,即如何通过URI来认证用户身份。目前的网站都是依靠用户名和密码来登录认证,这就意味着大家在每个网站都需要注册用户名和密码,即便你使用的是同样的密码。如果使用OpenID,你的网站地址(URI)就是你的用户名,而你的密码安全的存储在一个OpenID服务网站上。
由于良好的通用性,OpenID正在被越来越多的大型互联网平台采用,比如作为身份提供者的AOL和Orange。它既可以应用于单点登录系统,也可以用于共享敏感数据时的身份认证。由于URI是整个网络世界的核心,它为基于URI的用户身份认证提供了广泛的、坚实的基础。
OAuth2(不触碰用户信息即可授权的“黑匣”协议)
相比之下,OAuth2是授权的开放标准。OAuth2也是OpenID Connect的基础,OpenID Connect在OAuth2(授权)之上提供OpenID(身份验证),以获得更完整的安全解决方案。OpenID Connect(OIDC)于2014年初创建。
OAuth2提供安全的委派访问,这意味着称为客户端的应用程序可以代表用户在资源服务器上执行操作或访问资源,而无需用户与应用程序共享其凭据。OAuth2通过允许令牌由身份提供商向这些第三方应用程序发布,并经用户批准来实现此目的。然后,客户端使用令牌代表用户访问资源服务器。
然而,Twitter的OAuth指南 称OAuth2是一种身份验证标准。为什么要这么说呢?事实证明,授权可以用作伪认证的一种形式。
OAuth2的授权使用案例可能如下:Alice正在离开城镇,她希望她的朋友鲍勃能够帮忙照看房子。爱丽丝给鲍勃房子钥匙,他现在有权进入房子。密钥授予他进入房屋的授权,因为授权涉及用户应该访问哪些资源,以及他们可以使用这些资源做什么。在这个比喻中,房主是用户,鲍勃是客户,门锁是身份提供者,房子是资源服务器。通过假设拥有房屋钥匙的人是房主,可以将其映射成伪认证用例。然而,正如我们可以看到鲍勃坐在爱丽丝家中,但他并不是房主。
OAuth协议为用户资源的授权提供了一个安全、开放且简易的标准。比起OpenID,OAuth更像是一个授权(Authorization)协议,其独特之处在于:它可以让第三方应用程序在不获取用户账号密码的情况下,获得属于用户的资源或是进行符合用户权限的操作。在这个过程中,令牌(Token)成为核心节点。OAuth2.0通过IdP给第三方应用颁发令牌来实现以上功能,第三方应用则通过使用令牌向资源服务换取对应的资源。

OAuth2.0是2006年提出来的新一代OAuth版本,比起OAuth1.X,它简化了认证交互过程,增加了认证机制,并对代码和可能出现的漏洞进行了优化与修改。OAuth2.0协议主要有四个角色:用户、资源服务器、授权服务器、客户端。
那么这四个角色完成一个怎样的流程呢?举个例子,Alice要外出一段时间,让自己的朋友Bob代为照顾她的房子,所以Alice把自己房子的钥匙交给了Bob,而Bob也就可以任意进入房子。这里的钥匙就是一种授权的体现 — — Alice授权Bob进入房子。这其中,房子所有者Alice就是用户,Bob是客户端,而门锁就是授权服务器,房子是资源服务器。
SAML(兼顾认证与授权的身份信息共享通道)
SAML是三者中最古老的标准,最初于2001年开发,其最新的主要更新发布于2005年.SAML,发音为“sam-el”,代表安全断言标记语言。它是一个提供身份验证和授权的开放标准。与其他两个标准的术语类似,SAML定义了一个主体,即最终用户尝试访问资源。有一个服务提供程序,它是委托人试图访问的Web服务器。还有一个身份提供者,它是拥有主体身份和凭据的服务器。
美国/加拿大的比喻也可以在这里使用。爱丽丝希望从加拿大进入美国。美国希望验证她的身份或其他有关她的信息 - 她是否拥有允许她在美国驾驶的有效驾驶执照 - 向加拿大提出有关Alice的身份验证和/或授权信息的请求。加拿大通过将所要求的信息发送到所请求的地址以及加拿大确实是该消息的发送者的一些证据来做出回应。这个证据可能像以前一样采用护照的形式,或官方的政府文件或签证(涉及授权请求)。而且,和以前一样,该系统的前提是美国信任加拿大正在发放驾驶执照,签证等。
在我们的示例中,Alice是委托人,美国是服务提供商,加拿大再次是身份提供者。美国向加拿大提出的请求类似于XML消息,该消息说明正在请求哪些信息,谁在询问以及应该向谁返回响应。加拿大的回复将被称为断言,类似于OpenID或OAuth2的令牌。此断言可以包含有关身份验证,授权和/或属性(有关用户的特定信息,如电子邮件或电话号码)的声明。
SAML协议(Security Assertion Markup Language,安全性断言标记语言)是三者中时间最长的协议,最初版本制定于2001年,并于2005年修改。作为一种安全性断言标记语言,SAML协议既可以用于认证也用于授权。所谓的安全性断言,就是关于认证、授权以及用户属性(比如用户姓名、住址等信息)的声明集合,在SAML中,这些断言以XML格式进行传输。SAML的主要功能是在不同的安全域之间提供身份认证和授权信息交换,为用户跨平台进行身份认证和授权提供了方便,解决了多个系统共享认证、授权过程中的信息传递问题。

当要验证一个用户身份时,服务提供商(Service Provider,简称SP)会向IdP发出SAML认证请求,该请求中会以XML格式说明认证方式的设置,比如希望IdP以何种方式验证用户。IdP在认证通过用户身份之后,会返回SAML请求响应,同样以XML格式返回断言表明用户身份和相关属性,此外SAML安全性断言信息必须要使用数字签名以保证其完整性和不可抵赖性。SP接收到SAML断言之后,验证其消息来源是否费受信任的IdP,验证通过之后解析XML获得认证信息。

当前的身份认证技术在为用户提供便利服务的同时,其弊端也正在凸显,比如隐私泄露、身份欺诈窃取、身份无法跨境互认等。但我们相信,技术的进步总是出人意料,区块链的发展将为数字身份的发展注入更多活力,并有望推动其成为全球通用的可信基础设施。
SAML 2.0规范定义了断言(如上所述);
协议:即断言请求和响应;
绑定:这些请求和响应如何在服务提供者和身份提供者之间发生,使用标准通信方法(例如HTTP POST);
配置文件:它们是各种用例(如SSO)的断言,协议和绑定的组合。