Skip to main content

Security-OAuth 面试

认证和授权 Authentication & Authorization

用户授权

1. 你知道 OAuth2 的 Implicit Flow 和 PKCE 吗?

Implicit Flow

Implicit Flow 是 OAuth 2.0 授权框架的一种流程,主要用于那些无法安全存储机密(如客户端密钥)的客户端,通常是运行在用户浏览器中的单页应用(SPA)。它是一种简化的流程,直接返回访问令牌而不是授权码,避免了额外的服务器端令牌交换步骤。

Implicit Flow 的主要步骤如下:

  1. 客户端发起授权请求:
    • 客户端(通常是一个运行在用户浏览器中的 Web 应用)重定向用户到授权服务器的登录页面。
    • 这个请求包括客户端 ID、所请求的访问范围、重定向 URI 以及响应类型(这里为 token,表示客户端希望直接获得访问令牌)。
  2. 用户认证和授权:
    • 用户在授权服务器上进行认证(登录)并授权应用程序访问其资源。
  3. 授权服务器返回访问令牌:
    • 一旦用户授权,授权服务器会将用户重定向回之前指定的重定向 URI。
    • 在重定向过程中,访问令牌作为 URL 片段(fragment)附加在 URI 上。
  4. 客户端提取访问令牌:
    • 客户端从 URI 中提取访问令牌。
    • 然后,客户端可以使用此令牌来访问受保护的资源。

Implicit Flow 的特点是简单快捷,但它存在一些安全隐患,如较易暴露令牌给客户端和其他不安全的第三方。由于这些安全顾虑,一些最新的 OAuth 2.0 实践建议,例如 OAuth 2.1 草案,建议避免使用 Implicit Flow,转而使用更安全的授权码流程(Code Flow)与 PKCE 组合。

PKCE

PKCE(Proof Key for Code Exchange)是针对 OAuth 2.0 授权框架的一个安全扩展,特别适用于无法可靠地存储机密信息的客户端,例如运行在用户设备上的移动应用或单页面应用(SPA)。在 PKCE 流程中,“客户端”指的是运行在用户设备上的前端应用(如浏览器内的 JavaScript 应用或手机应用),而不是应用的后端服务器。

PKCE 流程的步骤如下:

  1. 生成 Code Verifier 和 Code Challenge:
    • 客户端(用户的设备上的应用,如浏览器)生成一个随机字符串,称为“Code Verifier”。
    • 然后,客户端通过对 Code Verifier 进行散列(通常使用 SHA-256)来生成“Code Challenge”。
  2. 发送授权请求:
    • 当用户尝试登录时,客户端将用户重定向到授权服务器的授权页面。这个请求包括 Code Challenge 和客户端的其他认证信息。
    • 这一步发生在用户的设备上,通常在浏览器中。
  3. 用户认证:
    • 用户在授权服务器页面上输入其凭据进行认证,并授权客户端访问其资源。
    • 认证成功后,授权服务器生成授权码,并将其通过重定向 URL 发送回客户端。
  4. 客户端请求令牌:
    • 客户端(仍然是用户的设备上的应用)使用收到的授权码以及它之前生成的 Code Verifier 向授权服务器请求访问令牌。
    • 这通常涉及到从客户端向授权服务器的令牌端点发送 POST 请求。
  5. 授权服务器响应:
    • 授权服务器验证 Code Verifier 与最初接收的 Code Challenge 是否匹配。
    • 如果验证成功,授权服务器向客户端发放访问令牌(和可选的刷新令牌)。

在 PKCE 流程中,所有重要的交互(包括生成 Code Verifier/Challenge、发送授权请求、接收授权码和请求访问令牌)都是在客户端(用户的设备上的前端应用)完成的。这增强了在不信任或无法存储机密信息的环境中的安全性,减少了令牌被拦截的风险。