当前位置:

首页 > 编程开发 > Bearer Token认证教程:REST API安全实战

Bearer Token认证教程:REST API安全实战

本文档旨在指导开发者如何在基于AWSAPIGateway和Lambda的RESTAPI中实现基于BearerToken的身份验证。我们将介绍三种不同的实现方式:使用代理集成、自定义集成以及LambdaAuthorizer。通过详细的步骤和代码示例,帮助你选择最适合你的应用场景的方案,并确保API的安全性和可靠性。

本文目录

    基于Bearer Token的REST API认证教程

    本文档旨在指导开发者如何在基于AWS API Gateway和Lambda的REST API中实现基于Bearer Token的身份验证。我们将介绍三种不同的实现方式:使用代理集成、自定义集成以及Lambda Authorizer。通过详细的步骤和代码示例,帮助你选择最适合你的应用场景的方案,并确保API的安全性和可靠性。

    在构建REST API时,身份验证是至关重要的一环。本文将探讨如何在AWS API Gateway和Lambda架构下,通过Bearer Token进行身份验证。我们将介绍三种不同的方法,并分析它们的优缺点,以便您选择最适合您需求的方案。

    1. 使用代理集成 (Proxy Integration)

    代理集成是最简单的入门方式。在这种模式下,Lambda函数负责处理整个HTTP请求和响应的生命周期。API Gateway会将完整的请求信息(包括headers)传递给Lambda函数。

    优点:

    • 易于实现,上手快。
    • 适用于Lambda函数需要完全控制HTTP交互的场景。

    缺点:

    • Lambda函数需要处理HTTP协议的细节,增加了代码的复杂性。
    • 业务逻辑与HTTP处理逻辑耦合在一起。

    实现步骤:

    1. 在API Gateway中,选择“集成类型”为“Lambda 函数代理”。
    2. 在Lambda函数中,从event.headers字典中读取Authorization header。
    3. 验证Bearer Token的有效性。
    4. 根据验证结果返回相应的HTTP状态码和响应。

    代码示例 (Python):

    def lambda_handler(event, context):
        authorization_header = event.get('headers', {}).get('Authorization')
    
        if not authorization_header or not authorization_header.startswith('Bearer '):
            return {
                'statusCode': 401,
                'body': 'Unauthorized'
            }
    
        token = authorization_header.split(' ')[1]
    
        # 在这里验证token的有效性 (例如,查询数据库,调用认证服务)
        if not validate_token(token):
            return {
                'statusCode': 403,
                'body': 'Forbidden'
            }
    
        return {
            'statusCode': 200,
            'body': 'Hello World!'
        }
    
    def validate_token(token):
        # 实际的token验证逻辑
        # 可以调用外部服务,或者查询数据库
        # 返回 True 如果 token 有效,否则返回 False
        # 这只是一个示例,需要根据你的实际认证机制进行修改
        return token == "valid_token"

    注意事项:

    • event.headers 中的 header 名称是不区分大小写的。
    • 确保 validate_token 函数实现了正确的 token 验证逻辑。

    2. 使用自定义集成 (Custom Integration) 和请求映射模板

    自定义集成允许您更精细地控制API Gateway如何将请求转换为Lambda函数的输入。您可以使用请求映射模板提取header信息,并将其作为JSON对象传递给Lambda函数。

    优点:

    • 将业务逻辑与HTTP处理逻辑分离。
    • 可以定义Lambda函数的输入结构,使其更易于使用。

    缺点:

    • 需要编写请求映射模板,增加了一定的复杂性。

    实现步骤:

    1. 在API Gateway中,选择“集成类型”为“Lambda 函数”。
    2. 创建请求映射模板 (Request Mapping Template),例如使用 application/json 类型。
    3. 在模板中使用Velocity Template Language (VTL) 提取Authorization header的值,并将其放入JSON对象中。
    4. 在Lambda函数中,从event对象中读取提取的token值。
    5. 验证Bearer Token的有效性。
    6. 根据验证结果返回相应的HTTP状态码和响应。

    请求映射模板示例:

    {
      "token": "$input.params('Authorization').substring(7)"
    }

    代码示例 (Python):

    def lambda_handler(event, context):
        token = event.get('token')
    
        if not token:
            return {
                'statusCode': 401,
                'body': 'Unauthorized'
            }
    
        # 在这里验证token的有效性 (例如,查询数据库,调用认证服务)
        if not validate_token(token):
            return {
                'statusCode': 403,
                'body': 'Forbidden'
            }
    
        return {
            'statusCode': 200,
            'body': 'Hello World!'
        }
    
    def validate_token(token):
        # 实际的token验证逻辑
        # 可以调用外部服务,或者查询数据库
        # 返回 True 如果 token 有效,否则返回 False
        # 这只是一个示例,需要根据你的实际认证机制进行修改
        return token == "valid_token"

    注意事项:

    • $input.params('Authorization') 获取的是完整的 Authorization header,需要使用 substring(7) 截取掉 "Bearer " 前缀。
    • 请求映射模板需要仔细编写,确保正确提取header信息。

    3. 使用Lambda Authorizer (Lambda Authorizer)

    Lambda Authorizer(也称为自定义授权方)是一种更高级的身份验证机制。它允许您创建一个专门的Lambda函数来验证请求的身份。API Gateway会在调用您的业务逻辑Lambda函数之前,先调用Authorizer函数。

    优点:

    • 将身份验证逻辑与业务逻辑完全分离。
    • 可以实现更复杂的身份验证机制,例如基于角色的访问控制。
    • 可以缓存授权结果,提高性能。

    缺点:

    • 配置和管理较为复杂。
    • 需要编写额外的Lambda函数。

    实现步骤:

    1. 创建一个Lambda Authorizer函数。该函数接收包含Authorization header的event对象,并返回一个IAM策略,指示API Gateway是否允许该请求。
    2. 在API Gateway中,配置Authorizer。
    3. 将Authorizer与您的API方法关联。

    Lambda Authorizer 函数示例 (Python):

    import json
    
    def lambda_handler(event, context):
        token = event.get('authorizationToken')
    
        if not token:
            return generate_policy('user', 'Deny', event['methodArn'])
    
        # 在这里验证token的有效性 (例如,查询数据库,调用认证服务)
        if not validate_token(token):
            return generate_policy('user', 'Deny', event['methodArn'])
    
        # 如果token有效,则返回允许访问的策略
        return generate_policy('user', 'Allow', event['methodArn'])
    
    def validate_token(token):
        # 实际的token验证逻辑
        # 可以调用外部服务,或者查询数据库
        # 返回 True 如果 token 有效,否则返回 False
        # 这只是一个示例,需要根据你的实际认证机制进行修改
        return token == "valid_token"
    
    def generate_policy(principal_id, effect, resource):
        auth_response = {
            "principalId": principal_id,
            "policyDocument": {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Action": "execute-api:Invoke",
                        "Effect": effect,
                        "Resource": resource
                    }
                ]
            }
        }
        return auth_response

    注意事项:

    • Authorizer函数必须返回一个包含IAM策略的JSON对象。
    • IAM策略必须指定允许或拒绝访问的资源 (resource)。
    • 可以配置Authorizer的缓存时间 (TTL),以提高性能。
    • 如果使用AWS Cognito User Pools,可以直接将其配置为API Gateway的Authorizer,无需编写自定义Lambda函数。

    总结:

    本文介绍了三种在AWS API Gateway和Lambda架构下实现基于Bearer Token身份验证的方法。选择哪种方法取决于您的具体需求和项目的复杂程度。

    • 代理集成 适合快速入门和简单的API。
    • 自定义集成 提供了更好的控制和分离,适合中等复杂度的API。
    • Lambda Authorizer 是最灵活和安全的方案,适合复杂的API和需要精细访问控制的场景。

    无论您选择哪种方法,都请务必确保您的token验证逻辑安全可靠,并遵循最佳安全实践。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Ducter 0.0.38 源码标签:修复 Slack 主动提醒与启动后邮件回看
    Ducter 0.0.38 源码标签:修复 Slack 主动提醒与启动后邮件回看

    Ducter 0.0.38源码标签修复Slack提及和私信进入watcher、启动后账号未就绪导致邮件回看空跑等问题。本轮确认的是源码标签及更新日志,核验时官网安装入口仍指向0.0.37,不能当作0.0.38安装包已上线。

    LangChain TypeSafe 0.1.0:分类器接口迁移,Python 与 JS 依赖要求调整
    LangChain TypeSafe 0.1.0:分类器接口迁移,Python 与 JS 依赖要求调整

    LangChain TypeSafe 0.1.0将TypeSafeClassifier对齐决策模型接口。JavaScript的问题改为随请求传入,响应和usage字段调整,旧中间件入口弃用;Python版最低Python 3.11、langchain-core 1.8.0,跨语言依赖要求需要分别核对。

    GitHub Copilot CLI 1.0.110-3:改进 Entra 登录,修复 MCP 配置保存
    GitHub Copilot CLI 1.0.110-3:改进 Entra 登录,修复 MCP 配置保存

    GitHub Copilot CLI 1.0.110-3是预发布补丁,改善Microsoft Entra登录与终端显示,并在MCP配置文件无效时保留原配置、显示保存错误。技能描述中的不可见转义内容不再参与命令匹配,升级需验证相应终端和集成路径。

    LiteLLM 修复分支扩展:1.106.9、1.108.6 与 1.110.0-rc.2 更新
    LiteLLM 修复分支扩展:1.106.9、1.108.6 与 1.110.0-rc.2 更新

    LiteLLM将请求字段与部署配置冲突的修复覆盖到1.106.9、1.108.6及1.110.0-rc.2。维护旧稳定分支或候选分支的团队应选择对应修复版本;1.108.6还包含预算重置、用量细分和其他回移,不能将RC视为稳定版。

    Nod 0.7.1:修复聊天中断,新增 OpenAI API 区域设置
    Nod 0.7.1:修复聊天中断,新增 OpenAI API 区域设置

    Nod 0.7.1 修复因不完整历史回复触发的trim错误,并为OpenAI连接新增API region。已中断任务可回复以继续;已有连接仍保持Global,使用欧盟等区域项目时需要按项目实际区域设置连接。

    llama.cpp b12317:新增 OpenCL A7 Q4_0 非 MoE 二进制内核
    llama.cpp b12317:新增 OpenCL A7 Q4_0 非 MoE 二进制内核

    llama.cpp b12317 新增OpenCL路径下的A7 Q4_0非MoE二进制内核,属于特定后端和量化路径更新。官方将此构建标为预发布,选择二进制时应匹配系统、架构和计算后端,不能推导为所有GPU都会加速。

    CrewAI 1.15.40:调整嵌入层依赖,修复异步钩子与状态检索
    CrewAI 1.15.40:调整嵌入层依赖,修复异步钩子与状态检索

    CrewAI 1.15.40 调整嵌入函数层的ChromaDB依赖,并修复异步after_llm_call钩子、历史状态检索和JSONL发现等路径。已有项目应围绕实际使用的向量存储、钩子和状态恢复做回归,不能解读为全面移除ChromaDB支持。

    Google GenAI SDK 更新:Python、JS 与 Java 接入 Decisions API
    Google GenAI SDK 更新:Python、JS 与 Java 接入 Decisions API

    Google GenAI SDK 的Python 3.2.0、JavaScript 3.2.0与Java 2.2.0新增Decisions API支持,并扩展environments的自托管BYOS相关字段。此次为客户端版本跟进,不代表再次发布新模型,也不自动授予服务权限。

    Codex CLI 0.167.2:Vertex AI 默认启用工具增量更新
    Codex CLI 0.167.2:Vertex AI 默认启用工具增量更新

    Codex CLI 0.167.2 默认在Google Cloud Vertex AI上增量发送工具更新。需要恢复原路径时,可按官方说明在config.toml的features中将incremental_tools_legacy_gcp设为false;此变更不代表所有平台的默认模型变化。

    LangChain JS 1.6.5:新增模型路由与工具风险拦截,要求 Zod 4.6.6+
    LangChain JS 1.6.5:新增模型路由与工具风险拦截,要求 Zod 4.6.6+

    LangChain JS 1.6.5 加入modelRouterMiddleware和autoModeMiddleware,分别处理模型选择与指定工具调用的风险判断,同时提高安装依赖的Zod最低版本至4.6.6。现有Zod v3 schema仍可通过捆绑的zod/v3入口使用。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。