You need to enable JavaScript to run this app. 如何在Java Spring Boot应用中调用AWS Cognito POST接口获取Token
优惠活动
大模型
产品
解决方案
定价
更多

如何在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适配逻辑一致)

  1. 引入依赖
<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>
  1. 配置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: <你的业务回调地址>
  1. 调用示例,和你之前调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 16:57:03