OAuth 2.0授权框架支持第三方应用程序以获取对HTTP服务的有限访问,可以在通过编排审批交互来代表资源所有者在资源所有者和HTTP服务之间,或者通过允许代表第三方应用程序获取访问权限。
在传统的客户端 - 服务器身份验证模型中,客户端请求访问受限资源(受保护资源)通过使用资源所有者的资格证书。
为了让第三方应用程序能够访问受限资源,资源所有者与第三方应用程序共享资源所有者的凭据。这会产生一些问题和限制:
OAuth通过引入授权层来解决这些问题将客户端的角色与资源所有者的角色分离。在OAuth中,客户端请求由资源所有者托管在资源服务器上的受控资源,并且发行了一套与资源所有者不同的凭证。
而不是使用资源所有者的凭证来访问受保护的资源,客户端获得一个访问字符串令牌(字符串中记录令牌的特定范围、生存期限和其他访问属性)。访问令牌由资源所有者批准颁发。客户端使用访问令牌去访问由资源服务器承载的受保护资源。
能够授予对受保护资源的访问权限的实体。当资源所有者是一个人时,它被称之为最终用户。
托管受保护资源的服务器,能够接受并使用访问令牌响应受保护资源的资源请求。
代表资源所有者授权发出对受保护资源请求的应用程序。术语“客户端”并不意味着任何特定的实现特性(例如,应用程序是在服务器、台式机还是在其他服务器的设备上执行)。
资源所有者验证成功后,获得向客户端颁发访问令牌的服务器。
授权服务器可以是与资源服务器在相同的服务器上,也可以是单独的实体。单个授权服务器可以向多个资源服务器进行授权管理。
(A)客户端请求资源所有者的授权。授权请求可以直接向资源所有者提出,或者最好间接通过授权服务器作为中介。
(B)客户端收到授予的授权,即代表资源所有者授权的凭证。使用下面定义的四种授予类型之一表示指定或者使用扩展授权类型。这个授权授予类型取决于请求授权的客户端和授权服务器。
(C)客户端通过使用资源所有者授予的授权向授权服务器申请访问令牌。
(D)授权服务器验证客户端身份与资源所有者授予的授权,如果有效,则颁发访问令牌。
(E) 客户端通过提供访问令牌进行身份验证去资源服务器请求受保护的资源。
(F)资源服务器验证访问令牌,如果有效,则满足客户端的服务请求。
OAuth 2.0 的核心思想是向第三方应用程序颁发访问令牌。
OAuth 2.0 提供了四种授予客户端访问令牌的方法:
授权码的授权方式是最推荐的授权获取访问令牌的方法。选择哪种方法进行令牌授予需根据自己的需要去选择适合的。
1. 授权码(Authorization Code)
指的是第三方应用程序先向授权服务器在资源所有者确认之后申请一个授权码,然后在使用授权码去资源服务器申请一个访问令牌。
资源服务器验证访问令牌,如果有效,满足请求。使用授权服务器作为客户端与资源所有者的中介,来授予授权代码。而不是直接从资源所有者请求授权,将资源所有者定向到授权服务器,授权服务器反过来将资源所有者允许的授权代码返回给客户端。
在使用授权代码时。授权服务器验证资源所有者并获得授权。因为资源所有者仅使用授权服务器进行身份验证,资源所有者的凭证从不与客户端共享。
授权码提供了一些重要的安全好处,例如验证客户端的能力,以及通过资源所有者的用户代理将访问令牌直接传输到客户端,将访问令牌暴露给其他人,包括资源所有者。
2. 隐藏式(Implicit)
隐藏式流程中是指允许直接向前端颁发令牌,而不是通过授权服务器这个中介向客户端发送授权码,这种方式没有了授权码方式中的获取授权的过程。客户端直接获取访问令牌。
隐藏式流程相对不安全,所以隐藏式的访问令牌的生命周期因该很短,如会话期间有效,关闭浏览器后,访问令牌的生命周期也就结束了。
3. 密码式(Resource Owner Password Credentials)
资源所有者的密码凭证(即用户名和密码)可以直接用作授权授予以获得访问权限令牌。凭证仅存在高级别信任度的资源所有者与客户端之间(如,客户端是设备操作系统的一部分,或者是特权很高的客户端申请)。
密码式流程需要将用户的用户名密码告诉客户端,风险很大,无可奈何时才会使用,并且是高信任度的应用程序。
4.客户端凭证(Client Credentials)
客户端凭据(或其他形式的客户端身份验证)可以当授权范围为仅限于受客户端控制的受保护资源,或对先前经授权安排的受保护资源服务器。
客户端凭据用作授权授予通常当客户代表自己行事时(客户是也是资源所有者)或正在请求访问受保护的基于先前与授权服务器。