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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:33:15