You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Cognito两种Access Token差异及后端适配问题咨询

问题解答

两种Access Token的核心差异

是的,这两种Access Token完全不同,不能跨场景混用:

  • OAuth 2.0 Access Token(通过/oauth2/token获取):属于OAuth标准流程的凭证,受众(aud)指向你的应用客户端,主要用于:
    • 调用Cognito的OAuth端点(如/oauth2/userInfo)
    • 访问受Cognito保护的API网关资源
  • Cognito User Pool Access Token(通过boto3 initiate_auth获取):是Cognito内部的用户身份凭证,受众为Cognito User Pool服务本身,仅用于调用Cognito IDP的管理API(如get_user、update_user_attributes等)

后端处理前端OAuth Access Token的正确方式

不需要强制引入aws-sdk或aws-amplify,有几种高效方案可选:

方案1:调用Cognito /oauth2/userInfo接口获取用户信息

这是最直接的标准方式,和你测试的逻辑一致:

import requests

def get_user_info(oauth_access_token: str, cognito_domain: str):
    response = requests.get(
        f"https://{cognito_domain}/oauth2/userInfo",
        headers={
            "Authorization": f"Bearer {oauth_access_token}",
            "Content-Type": "application/json"
        }
    )
    response.raise_for_status()
    return response.json()

方案2:解码JWT格式的Token提取用户信息

OAuth Access Token(以及ID Token)都是JWT格式,可直接解码验证后提取用户信息:

  1. 从Cognito的JWKS端点获取公钥(https://cognito-idp.<region>.amazonaws.com/<user-pool-id>/.well-known/jwks.json)
  2. 用公钥验证Token的签名、有效期、受众等字段
  3. 解码Payload获取用户的sub、email、username等核心信息

示例代码(使用pyjwt库):

import jwt
import requests
from jwt.exceptions import InvalidTokenError

def decode_cognito_token(token: str, user_pool_id: str, region: str, client_id: str):
    jwks_url = f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}/.well-known/jwks.json"
    jwks = requests.get(jwks_url).json()
    
    try:
        header = jwt.get_unverified_header(token)
        public_key = next(k for k in jwks["keys"] if k["kid"] == header["kid"])
        decoded = jwt.decode(
            token,
            public_key,
            algorithms=["RS256"],
            audience=client_id,
            issuer=f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}"
        )
        return decoded
    except InvalidTokenError as e:
        raise ValueError("无效的Token") from e

方案3:调整前端传递ID Token而非Access Token

前端通过/oauth2/token获取的响应中,除了Access Token,还有ID Token(JWT格式),它专门用于携带用户身份信息。前端可以把ID Token传给后端,后端直接解码ID Token即可获取用户信息,无需额外调用接口,效率更高。

工作流调整建议

当前的前端授权流程是规范的,无需调整。只需修改后端的Token处理逻辑:

  • 优先使用ID Token获取用户身份信息(最高效)
  • 如果需要用户的额外属性,调用/oauth2/userInfo接口
  • 避免用前端的OAuth Access Token调用Cognito IDP的管理API(如get_user),这类API应使用后端的IAM角色权限调用,或结合用户ID Token做身份关联后处理

内容的提问来源于stack exchange,提问作者Lightyears

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:53:25