首页 > 解决方案 > 如何在不使用 API Gateway 的情况下使用 AWS Cognito 进行自定义 Spring REST API 授权

问题描述

场景:
我将在任何 EC2 中运行 Spring Boot REST API 应用程序并公开多个 API,并且我没有为它们使用 AWS API Gateway。
我需要多个用户来访问具有不同角色(Admin、WriteUser、ReadUser)的多个 API。
我可以在 Cognito 用户池中创建用户和组,并且可以在 IAM 中拥有多个角色。

如何配置 AWS Cognito 的 UserPool 和 IdentityPool 以根据用户角色授权不同的 API 访问?有没有办法在不使用 API Gateway 的情况下在 Policy(与 IdentityPool/Resource 服务器关联)中定义这种“基于角色的 API 允许规则”。

提前致谢。

标签: apiauthorizationamazon-cognitospring-rest

解决方案


我使用带有自定义 JWTFilter 的 Spring security auth2 进行了实现,它将从请求中获取令牌并再次验证 cognito 池的 JWKs 验证文件。

  • 用户在 UI 中输入用户名/密码。
  • UI 调用后端应用程序,后者调用 Cognito。
  • Cognito 返回 JWT 令牌(Idtoken、accessToken、refreshTokens)
  • 后端应用程序将 IdToken 作为令牌发送到 UI 并存储在缓存中(也可以是任何数据库)。
  • UI 发送此 IdToken 以供下次调用。

JWTFilter 执行以下步骤,用于身份验证:

  • 后端应用程序获取令牌,如果存在则在缓存中验证,然后使用 Cognito JWK 验证签名和到期,并从中获取详细信息。
  • 后端应用程序创建 UserAuthentication 扩展 AbstractAuthenticationToken 并从解析的令牌值填充详细信息并存储在上下文(会话)中

资源授权将按照网络安全配置中提到的配置完成。


推荐阅读