JWT是一种基于令牌的便捷请求认证鉴权解决方案。用户状态信息存储在token中,由客户端提供,服务端无需保存,适合Serverless环境。通过用户绑定在自定义域名上的Public JWKS,函数计算可以实现对到达该域名的请求进行JWT认证。根据域名配置,将claims作为参数传递给函数,函数无需实现鉴权逻辑,请求会在网关里校验,成功才转发到后端函数。
简介
JSON Web Token (JWT)是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式,用于安全地在各方之间传输信息,以JSON对象的形式。这些信息可以被验证和信任,因为它们是数字签名的。JWT可以使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。
使用限制:
- 函数计算通过JWT认证配置的JWKS来校验请求中的JWT。
- 支持配置多个JWK。
- 支持从Header,query参数,cookies中读取Token。
- 支持将claims作为header转发给函数。
目前函数计算的JWT支持如下算法。
签名算法 | alg取值 |
---|---|
RSASSA-PKCS1-V1_5 | RS256 |
配置JWT认证
前提条件
创建自定义域名,且认证方式选择“JWT认证”。
操作步骤
-
登录控制台,在左上角选择目标地域。
-
在最左的菜单栏中选择高级功能 > 域名管理。
-
在创建域名页面,展开认证设置。
-
认证方式选择JWT认证
-
配置jwks
jwt鉴权需要用户提供有效的JWKS(JSON Web Set)。您可以使用在线生成工具生成,例如mkjwk.org。下文以使用mkjwk.org工具生成JWKS为例说明。
按图所示选择Key Use,Algorihm,Show X.509,点击Generate生成需要的公私钥和jwks。
-
把public key填入jwks的keys字段里。
-
使用https://jwt.io/ 生成请求用的jwt,如图所示。
- 算法选择RS256
- playload根据需要配置,但必须有iss字段,值为用户填的自定义域名(全小写)
- 公私钥内容根据b步骤里生成的填写即可
- 左侧生成的“xxx.xxx.xxx”即为合法签名后的jwt内容
-
配置JWT Token(必填)
在JWT Token 配置配置项中,选择
token
所在位置和token
的名称。token
位置支持Header、Cookie、Query参数(GET)。如果token
位置选择为Header,则还需为其指定前缀,函数计算在获取Token时,会删除此前缀。 -
配置JWT Claim转换(可选)
在JWT Claim 转换配置项中,选择透传给函数的参数所在位置、参数原始名称和参数透传给函数之后的名称。注意,这里的claim的名称指的是jwt的payload里的key。
映射参数位置只支持Header,以下配置的意思是:从jwt的payload中查找MyHeader字段,并把MyHeader的具体值用新的header,这里是HewHeader,透传给目标函数。目标函数收到的请求的header中就回包含一个新的,key为NewHeader的header。
-
-
测试验证
curl -v --location --request POST 'http://mytest.domain.com/' \
--header 'Accept: */*' \
--header 'Host: mytest.domain.com' \
--header 'Connection: keep-alive' \
--header "JwtHeader: MyJwt eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsIk15SGVhZGVyIjoiaC12YWx1ZSJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiTXlIZWFkZXIiOiJKb2huIERvZSIsImFkbWluIjp0cnVlLCJpc3MiOiJtb3p5Lm16eWNoYWNvLmVtYWlsIn0.RwbPlMzgIP-ixrMN5o9Xw8q4QYA7R8V6UPMC6iBW3NCzadYmXk469g50QNItVX-x-oDuk7a1VR7M6IHnh_r_UJX5x5IZsD-g7QzKSwVkyn3Gj0pXJnj41Bthcqw82iQbUhfzlZpcLcMN4C0vPLqh9sHAPOHoe-1BkysadNSaGe6b08I34S6IEbBVHunDswJcVqWk8SjxSDyeVUBumZ8Qf6Z4qqNj-jfFvzI4v6J4fLTNA2LCv1_-6c0VDSufnFekkQUrvZEjxIetJ1KgE_tBYheylGtuCGeBWEVlhARAUqC-T1AqM2KC28-O74mSXpxSljiFLB-LuouAFWIvWl2_9w"
如果不传jwt,函数会返回 Jwt is missing
。
如果jwt有误,函数会返回 Jwt verification fails
。
一切正常,函数会正常返回。