DC娱乐网

OAuth2.0 学习

OAuth,全称Open Authorization(开放式授权) 是一种技术标准,允许授权一个应用或服务登录到另一个应

OAuth,全称Open Authorization(开放式授权) 是一种技术标准,允许授权一个应用或服务登录到另一个应用或服务,无需泄露密码等私有信息。OAuth 设计用于超文本传输协议 (HTTP)。它使用访问令牌来证明你的身份,并允许它代表你与另一个服务进行交互。如果第二个服务发生数据泄露,你在第一个服务上的凭据仍然安全。OAuth 不会授予第三方应用或服务无限制访问数据的权限。OAuth 2.0授权框架使第三方应用程序能够代表资源所有者获得对HTTP服务的有限访问权,方法是协调资源所有者和HTTP服务之间的批准交互,或者允许第三方应用程序代表自己获得访问权。

角色

OAuth定义了四个角色:

Resource Owner,资源所有者。

资源所有者能够授予对受保护资源的访问权限的实体。当资源所有者是个人时,它被称为最终用户。

Resource Server, 资源服务器。

资源服务器托管受保护资源的服务器,能够使用访问令牌接受和响应受保护资源请求。

Client,客户机。

客户机代表资源所有者及其授权发出受保护资源请求的应用程序。术语“客户端”并不意味着任何特定的实现特征(例如,应用程序是否在服务器、桌面或其他设备上执行)。

Authorization Server,授权服务器。

授权服务器成功验证资源所有者并获得授权后向客户端颁发访问令牌的服务器。授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以是与资源服务器相同的服务器,也可以是单独的实体。单个授权服务器可以发出多个资源服务器接受的访问令牌。

协议

上图所示的抽象OAuth 2.0流程描述了四个角色之间的交互,包括以下步骤:

(A) 客户端向资源所有者请求授权。授权请求可以直接向资源所有者发出(如图所示),或者优选地通过作为中介的授权服务器间接发出。

(B) 客户端接收授权授予,这是表示资源所有者授权的凭证,使用本规范中定义的四种授予类型之一或扩展授予类型表示。授权授予类型取决于客户端用于请求授权的方法以及授权服务器支持的类型。

(C) 客户端通过与授权服务器进行身份验证并提供授权授予来请求访问令牌。

(D) 授权服务器对客户端进行身份验证并验证授权授予,如果有效,则发出访问令牌。

(E) 客户端从资源服务器请求受保护的资源,并通过提供访问令牌进行身份验证。

(F) 资源服务器验证访问令牌,如果有效,则为请求提供服务。

刷新令牌

刷新令牌是用于获取访问令牌的凭据。刷新令牌由授权服务器颁发给客户端,用于在当前访问令牌无效或过期时获取新的访问令牌,或获取范围相同或更窄的其他访问令牌(访问令牌的生存期和权限可能比资源所有者授权的要短)。由授权服务器决定是否发布刷新令牌是可选的。如果授权服务器发出刷新令牌,则在发出访问令牌时会包括该令牌。

刷新令牌是一个字符串,表示资源所有者授予客户端的授权。字符串对于客户端通常是不透明的。该标记表示用于检索标记的标识符授权信息。与访问令牌不同,刷新令牌仅用于授权服务器,从不发送到资源服务器。

所示的流程包括以下步骤:

(A) 客户端通过与授权服务器进行身份验证并提供授权授予来请求访问令牌。

(B) 授权服务器对客户端进行身份验证并验证授权授予,如果有效,则发出访问令牌和刷新令牌。

(C) 客户端通过提供访问令牌向资源服务器发出受保护的资源请求。

(D) 资源服务器验证访问令牌,如果有效,则为请求提供服务。

(E) 重复步骤(C)和(D),直到访问令牌到期。如果客户端知道访问令牌已过期,则跳到步骤(G);否则,它会发出另一个受保护的资源请求。

