OAuth2 协议及其四种授权模式
官方资料置顶,本篇文章主要结合官方资料与自己的使用经验对 OAuth2 协议做一个简单的记录。
部分翻译解释可能存在问题,如果发现了,欢迎及时在评论区向博主反馈。
What is OAuth2 ?
An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.
关键词: 开源协议、安全授权、简单、标准
Why ?
为了解决以下问题
- 第三方应用程序需要存储资源所有者的凭据供以后使用,通常是明文密码
- 哪怕密码校验不安全,服务器还是需要支持密码身份验证
- 第三方应用程序获得对资源所有者受保护资源的过于广泛的访问,使得资源所有者无法限制持续时间或访问有限的资源子集
- 资源所有者不能在不撤销对所有第三方的访问的情况下撤销对单个第三方的访问,而且必须通过更改第三方的密码来撤销访问
- 任何第三方应用程序的安全问题都会导致最终用户的密码和所有受该密码保护的数据受到损害
OAuth2 中的角色
-
Resource Owner (资源所有者)
能够授予对被保护资源的访问权限的实体。当资源所有者是个人时,它被称为最终用户
-
Client (第三方应用)
代表资源所有者并经其授权提出受保护资源请求的应用程序。
-
User-Agent (用户代理)
Web 浏览器就是一个典型的 User-Agent
-
服务提供商
-
Authorization Server (授权服务器)
在成功验证资源所有者并获得授权之后,发出访问令牌的服务器将向客户端发出访问令牌
-
Resource Server (资源服务器)
存储获取受保护资源的服务器,能够使用访问令牌接收和响应受保护的资源请求
-
Protocol Flow
( A ) 客户端向资源所有者请求授权,授权请求可以直接向资源所有者提出,但是更好的做法是通过 Authorization Server 做中介。在授权码模式下就是将用户引导到 Authorization Server 进行确认。
( B ) 客户端接收 Authorization Grant,它是代表 Resource Owner 授权的凭据,使用规范的四种授权类型中的一种或者使用扩展授权类型中的一种来表示。授权类型取决于客户端使用的请求授权的方法和 Authorization Server 支持的类型。
( C ) 客户端通过请求向 Authorization Server 进行身份认证且提供 Authorization Grant 来请求 Access Token。
( D ) Authorization Server 通过对客户端进行身份认证,校验 Authorization Grant,如果有效,发出 Access Token。
( E ) 客户端使用 Access Token 向 Resource Server 请求受保护的资源。
( F ) Resource Server 校验 Access Token,如果有效,满足请求。
四种授权类型
Authorization Code (授权码模式)
( A ) 客户端将用户代理引导到 Authorization Server 来启动整个授权流程。客户端包括 Client Identifier,Request Scope,Local State,Redirection URI (授权服务器在授予(或拒绝)访问权限后将用户代理发送回的重定向URI)。
( B ) Authorization Server (通过用户代理) 对资源所有者进行身份验证,并确定资源所有者是否授权或拒绝客户端的访问请求。
( C ) 假设 Resource Owner 授予访问权限,Authorization Server 使用先前提供的重定向URI(在请求中或在客户端注册期间)将用户代理重定向回客户端。重定向URI携带 Authorization Code 和客户端先前提供的任何本地状态。
( D ) 客户端使用步骤 ( C ) 获取到的 Authorization Code 向 Authorization Server 的令牌端点请求 AccessToken。发出请求时,Authorization Server 会对客户端进行身份验证。请求需要携带 Authorization Code 与获取 Authorization Code 时的重定向URI。
( E ) 授权服务器对客户端进行身份验证,验证 Authorization Code,并确保收到的重定向URI与步骤(C)中用于重定向客户端的URI相匹配。如果有效,授权服务器会发出 AccessToken、Refresh Token(可选)。
Implicit (简化模式)
( A ) 客户端将用户代理引导到 Authorization Server 来启动整个授权流程。客户端包括 Client Identifier,Request Scope,Local State,Redirection URI (授权服务器在授予(或拒绝)访问权限后将用户代理发送回的重定向URI)。
( B ) Authorization Server (通过用户代理) 对资源所有者进行身份验证,并确定资源所有者是否授权或拒绝客户端的访问请求。
( C ) 假设 Resource Owner 授予访问权限,Authorization Server 使用前面提供的重定向URI将用户代理重定向回客户端。重定向URI携带URI片段中的 Access Token。
( D ) 用户代理通过向 Web 托管的客户端资源(不包括每个片段)发出请求来遵循重定向指令。用户代理在本地保留片段信息。
( E ) Web托管的客户端资源返回一个网页(通常是带有嵌入脚本的HTML文档),能够访问完整的重定向URI,包括用户代理保留的片段,并提取包含在其中的访问令牌(和其他参数)。
( F ) 用户代理在本地执行由 Web 托管的客户端资源提供的脚本,该脚本提取访问令牌。
( G ) 用户代理将访问令牌传递给客户端。
Resource Owner Password Credentials (密码模式)
( A ) Resource Owner 将用户名、密码提供给客户端。
( B ) 客户端使用 Resource Owner 提供的用户名、密码向 Authorization Server 请求 Access Token。Authorization Server 收到请求时,会同时对客户端进行身份验证。
( C ) 授权服务器对客户端进行身份验证并验证 Resource Owner 凭据,如果有效,则发放 Access Token。
Client Credentials (客户端模式)
( A ) 客户端使用 Authorization Server 进行身份验证,并从令牌端点请求 Access Token。
( B ) Authorization Server 对客户端进行身份验证,如果有效,则发出 Access Token。
Refresh Token
( A ) 客户端通过请求向 Authorization Server 进行身份认证且提供 Authorization Grant 来请求 Access Token。
( B ) Authorization Server 通过对客户端进行身份认证,校验 Authorization Grant,如果有效,发出 Access Token。
( C ) 客户端使用 Access Token 向 Resource Server 请求受保护的资源。
( D ) Resource Server 校验 Access Token,如果有效,满足请求。
( E ) 重复步骤 ( C ) 和 ( D ),直到 Access Token 过期失效。如果客户端发现 Access Token 过期失效,客户端会去执行步骤 (G ); 否则,它可以尝试请求其他的受保护资源。
( F ) 使用无效的 Access Token 访问资源,Resource Server 会返回 Invalid Token Error。
( G ) 客户端通过请求向 Authorization Server 进行身份认证且提供 Refresh Token 来请求新的 Access Token。
( H ) The authorization server authenticates the client and validates the refresh token, and if valid, issues a new access token (and, optionally, a new refresh token). Authorization Server 通过对客户端进行身份验证并校验 Refresh Token 的有效性。如果通过,会发出一个新的 Access Token、Refresh Token(可选项)
OK,到了这里对 OAuth2 协议进行了简单的介绍和学习,后面在记录 SpringSocial 与 SpringSecurity 使用 Token 认证时会关联到这一块知识点,所以这里算是一个前置知识点吧。下一篇尽快把 SpringSocial 集成 QQ 登录完成.
=> To Be Contionued!