如何在AWS ALB HTTPS端点使用Cognito Client Credentials流程的access_token
问题背景
你需要向集成了Cognito的AWS ALB发送HTTPS请求,使用的是Cognito用户池中走Client Credential OAuth流程的应用客户端,已可通过如下请求获取令牌:
curl -X POST \ https://mydomain.auth.eu-west-1.amazoncognito.com/oauth2/token \ -H 'authorization: Basic <mybase64encodedstring>' \ -H 'content-type: application/x-www-form-urlencoded' \ -d 'grant_type=client_credentials&scope=myscope'
请求成功后得到的响应如下:
{"access_token":"<a base64 encoded JWT token>","expires_in":3600,"token_type":"Bearer"}
核心需求是向ALB后端的应用发送HTTPS请求,实现无效令牌请求被拦截、有效令牌请求透传到后端的效果。虽然ALB默认的交互式Cognito集成不支持Client Credentials流程,但完全可以通过其他配置实现需求。
可行实现方案
方案一:使用ALB原生JWT验证功能(推荐)
这是成本最低、无需额外开发代码的方案,具体配置步骤如下:
- 进入ALB对应的HTTPS监听器配置页,新增转发规则,优先级设置高于默认规则
- 规则动作选择「验证JWT」,验证提供方选Cognito,按提示填写你的Cognito用户池ID、应用客户端ID、令牌签发方地址(格式为
https://cognito-idp.<区域>.amazonaws.com/<你的用户池ID>) - 配置令牌提取规则:指定从
Authorization请求头提取令牌,匹配前缀为Bearer - 配置鉴权结果动作:验证通过的请求转发到后端应用目标组,验证不通过的请求直接返回401/403状态码
配置完成后ALB会自动完成JWT的签名校验、过期时间校验、权限scope校验,完全满足需求。
方案二:使用Lambda@Edge实现自定义鉴权
如果你的ALB版本不支持原生JWT验证,可以选择该方案:
- 编写Lambda函数,绑定到ALB的Viewer Request触发阶段
- 函数逻辑为:提取请求头中
Authorization字段的JWT令牌,调用Cognito用户池的JWKS公钥接口完成验签,同时校验令牌有效期、scope等信息 - 校验通过的请求放行透传到后端,校验失败直接返回401响应
注意:不要使用ALB默认的「Cognito用户池集成」功能,该功能面向终端用户交互式登录场景设计,走Authorization Code授权码流,会自动跳转到Cognito登录页,不适用于
Client Credentials这种机器对机器的非交互授权场景。
测试方法
拿到有效access_token后,使用如下请求测试即可:
curl https://<你的ALB域名>/<后端路径> \ -H "Authorization: Bearer <你获取到的access_token>"
令牌有效时可正常拿到后端返回结果,令牌无效、过期、权限不足时会被ALB直接拦截返回错误。
内容的提问来源于stack exchange,提问作者Rob O'Doherty
相关产品推荐
相关产品推荐

