为 HTTP 触发器配置 JWT 认证鉴权
更新时间:2025-09-01
概述
通过在 CFC HTTP 触发器上开启 JWT 认证,只有携带有效 JWT 的客户端才可访问函数。平台在网关侧完成签名与有效期校验,并按配置将claims透传给函数,业务侧可聚焦业务逻辑。 适用场景
- 对外提供API,需要对终端用户做标准化身份校验
- 需要在无状态网关层完成鉴权、解耦函数内部鉴权逻辑
前提条件
- 已创建函数并配置 HTTP触发器
- 已准备可用的公钥集合 JWKS(JSON WebKeySet)
使用限制
- 支持从 Header、Cookie、Query、Form读取 Token
- 支持将 claims透传到函数的Header、Cookie、Form
- 一个触发器可配置一组JWKS;按Token.kid选择匹配的 JWK 校验签名
- JWKS中最多允许1 个 JWK的 kid为空或缺省
-
支持算法:
- RSA系列: RS256, RS384, RS512
- RSA-PSS系列: PS256, PS384, PS512
- 椭圆曲线系列: ES256, ES384, ES512
- HMAC系列: HS256, HS384, HS512
- EdDSA: EdDSA
- 强烈建议全程 HTTPS传输,避免 Token 泄露
认证流程
- 客户端向授权服务认证,授权服务用私钥签发JWT
- 客户端携带 JWT调用 CFC HTTP 触发器
3)触发器使用配置的JWKS 公钥验证签名与有效期 - 校验通过后转发请求至函数,可按配置透传 claims操作步骤
使用步骤
- 打开目标函数 → 触发器 → 编辑 HTTP 触发器
2)认证方式选择「JWT 认证」
- 配置 JWKS:粘贴 JSON Web Key Set(仅需公钥)。您可以自行生成JWKS,或通过搜索“JSONWebKeyGenerator”使用在线工具(如mkjwk.org)。如果已持有PEM 格式密钥,也可借助工具(如 jwx)将其转换为 JWKS。
本文示例采用 mkjwk.org 生成 JWKS:在生成页将KeyUse设为 Signature、Algorithm设为 RS256、ShowX.509 设为Yes,点击Generate。代码端请使用生成的 PrivateKey(1)签发JWT并妥善保管;将 PublicKey(2)的内容复制到控制台JWKS配置的keys数组中。 - 配置 Token 读取位置与名称,Token位置支持Header、Cookie、Query参数(GET)和表单参数(POST)。如果Token位置选择为Header,则还需为其指定参数名称和去除前缀。函数计算在获取Token时,会删除去除前缀中设定的前缀内容。
- 配置Claims透传映射(可选),选择透传给函数的参数所在位置、参数原始名称和参数透传给函数之后的名称。映射参数位置支持Header、Cookie和表单参数(POST)。
- 配置请求匹配模式:
- 匹配全部:所有HTTP请求都需要进行JWT校验。
- 白名单模式:请求路径白名单中设置的Path的HTTP请求不需要JWT校验,其他请求需要JWT校验。
- 黑名单模式:请求路径黑名单中设置的Path的HTTP请求需要JWT校验,其他请求不需要JWT校验。
白名单模式和黑名单模式支持以下两种匹配方式:
精确匹配
请求的路径和设置的路径完全一致才可以匹配。例如,设置请求路径黑名单为/a,则来自路径/a的请求需要JWT校验,来自路径/a/的请求无需校验。
模糊匹配
支持使用通配符()设置路径,且通配符()只能放到路径的最后。例如,设置请求路径黑名单为/login/*,则来自路径前缀为/login/(例如/login/a、/login/b/c/d)的请求均需要JWT校验。
操作验证
使用在 mkjwk.org 中生成的公钥作设置 jwt 鉴权参数
Plain Text
1{
2 "keys": [
3 {
4 "kty": "RSA",
5 "e": "AQAB",
6 "use": "sig",
7 "alg": "RS256",
8 "n": "zH7xuDv1zuAzQz0ecSa1c_OT3D6OLshAK6cqMPyBVHIooRIZ2VJcgkNXqk3uD7k0BpIIRaT23wBdmw3dwf4KlwybUD0SoZRDluAh1oo1t6RmX8EWufQGUD9nDVOKhSK3NFSma8x7fjBmjKQvYrDn0bbBKlAU7VlaCxc46wHNngYkWLIHvJNQ3qBCaVmik2RdVj4U80Xf9xVLGEpqAwNXJP4gXwkyZE4kjB2y_vavc1Vun-g8Xz9zTJwj40w1o5xAIC483TjhkHW89hizQJOFtxeWm12OLltSItSOpMK9GsTYxql-wigdWuLbIJGGe8mF9P5WzLz6rpZjxbPAOJW0cw"
9 }
10 ]
11}
同时将生成的私钥证书填充到下面的 python 脚本生成 jwt,其中您可以根据需要设置token过期时间,过期时间修改脚本中exp字段,单位是秒,目前脚本token有效期是1小时。
Plain Text
1import jwt
2import time
3
4private_key = """
5-----BEGIN PRIVATE KEY-----
6<使用上面生成的 X.509 PEM格式的private key>
7-----END PRIVATE KEY-----
8"""
9
10headers = {
11 "alg": "RS256",
12 "typ": "JWT"
13}
14
15payload = {
16 "sub": "1234567890",
17 "name": "John Snow",
18 "iat": int(time.time()), # token颁发时间
19 "exp": int(time.time()) + 60 * 60, # 设定token有效时间为1小时
20}
21
22encoded = jwt.encode(payload=payload, key=private_key.encode(), headers=headers)
23print("Generated token: %s" % encoded)
使用Postman工具验证HTTP服务是否可正常访问。
- 在目标函数详情页面的触发器页签获取HTTP触发器的公网访问地址,将地址填入Postman的URL位置。
- 在Postman的Headers配置Token参数信息,然后单击Send发送请求。本文填写的Token示例如下。
名称 | 值 | 说明 |
---|---|---|
Key | Authorization | 在JWT Token 配置中设置的参数名称。 |
Value | Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gU25vdyIsImlhdCI6MTc1NDg5MDgyNSwiZXhwIjoxNzU0ODk0NDI1fQ.VOgeDk2JsVs3HTPCBc_AcMxrzdF4sB1ItULwWu06fvcyJdcdlCXI1l6UEGqHzGt4l3c6chvXLqmm1YechLtoN5txaZpWCpQA_k1x_oZ0uAqjJL3zgMihC1im8d7HxciuGwGLlaCLHpErM8QurGEJnuyX_BnsXLBFaKJnaMpLtK7bioPt7GYtbVdqIpzYnkG0UuVMVcjv2hvvfnH9c1f6ge0XizUktsRaOnhHfRfewk7BHriAhwlPVVdVBbFF1HSgvq262EnZ-9YRyBV-OXRWEO2U8zGbwcGOZVEqDMYWaRZgF03x3xbejzQn6ELsWZ39vuCamEMmXHLj5jePOV93sw | Bearer 为在JWT Token 配置中设置的去除前缀信息。 |