0
  1. 署名メカニズムに AWS Cognito 認証を使用しています。資格情報 (アクセス、シークレット、およびセッション トークン) を取得するには、ID トークンを取得する必要があります。
  2. ユーザー名、パスワード、clientId、userPoolId、identityPoolId の情報があります。ただし、認証フロー タイプとして USER_PASSWORD_AUTH を使用して ID トークンを生成しようとすると、次のエラーが発生 します。エラー コード: MissingAuthenticationTokenException; リクエスト ID: ; プロキシ: null)

以下はコードです:

AnonymousAWSCredentials awsCreds = new AnonymousAWSCredentials();

    AWSCognitoIdentityProvider provider = AWSCognitoIdentityProviderClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
            .withRegion(//region)
            .build();
           

    AdminInitiateAuthRequest authRequest = new AdminInitiateAuthRequest()
            .withAuthFlow(AuthFlowType.USER_PASSWORD_AUTH)
            .withClientId("")
            .withUserPoolId("")
            .withAuthParameters(map);
    Map<String,String> map = new HashMap<>();
    map.put("USERNAME","");
    map.put("PASSWORD","");

ここでマップにはユーザー名とパスワードがあります。

IDトークンとアクセストークンを生成するためにJavaで認証を構成する方法について誰かが助けることができますか? 前もって感謝します!!

4

1 に答える 1

4

コードは次のようになります。その点に注意してください:

  1. 認証には ADMIN_USER_PASSWORD_AUTH フローが使用されます。AdminInitiateAuthを参照 してください。

  2. Cognito のクライアント設定の「Auth Flows Configuration」セクションで、次のオプション「Enable username password auth for admin APIs for authentication (ALLOW_ADMIN_USER_PASSWORD_AUTH)」を有効にする必要があります。

     public static void auth(String username, String password) {
    
     AwsBasicCredentials awsCreds = AwsBasicCredentials.create(AWS_KEY,
             AWS_SECRET);
    
     CognitoIdentityProviderClient identityProviderClient =
             CognitoIdentityProviderClient.builder()
                     .credentialsProvider(StaticCredentialsProvider.create(awsCreds))
                     .region(Region.of(REGION))
                     .build();
    
     final Map<String, String> authParams = new HashMap<>();
     authParams.put("USERNAME", username);
     authParams.put("PASSWORD", password);
     authParams.put("SECRET_HASH", calculateSecretHash(CLIENT_ID,
             CLIENT_SECRET, username));
    
     final AdminInitiateAuthRequest authRequest = AdminInitiateAuthRequest.builder()
             .authFlow(AuthFlowType.ADMIN_USER_PASSWORD_AUTH)
             .clientId(CLIENT_ID)
             .userPoolId(POOL_ID)
             .authParameters(authParams)
             .build();
    
     AdminInitiateAuthResponse result = identityProviderClient.adminInitiateAuth(authRequest);
    
     System.out.println(result.authenticationResult().accessToken());
     System.out.println(result.authenticationResult().idToken());
    

    }

  3. メソッド calculateSecretHash は、AWS ドキュメントサインアップとユーザー アカウントの確認から取得されます。

     private static String calculateSecretHash(String userPoolClientId, String userPoolClientSecret, String userName) {
     final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
    
     SecretKeySpec signingKey = new SecretKeySpec(
             userPoolClientSecret.getBytes(StandardCharsets.UTF_8),
             HMAC_SHA256_ALGORITHM);
     try {
         Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
         mac.init(signingKey);
         mac.update(userName.getBytes(StandardCharsets.UTF_8));
         byte[] rawHmac = mac.doFinal(userPoolClientId.getBytes(StandardCharsets.UTF_8));
         return Base64.getEncoder().encodeToString(rawHmac);
     } catch (Exception e) {
         throw new RuntimeException("Error while calculating ");
     }}
    
于 2020-09-18T10:32:24.660 に答える