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

如何在Lambda中验证AWS Cognito令牌?python-jose导入失败排查

问题原因分析

1. 原生扩展兼容性问题

_cffi_backend 是 cryptography 库依赖的原生编译模块,与操作系统、CPU架构强绑定。如果你在本地(如Windows、macOS)安装 python-jose[cryptography],生成的二进制文件无法在Lambda运行的Amazon Linux 2环境中正常工作,从而触发 ModuleNotFoundError。

2. Lambda Layer打包结构错误

Lambda Layer要求包文件必须放在特定目录下:python/lib/pythonX.X/site-packages/(X.X为Lambda函数使用的Python版本,如3.11)。如果你的Layer未遵循此结构,Lambda无法正确加载模块,也会引发找不到模块的错误。


解决方案

方案一:修复Lambda Layer的构建方式

使用Docker在与Lambda兼容的Amazon Linux 2环境中编译依赖,确保原生模块与Lambda runtime匹配:

  1. 创建临时目录,进入后执行以下Docker命令(替换Python版本为你的Lambda函数版本):
    docker run -v "$PWD:/var/task" public.ecr.aws/lambda/python:3.11 /bin/sh -c "pip install python-jose[cryptography] boto3 -t python/lib/python3.11/site-packages/ && exit"
    
  2. 将生成的 python 目录打包为zip文件(zip根目录直接是 python 文件夹,不要嵌套外层目录)。
  3. 上传该zip作为Lambda Layer,重新附加到验证函数上。

方案二:使用Lambda Function URL内置的Cognito授权器

无需手动编写验证逻辑,直接利用AWS托管的授权能力:

  • 在Lambda Function URL配置中,将「认证类型」设为「AWS IAM或Amazon Cognito」,选择你的Cognito用户池和应用客户端。
  • AWS会在请求到达Lambda前自动完成令牌验证,仅合法请求会触发函数执行,你可从请求上下文(event['requestContext']['authorizer'])获取用户信息。

方案三:手动验证令牌(纯Python替代方案)

若坚持在代码中验证,可尝试纯Python实现的JWT库:

  1. 从Cognito的JWKS端点(https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json)获取公钥。
  2. 使用 pyjwt 配合 pycryptodome(纯Python加密库)完成验证,注意需在兼容Lambda的环境中安装 pycryptodome。
  3. 手动校验令牌核心声明:签发者(iss)、受众(aud)、过期时间(exp)等。

内容的提问来源于stack exchange,提问作者E. Santo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:56:28