（調査中)Java 11のHttpClientを使用してAWS Cognitoのトークンエンドポイントからトークンを取得する例

## 必要な依存関係の追加
プロジェクトがMavenプロジェクトの場合、pom.xmlに以下の依存関係を追加します。
```xml
<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
</dependencies>
```
## Javaコード例
以下のコードは、Java 11のHttpClientを使用してAWS Cognitoのトークンエンドポイントからトークンを取得する方法を示します。
```java
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

import org.springframework.http.ResponseEntity;

public class CognitoTokenFetcher {

    private static final String COGNITO_URL = "https://YOUR_COGNITO_DOMAIN/oauth2/token";
    private static final String CLIENT_ID = "YOUR_CLIENT_ID";
    private static final String CLIENT_SECRET = "YOUR_CLIENT_SECRET";
    private static final String GRANT_TYPE = "client_credentials";

    public static ResponseEntity<String> getToken() {
        try {
            HttpClient client = HttpClient.newHttpClient();

            Map<Object, Object> data = new HashMap<>();
            data.put("grant_type", GRANT_TYPE);
            data.put("client_id", CLIENT_ID);
            data.put("client_secret", CLIENT_SECRET);

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(COGNITO_URL))
                .header("Content-Type", "application/x-www-form-urlencoded")
                .POST(buildFormDataFromMap(data))
                .build();

            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            if (response.statusCode() == 200) {
                return ResponseEntity.ok(response.body());
            } else {
                return ResponseEntity.status(response.statusCode()).body(response.body());
            }

        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(500).body("Internal Server Error: " + e.getMessage());
        }
    }

    private static HttpRequest.BodyPublisher buildFormDataFromMap(Map<Object, Object> data) {
        String formData = data.entrySet()
                .stream()
                .map(entry -> URLEncoder.encode(entry.getKey().toString(), StandardCharsets.UTF_8) + "=" + URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8))
                .collect(Collectors.joining("&"));
        return HttpRequest.BodyPublishers.ofString(formData);
    }

    public static void main(String[] args) {
        ResponseEntity<String> responseEntity = getToken();
        System.out.println("Status Code: " + responseEntity.getStatusCode());
        System.out.println("Body: " + responseEntity.getBody());
    }
}
```

## 説明

1\. Cognito URL: 
COGNITO_URLを適切なCognitoドメインのURLに変更してください（例：https://your-domain.auth.region.amazoncognito.com/oauth2/token）。

2\. クライアントIDとシークレット: 
CLIENT_IDとCLIENT_SECRETを適切な値に設定してください。

3\. フォームデータの作成: 
buildFormDataFromMapメソッドは、URLエンコードされたフォームデータを作成します。

4\. トークン取得リクエスト: 
HttpClientを使用してPOSTリクエストを送信し、レスポンスを取得します。

5\. レスポンスの処理:
成功時にはステータスコード200とトークンを含むボディが返され、失敗時にはエラーメッセージが返されます。

このコードを実行すると、AWS Cognitoからトークンが取得され、ResponseEntity<String>として返されます。これにより、必要なトークンを取得して、他のAWSサービス（例えばAWS SES）にアクセスすることができます。