(F) 由于访问令牌无效,资源服务器返回无效令牌错误。

(G) 客户端通过使用授权服务器进行身份验证并显示刷新令牌来请求新的访问令牌。客户端身份验证要求基于客户端类型和授权服务器策略。

(H) 授权服务器对客户端进行身份验证并验证刷新令牌,如果有效,则发出新的访问令牌(以及,可选的,新的刷新令牌)。

授权方式

要请求访问令牌,客户端需要从资源所有者那里获得授权。授权以授权授予的形式表示,客户端使用授权授予来请求访问令牌。OAuth定义了四种授权类型:授权码、隐式、资源所有者密码凭证和客户端凭证。它还提供了一种扩展机制,用于定义额外的授权类型。

授权码(authorization-code)

授权码授权类型用于获取访问令牌和刷新令牌,并针对机密客户端进行了优化。由于这是一个基于重定向的流,因此客户端必须能够与资源所有者的用户代理(通常是web浏览器)交互,并能够接收来自授权服务器的传入请求(通过重定向)。

(A) 客户端通过将资源所有者的用户代理定向到授权端点来启动流。客户机包括其客户机标识符、请求的作用域、本地状态和重定向URI,一旦授予(或拒绝)访问权限,授权服务器将向其发回用户代理。

(B) 授权服务器(通过用户代理)验证资源所有者,并确定资源所有者是批准还是拒绝客户端的访问请求。

(C) 假设资源所有者授予访问权限,授权服务器使用前面提供的重定向URI(在请求中或在客户端注册期间)将用户代理重定向回客户端。重定向URI包括授权代码和客户端先前提供的任何本地状态。

(D) 客户端通过包括在上一步中接收到的授权代码,从授权服务器的令牌端点请求访问令牌。发出请求时,客户机通过授权服务器进行身份验证。客户端包括用于获取验证授权代码的重定向URI。

(E) 授权服务器验证客户端,验证授权代码,并确保接收到的重定向URI与步骤(C)中用于重定向客户端的URI匹配。如果有效,授权服务器将使用访问令牌和刷新令牌(可选)进行响应。

隐藏式(implicit)

隐式授权类型用于获取访问令牌(它不支持发布刷新令牌),并针对已知操作特定重定向URI的公共客户端进行了优化。这些客户端通常使用脚本语言(如JavaScript)在浏览器中实现。

由于这是一个基于重定向的流,因此客户端必须能够与资源所有者的用户代理(通常是web浏览器)交互,并能够接收来自授权服务器的传入请求(通过重定向)。

与授权码授予类型不同,在授权码授予类型中,客户端分别请求授权和访问令牌,客户端接收访问令牌作为授权请求的结果。

隐式授权类型不包括客户端身份验证,它依赖于资源所有者的存在和重定向URI的注册。由于访问令牌被编码到重定向URI中,因此它可能会暴露给资源所有者和驻留在同一设备上的其他应用程序。

(A) 客户端通过将资源所有者的用户代理定向到授权端点来启动流。客户机包括其客户机标识符、请求的作用域、本地状态和重定向URI,一旦授予(或拒绝)访问权限,授权服务器将向其发回用户代理。

(B) 授权服务器(通过用户代理)验证资源所有者,并确定资源所有者是批准还是拒绝客户端的访问请求。

(C) 假设资源所有者授予访问权限,授权服务器使用前面提供的重定向URI将用户代理重定向回客户端。重定向URI在URI片段中包含访问令牌。

(D) 用户代理通过向web承载的客户端资源发出请求(不包括[RFC2616]中的片段)来遵循重定向说明。用户代理在本地保留片段信息。

(F) 用户代理在本地执行web托管客户端资源提供的脚本,该脚本提取访问令牌。

(G) 用户代理将访问令牌传递给客户端。

密码式(password)

资源所有者密码凭据授予类型适用于资源所有者与客户端具有信任关系的情况,例如设备操作系统或高特权服务器

