在授权码中使用 PKCE 可授予 Amazon Cognito 用户池的权限 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在授权码中使用 PKCE 可授予 Amazon Cognito 用户池的权限

Amazon Cognito 在授权码授权中支持代码交换证明密钥 (PKCE) 身份验证。PKCE 是 OAuth 2.0 授权码授予公共客户端的扩展。PKCE 防范被拦截的授权码兑换。

亚马逊 Cognito 如何使用 PKCE

要开始使用 PKCE 进行身份验证,您的应用程序必须生成一个唯一的字符串值。此字符串是代码验证器,Amazon Cognito 使用该值将请求初始授权的客户端与使用授权码交换令牌的客户进行比较。

您的应用程序必须对代码验证器字符串应用 SHA256 哈希值,并将结果编码为 base64。将经过哈希处理的字符串对端点授权作为请求正文中的code_challenge参数传递给的。当您的应用程序将授权码交换为令牌时,它必须将纯文本的代码验证器字符串作为code_verifier参数包含在请求正文中。令牌端点Amazon Cognito 对代码验证器执行相同的 hash-and-encode 操作。Amazon Cognito 仅在确定代码验证器产生的代码质询与授权请求中收到的代码质询相同,才会返回 ID、访问和刷新令牌。

使用 PKCE 实现授权授予流程
  1. 打开 Amazon Cognito 控制台。如果出现提示,请输入您的 Amazon 凭据。

  2. 选择用户池

  3. 从列表中选择一个现有用户池,或创建一个用户池。如果您创建了用户池,则在向导期间,系统将提示您设置应用程序客户端并配置托管用户界面。

    1. 如果您创建了新的用户池,请在引导式设置期间设置应用程序客户端并配置托管用户界面。

    2. 如果您配置现有用户池,请添加公共应用程序客户端(如果尚未配置)。

  4. 生成一个随机的字母数字字符串,通常是通用唯一标识符 (UUID),以便为 PKCE 创建代码质询。此字符串是您将在向的请求中提交的code_verifier参数的值令牌端点

  5. 使用 SHA256 算法对code_verifier字符串进行哈希处理。将哈希操作的结果编码为 base64。此字符串是您将在向的请求中提交的code_challenge参数的值对端点授权

    以下Python示例生成 a code_verifier 并计算code_challenge

    #!/usr/bin/env python3 import random from base64 import urlsafe_b64encode from hashlib import sha256 from string import ascii_letters from string import digits # use a cryptographically strong random number generator source rand = random.SystemRandom() code_verifier = ''.join(rand.choices(ascii_letters + digits, k=128)) code_verifier_hash = sha256(code_verifier.encode()).digest() code_challenge = urlsafe_b64encode(code_verifier_hash).decode().rstrip('=') print(f"code challenge: {code_challenge}") print(f"code verifier: {code_verifier}")

    以下是Python脚本的输出示例:

    code challenge: Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg code verifier: 9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
  6. 使用 PKCE 的授权码授权请求完成托管 UI 登录。以下是 URL 示例:

    https://mydomain.us-east-1.amazoncognito.com/oauth2/authorize?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com&code_challenge=Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg&code_challenge_method=S256
  7. 收集授权code并使用令牌端点将其兑换为令牌。以下是一个请求示例:

    POST /oauth2/token HTTP/1.1 Host: mydomain.us-east-1.amazoncognito.com Content-Type: application/x-www-form-urlencoded Content-Length: 296 redirect_uri=https%3A%2F%2Fwww.example.com& client_id=1example23456789& code=7378f445-c87f-400c-855e-0297d072ff03& grant_type=authorization_code& code_verifier=9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
  8. 查看回复。它将包含 ID、访问和刷新令牌。有关使用 Amazon Cognito 用户池令牌的更多信息,请参阅。将令牌与用户池结合使用