如何在AWS中验证跨账号Client Credential访问令牌
跨AWS账号Cognito客户端凭证流Access Token信任校验问题
场景说明
参考AWS官方发布的Amazon Cognito User Pool OAuth 2.0客户端凭证授权(Client Credentials grant)相关说明,当前遇到跨账号Token校验场景:
- 自有API部署在AWS账号A1中,需要对来自AWS账号A2的客户端API请求做身份认证
- 客户端侧在自有账号A2内配置了支持Client Credentials流的App Client,请求流程为:
- 客户端使用自身账号下的client secret、对应token issuer申请access token
- 客户端携带该access token向A1账号下的API发起请求
- A1侧API校验Token合法性后返回响应
核心疑问
A1账号API默认关联的token issuer,与A2账号客户端服务使用的token issuer完全不同,如何建立对A2账号签发Token的信任?
已构思的自研方案:要求客户端方向服务端注册其user pool ID、app ID、issuer URL,服务端将这些信息存储在数据库中,校验Token时匹配对应信息完成验证。希望确认AWS是否提供原生功能支持该场景,无需自行开发额外校验逻辑。
回答
AWS没有提供跨账号Cognito User Pool直接互信的一键配置能力,但你可以根据API的部署形态,使用AWS原生托管服务实现全托管的Token校验,完全不需要自行编写校验逻辑、维护Token配置库:
- 如果你的API部署在API Gateway(HTTP API/REST API)上:
不要选择绑定单用户池的「Cognito授权器」类型,该类型仅支持绑定同账号下的Cognito用户池。直接创建JWT类型自定义授权器,该类型授权器支持同时配置多个可信issuer地址,你只需要将A2账号Cognito User Pool的issuer(格式为https://cognito-idp.<区域>.amazonaws.com/<A2账号用户池ID>)添加到授权器的可信发行方列表,同时配置audience校验规则为A2侧对应App Client的ID即可。API Gateway会自动完成JWT签名拉取与校验、过期时间校验、issuer与audience匹配校验,非法请求会直接被拦截,不会转发到后端。 - 如果你的API部署在应用负载均衡器(ALB)后端:
ALB原生支持JWT认证能力,同样支持配置多个可信OIDC issuer,将A2账号Cognito的issuer地址、对应App Client的audience加入配置即可,ALB会自动完成全流程Token校验,校验不通过的请求会直接返回401状态码,不会透传到后端服务。 - 如果后续需要对接多个其他AWS账号的Cognito签发的Token,只需要在上述托管服务的授权器配置中追加对应的可信issuer和audience规则即可,不需要自行维护配置数据库。
安全提示:校验过程中不要关闭audience校验,否则同issuer下其他App Client签发的Token也能访问你的API,会产生越权风险。
内容的提问来源于stack exchange,提问作者TDao
相关产品推荐
相关产品推荐

