【问题标题】:AWS cognito user pool server side flow with spring boot带有 Spring Boot 的 AWS cognito 用户池服务器端流程
【发布时间】:2020-04-14 17:07:36
【问题描述】:

我想通过 Spring Boot 实现 AWS Cognito 服务器端流程。我不太明白流程应该是什么。我应该同时使用 spring oauth 吗?

需求是这样的。 作为管理员创建用户并授予这些已创建用户的访问权限,以从 API Gateway 使用我的 API(让我们忽略 API Gateway 部分,说我们现在只需要来自 cognito 的访问令牌)

如果我将 AWS cognito 与 spring oauth2 一起使用,我认为会发生这种情况

用户点击localhost:8000/oauth/token - 使用基本身份验证(用户名和密码) 它将使用用户凭据进行 API 调用。用户收到令牌并使用它,但他/她需要它。

  1. 此流程安全吗?我应该一起使用 spring oauth 吗?
  2. 如何处理respond to auth challenge ?用户在调用我的应用程序 API 时是否应该首次传递新密码?
@RestController
public class Oauth {


    @PostMapping(path = "/oauth/token")
    public AdminInitiateAuthResult token(@RequestHeader("username") String username, @RequestHeader("password") String password) {

        AWSCognitoIdentityProvider provider = AWSCognitoIdentityProviderClientBuilder
                .standard()
                .withRegion(Regions.US_WEST_2)
                .withCredentials(new AWSStaticCredentialsProvider()).build();


        Map<String, String> authParams = new HashMap<>();

        authParams.put("USERNAME", username);
        authParams.put("PASSWORD", password);

        AdminInitiateAuthRequest adminInitiateAuthRequest = new AdminInitiateAuthRequest()
                .withClientId("{client-id}")
                .withUserPoolId("{user-pool-id}")
                .withAuthFlow(AuthFlowType.ADMIN_USER_PASSWORD_AUTH)
                .withAuthParameters(authParams);

        AdminInitiateAuthResult authResult = provider.adminInitiateAuth(adminInitiateAuthRequest);
        return authResult.getAuthenticationResult().getIdToken();
    }

}

【问题讨论】:

  • 您对 OAuth2 授权代码流程的理解程度如何?这似乎是您实质上试图实现的目标
  • @CameronDowner 我已经在数据库中实现了一个用户群,并且非常了解这个概念。现在的要求不同了,在 cognito 中使用用户池,并限制只有这些用户对特定 API 的访问。对如何使用 Spring Boot 管理它感到非常困惑,但我绝对不想托管 UI 方法。
  • 要将您的数据库用作外部身份验证提供程序,您必须将 Spring 设置为 ID 提供程序。这实际上是在创建您试图让 Cognito 提供的内容。如果您想将工作交给 Cognito,您需要将用户详细信息存储在 Cognito 中。然后,您会将用户发送到 Cognito 进行身份验证,并且只取回一个令牌 - 避免自己存储密码
  • 是的,我理解的没错,我需要将spring配置为ID提供者。用户详细信息存储在 cognito 用户池中,我们通过 spring 使用 cognito 进行身份验证以获取令牌。我已经编辑了这个问题,以提供有关上述实现的示例代码。这会不会有任何安全问题?最佳做法是什么?
  • 您有多种工具,但不清楚您想要实现什么。而是从业务需求开始——你想实现什么?然后让我们考虑一个解决方案如何实现它。例如,Cognito 与基本身份验证没有任何共同之处,并且没有必要同时使用 Spring 作为身份提供者和 Cognito。如果您从众多解决方案开始,那么您忘记将 Kubernetes、Agile 和 FaaS 添加到您需要使用的东西列表中:-D

标签: java amazon-web-services spring-boot oauth-2.0 amazon-cognito


【解决方案1】:

业务需求非常简单,需要一个用户池(在这种情况下为认知用户),他们可以获得某种令牌来访问少数 API。我想使用 spring boot 来实现这一点,因为 API 是使用 spring boot 编写的,而且我使用 AWS Api Gateway

我应该同时使用 spring oauth 吗?

没有。授权由 API Gateway 完成。
API 客户端在使用 API 之前需要从 Cognito 获取令牌(即在那里进行身份验证)。在应用程序(Spring)方面无需做任何事情。
详情here

如果您想使用 Cognito 为 API 客户端实现身份验证,请参阅 Cognito 文档以获取示例和手册。
仅供参考 Application Load Balancer 可用于处理 API 的所有身份验证流程。

【讨论】:

  • 在这种情况下,用户需要通过 Web UI 登录并获取令牌,然后将令牌作为 AUTH 标头传递。在这种情况下我们不想使用 UI,如果我们不使用 UI,我们首先需要通过auth challenge 来强制重置新用户的密码(这是针对USER_PASS_AUTH)。有没有办法解决这些问题?
  • 如果 API 客户端不是 web 或移动应用程序,那么还有另一种身份验证方法docs.aws.amazon.com/cognito/latest/developerguide/…
  • 这正是问题所在,如果我们使用服务器端身份验证,则会出现一些复杂情况。我们需要通过RespondToAuthChallenge 并用新密码回复一次。这样做看起来就像是重新工作。使用 Spring Boot 执行此操作(例如使用简单的 API 来传递用户名和密码)看起来像是一个安全问题。春天有什么好办法吗?
  • 每次我写东西,你都会用新的东西来回复。看起来这个问题永远不会得到解决 :=) 你能制定出你遇到的确切问题并删除问题中的冗余细节吗?
  • 我想这个问题已经包含了一切:DI 非常感谢您对 cme​​ts 的兴趣,并且问题非常感谢它,但是如果您看到关键字(春天,回复 auth挑战,令牌等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2018-09-13
  • 2020-06-14
  • 2019-09-04
  • 2020-10-02
  • 2018-01-21
  • 2021-05-12
相关资源
最近更新 更多