基于Bearer Token的AWS API认证:如何读取并验证令牌?
AWS Lambda读取Bearer Token并完成验证的实现
一、读取请求头中的Bearer Token
API Gateway会将请求头信息传入Lambda的event对象中,你可以从event['headers']里提取Authorization字段,注意处理大小写差异(API Gateway可能会将头信息转为小写):
def lambda_handler(event, context): # 获取请求头字典,默认空字典避免KeyError headers = event.get('headers', {}) # 兼容大小写的Authorization头 auth_header = headers.get('Authorization') or headers.get('authorization') # 检查Authorization头是否存在 if not auth_header: return { 'statusCode': 401, 'body': 'Missing Authorization header' } # 拆分Bearer前缀和令牌内容 auth_parts = auth_header.split() if len(auth_parts) != 2 or auth_parts[0].lower() != 'bearer': return { 'statusCode': 401, 'body': 'Invalid Authorization format. Use "Bearer <token>"' } # 提取出令牌 token = auth_parts[1] # 后续进行令牌验证
二、令牌验证(以JWT为例)
如果你的Bearer Token是JWT格式,用PyJWT库可以快速完成签名、过期时间等验证逻辑。
1. 准备依赖
Lambda默认没有PyJWT和cryptography(处理签名验证),你需要:
- 本地安装依赖:
pip install pyjwt cryptography -t ./ - 将依赖和代码打包成zip上传,或者创建Lambda层附加到函数上。
2. 完整验证代码
import jwt import os def lambda_handler(event, context): headers = event.get('headers', {}) auth_header = headers.get('Authorization') or headers.get('authorization') if not auth_header: return { 'statusCode': 401, 'body': 'Missing Authorization header' } auth_parts = auth_header.split() if len(auth_parts) != 2 or auth_parts[0].lower() != 'bearer': return { 'statusCode': 401, 'body': 'Invalid Authorization format. Use "Bearer <token>"' } token = auth_parts[1] # 从环境变量读取验证密钥/公钥(避免硬编码) verify_key = os.environ.get('JWT_VERIFY_KEY') try: # 解码并验证JWT,根据你的令牌配置调整参数 payload = jwt.decode( token, verify_key, algorithms=['HS256'], # 若使用RS256则传入公钥 options={"verify_exp": True}, # 强制验证过期时间 issuer="your-token-issuer", # 可选:验证令牌发行方 audience="your-api-audience" # 可选:验证令牌受众 ) except jwt.ExpiredSignatureError: return { 'statusCode': 401, 'body': 'Token has expired' } except jwt.InvalidTokenError as err: return { 'statusCode': 401, 'body': f'Invalid token: {str(err)}' } # 验证通过,执行业务逻辑 return { 'statusCode': 200, 'body': f'Authenticated successfully. User ID: {payload.get("sub")}' }
三、关键注意事项
- 安全存储密钥:不要将JWT密钥硬编码在代码中,用Lambda环境变量或AWS Secrets Manager管理。
- API Gateway配置:确保API Gateway将请求头传递给Lambda,默认集成会自动传递,自定义集成需检查头映射规则。
- 错误状态码:统一返回401(未授权)表示令牌缺失/无效,403(禁止访问)表示令牌有效但无权限。
内容的提问来源于stack exchange,提问作者nohardfeelings
相关产品推荐
相关产品推荐

