如何在Java Spring Boot应用中调用AWS Cognito POST接口获取Token
Spring Boot 对接 AWS Cognito 获取 Token 实现指南
前置准备
提前在AWS Cognito控制台完成以下配置,逻辑和你之前使用Keycloak的客户端配置基本对齐:
- 创建用户池,记录用户池ID、部署区域
- 在用户池下创建应用客户端,记录客户端ID、客户端密钥(若启用密钥配置)
- 为应用客户端开启对应OAuth2.0授权流程,配置回调地址,配置逻辑和Keycloak客户端设置完全一致
- 记录Cognito域名,格式为
https://<自定义前缀>.<部署区域>.amazoncognito.com,对应Keycloak的服务域名
两种常用实现方案
方案1:Spring Security OAuth2 客户端适配(推荐,和Keycloak适配逻辑一致)
- 引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
- 配置application.yml
spring: security: oauth2: client: provider: cognito: issuer-uri: https://cognito-idp.<部署区域>.amazonaws.com/<用户池ID> registration: cognito: client-id: <你的客户端ID> client-secret: <你的客户端密钥> scope: openid,profile,email authorization-grant-type: authorization_code # 客户端凭证模式可替换为client_credentials redirect-uri: <你的业务回调地址>
- 调用示例,和你之前调用Keycloak API的逻辑完全兼容:
@Autowired private OAuth2AuthorizedClientManager authorizedClientManager; public String getCognitoAccessToken() { OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId("cognito") .principal("anonymous") .build(); OAuth2AuthorizedClient authorizedClient = authorizedClientManager.authorize(authorizeRequest); return authorizedClient.getAccessToken().getTokenValue(); }
方案2:手动调用Token端点POST请求
不需要依赖Spring Security全量能力时,可直接封装HTTP请求调用:
public String getTokenByManualCall() { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); // 私有客户端需要加Basic认证头,公开客户端可省略 String authStr = clientId + ":" + clientSecret; byte[] encodedAuth = Base64.getEncoder().encode(authStr.getBytes(StandardCharsets.UTF_8)); headers.set("Authorization", "Basic " + new String(encodedAuth)); MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); // 授权码模式参数 params.add("grant_type", "authorization_code"); params.add("client_id", clientId); params.add("code", <前端传递的授权码>); params.add("redirect_uri", <你的业务回调地址>); // 客户端凭证模式替换为以下参数即可 // params.add("grant_type", "client_credentials"); // params.add("scope", "aws.cognito.signin.user.admin"); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers); ResponseEntity<Map> response = restTemplate.postForEntity("<你的Cognito域名>/oauth2/token", request, Map.class); return (String) response.getBody().get("access_token"); }
注意事项
- Cognito授权码有效期为5分钟,获取后需要尽快兑换Token,规则和Keycloak默认配置一致
- 若需要使用密码模式,需要提前在应用客户端配置中开启密码授权流程,请求参数补充username、password即可
- Token校验逻辑和Keycloak完全兼容,可直接复用之前的JWT校验逻辑,不需要额外适配
内容的提问来源于stack exchange,提问作者Djordje
相关产品推荐
相关产品推荐

