如何将AWS App Runner与AWS Cognito集成以保障API服务安全
AWS App Runner 集成 Cognito 实现 API 安全的方案
AWS App Runner本身没有内置类似API Gateway的授权器功能,但可以通过以下几种方式在不引入API Gateway的前提下,实现与Cognito的集成,保护你的API服务:
1. 应用层直接集成Cognito验证
这是最直接的方案,在容器化应用代码中加入Cognito身份验证逻辑:
- 接收客户端请求中的JWT令牌(通常在
Authorization头里,格式为Bearer <token>) - 使用AWS SDK或Cognito公钥,验证JWT的签名、有效期、受众(Audience)、发行方(Issuer)等核心字段
- 验证通过后再处理业务请求,否则返回401/403错误
示例(Python伪代码):
import jwt import requests def validate_cognito_token(token): cognito_issuer = "https://cognito-idp.<region>.amazonaws.com/<user-pool-id>" jwks_url = f"{cognito_issuer}/.well-known/jwks.json" jwks = requests.get(jwks_url).json() try: header = jwt.get_unverified_header(token) public_key = next(k for k in jwks["keys"] if k["kid"] == header["kid"]) decoded = jwt.decode( token, public_key, algorithms=["RS256"], issuer=cognito_issuer, audience="<client-id>" ) return True, decoded except jwt.InvalidTokenError: return False, None
2. 容器代理层前置验证
如果不想修改应用代码,可以在容器中加入反向代理(比如Nginx、Envoy),在代理层完成Cognito JWT验证:
- 配置Nginx使用
ngx_http_auth_jwt_module模块,通过Cognito公钥验证令牌 - 所有请求先经过代理层验证,通过后再转发给后端应用
- 这种方式对应用代码无侵入,适合无法修改源码的场景
示例Nginx配置片段:
server { listen 8080; location / { auth_jwt "Cognito Protected API"; auth_jwt_keyfile https://cognito-idp.<region>.amazonaws.com/<user-pool-id>/.well-known/jwks.json; auth_jwt_claim_set $cognito_sub sub; proxy_pass http://localhost:3000; # 你的应用监听端口 } }
3. 借助AWS WAF实现全局防护
将AWS WAF与App Runner服务关联,通过WAF规则检查请求中的Cognito JWT:
- 创建WAF规则,使用AWS托管规则
AWSManagedRulesCognitoAuthRule,或自定义规则验证JWT的签名和字段 - 只有通过WAF验证的请求才能到达App Runner服务
- 这种方式无需修改应用或容器配置,通过云服务层实现安全防护
需要注意:
- WAF规则需准确匹配你的Cognito用户池和客户端信息
- WAF会产生额外成本,但通常比API Gateway低,适合请求量不大的场景
总结:如果不想引入API Gateway,优先选择应用层直接集成或容器代理层验证的方案,成本最低且实现灵活;若需无侵入的全局防护,可考虑AWS WAF。
内容的提问来源于stack exchange,提问作者Chaitu
相关产品推荐
相关产品推荐

