带 Token 校验的内部 API:API 网关 + FunctionGraph 实现

举报
柠檬-夏日清爽 发表于 2026/09/25 08:46:24 2026/09/25
【摘要】 内部 API 不能裸奔公网。本文讲用 API 网关做 Token 校验(验过才放给 FunctionGraph),函数从网关透传上下文取调用方身份做数据隔离,并说明令牌轮换/HTTPS/限流等安全要点。

一、背景:内部 API 不能裸奔在公网上

有些接口是给自己人、自己系统用的——比如后台统计、内部同步、运维脚本调用的管理端点。它们逻辑简单,但一旦暴露公网且没有任何鉴权,谁都能调,轻则被刷、重则被乱改数据。给这类"内部 API"加一道 Token 校验,是最起码的防线:调用方必须带一个合法的令牌,否则一律拒绝。

组合还是前面熟悉的那对:API 网关接流量、做统一鉴权,FunctionGraph 跑逻辑。本文讲怎么在 API 网关层做 Token 校验(网关验 token、通过才放给函数),以及函数侧如何拿到调用方身份、怎么处理"无 token/假 token"。具体网关鉴权配置以官方文档为准,这里讲清思路和代码位置。

二、为什么把校验放在网关而不是函数里

Token 校验可以放在函数里手写,但放 API 网关更合理,原因:

  • 统一:所有经过网关的 API 共用一套校验逻辑,多个函数不用各写一遍;
  • 拦截在前:非法请求在网关就被挡掉,根本不会触发函数,省函数调用费、也少一层被攻击面;
  • 网关原生支持:API 网关本身就有鉴权能力(签名、AppKey、自定义认证器等),配置即用,比自己造轮子稳。

所以思路是:在网关配置"这个 API 必须带合法 Token 才能访问",校验通过再把请求转给函数;函数里只处理业务逻辑,需要调用方身份时从网关透传的上下文里取。

三、网关侧怎么配 Token 校验

以 API 网关的鉴权能力为例,常见做法:

  1. 在网关创建一种鉴权方式(如 AppKey/AppSecret、或自定义认证器指向一个校验函数);
  2. 在目标 API 上开启"鉴权",绑定这个方式;
  3. 调用方请求时,在请求头带令牌(如 X-Auth-Token: xxxx 或网关约定的 Authorization 头);
  4. 网关校验令牌合法性,合法则转发、非法直接返回 401。

不同鉴权模式的字段名、令牌格式、怎么签发和轮换,以官方文档为准。比如 AppKey 模式是调用方带 Key、网关比对;自定义认证器模式是你写一个校验函数,网关把令牌喂给它、它返回允许/拒绝,灵活度更高。

四、函数里怎么用调用方身份

网关校验通过后,通常会把调用方信息(如 AppKey 对应的应用 ID)放在请求的上下文/头部里透传给函数。函数侧从事件里取,而不是自己再验一遍令牌(网关已经验了):

def handler(event, context):
    # 网关校验通过后,调用方身份随请求上下文传来
    caller = event.get("headers", {}).get("x-caller-app") \
          or event.get("context", {}).get("caller")
    if not caller:
        return {"statusCode": 403, "body": "missing caller"}   # 兜底,理论上网关已挡

    # 业务逻辑:比如只返回该调用方自己的数据
    data = query_internal_data(owner=caller)
    return {"statusCode": 200, "body": json.dumps(data, default=str)}

注意这里函数仍然做了一次兜底判空——即便网关理论上挡了非法请求,函数侧不假设"一定有人验过",多一层防御没坏处(纵深防御)。具体网关把调用方身份放在哪个字段,以官方文档为准,照着取。

五、几个安全上的注意点

第一,Token 要可轮换。写死一个长期不过期的 Token,一旦泄露就是长期后门。用网关的 AppKey/Secret 或自定义认证器时,设计好签发和吊销流程,泄露了能立刻换、不影响别的服务。

第二,HTTPS 必须开。Token 在明文 HTTP 下会被中间人截获,等于没鉴权。网关域名务必配 HTTPS 证书,强制 443。

第三,最小权限。内部 API 也要分"谁能调什么"。网关鉴权能识别调用方身份后,函数里按身份做数据隔离(如上面按 owner 过滤),避免"A 应用能读 B 应用的数据"。

第四,失败要明确且别泄露信息。无 Token 返回 401、Token 无效返回 403,别在返回体里写"你的 token 格式不对,正确是 xxx"这种帮攻击者调试的话。错误信息精简。

第五,限流叠加。鉴权只解决"能不能调",不解决"调太猛"。内部 API 同样要在网关配限流(见前面 APIG 短链接那篇),防止单个调用方刷爆。鉴权 + 限流一起上才完整。

六、小结

内部 API 加 Token 校验,最省事的做法是放在 API 网关:配一种鉴权方式、在 API 上开启、调用方带令牌,网关验过才放给 FunctionGraph。函数侧不重复验令牌,只从网关透传的上下文取调用方身份做数据隔离,并保留一次兜底判空(纵深防御)。Token 要可轮换、全程 HTTPS、按身份做最小权限、再叠限流,这套组合才是一个像样的内部 API 防护。网关鉴权字段、令牌格式和身份透传位置以官方文档为准。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。