应用授权服务器在启用此授权类型时应特别小心,并且仅在其他流不可行时才允许它。

此授权类型适用于能够获取资源所有者凭据(用户名和密码,通常使用交互式表单)的客户端。它还用于通过将存储的凭据转换为访问令牌,使用直接身份验证方案(如HTTP Basic或摘要身份验证)将现有客户端迁移到OAuth。

(A) 资源所有者向客户端提供其用户名和密码。

(B) 客户端通过包括从资源所有者接收的凭据,从授权服务器的令牌端点请求访问令牌。发出请求时,客户机通过授权服务器进行身份验证。

(C) 授权服务器验证客户端并验证资源所有者凭据,如果有效,则发出访问令牌。

客户端凭证(client credentials)

当客户端请求访问其控制下的受保护资源或先前与授权服务器一起安排的其他资源所有者的资源时,客户端可以仅使用其客户端凭据(或其他支持的身份验证方式)请求访问令牌(其方法超出本规范的范围)。

客户端凭据授予类型只能由机密客户端使用。

(A) 客户端通过授权服务器进行身份验证,并从令牌端点请求访问令牌。

(B) 授权服务器对客户端进行身份验证,如果有效,则发出访问令牌。

身份验证的相关技术

SSO

SSO,单点登录(Single Sign-On)是一种允许用户使用一组凭据登录多个应用程序或网站的系统的技术,即用户只需一次登录,然后就可以访问多个关联的应用程序或服务,而无需每次都输入凭据,登录一处,处处可访问。

JWT

JSON Web Token(JWT)是一种用于身份验证和授权的令牌。它们通常由服务器生成并发送到客户端,在那里它们可以被存储并包含在访问受保护资源的后续请求中。是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准,它是一个自包含的令牌,可以通过HTTP头部在用户和服务器之间安全地传输信息。

JWT由头部(Header)、载荷(Payload)和签名(Signature)三部分组成,使用点(.)分隔。

头部:包含了令牌的元数据,主要是令牌的类型(JWT)和所使用的签名算法(如HMAC SHA256、RSA等)。

载荷:包含了实际要传输的数据,如用户ID、用户名、过期时间等。这些声明被分为三类:注册声明、公共声明和私有声明。

签名:签名部分是对头部和载荷的签名,以防止数据被篡改。它需要使用头部中指定的签名算法和密钥来完成。

Token

Token(令牌)一般来说,令牌是授予访问特定资源或权限的一条信息。令牌通常用于web应用程序中的身份验证、授权和会话管理。Token通常指的是由服务器生成的一串字符串,作为客户端进行请求的一个令牌。当第一次登录后,服务器生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

Cookie

Cookie 是存储在客户端浏览器上的一小段数据,通常用于存储客户端发出后续请求时服务器可以访问的用户首选项、会话id和其他信息。Cookie是一种基于客户端的身份验证机制,它利用浏览器的本地存储来保存用户的状态信息。

Session

Session 是在服务器端存储与特定用户相关数据的一种方式。服务器生成唯一标识符(会话ID)并将其发送给客户端,通常是通过cookie。然后使用此会话ID在会话期间从服务器检索用户的数据。会话通常用于维护用户登录状态、存储购物车项目和其他临时数据。Session是一种基于服务器的身份验证机制,它利用服务器端的内存或数据库来存储用户的状态信息。

总结

Session、Cookie和Token都是用于在客户端和服务器之间保存用户状态信息的身份验证机制。Session基于服务器存储,Cookie基于客户端存储,而Token则可以在客户端和服务器之间传输。

JWT是一种特殊的Token格式,具有自包含、安全性高和易于扩展等特点。

SSO和OAuth 2.0是更高层次的身份验证和授权协议。SSO允许用户一次登录即可访问多个关联的应用程序或服务,而OAuth 2.0则用于授权第三方应用程序访问受保护的资源。