【发布时间】: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 调用。用户收到令牌并使用它,但他/她需要它。
- 此流程安全吗?我应该一起使用 spring oauth 吗?
- 如何处理
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