Cognito SRP Аутентификация JAVA SDK - PullRequest
       45

Cognito SRP Аутентификация JAVA SDK

0 голосов
/ 01 сентября 2018

Я пытаюсь аутентифицировать приложение Java с помощью Cognito. Я использовал для python библиотеку ордеров, которая работала очень хорошо. Но я хочу сделать то же самое в Java сейчас.

Моя функция Python, которую я использовал для аутентификации с ордером библиотекой

def SRPauthentication(organizationAdmin,
                     password,
                     pool_id,
                     client_id,
                     client):
    aws = AWSSRP(username=organizationAdmin,
                 password=password,
                 pool_id=pool_id,
                 client_id=client_id,
                 client=client)
    tokens = aws.authenticate_user()
    authorization_token= tokens['AuthenticationResult']['IdToken']
    return authorization_token 

с этим я мог бы легко получить доступ к некоторым защищенным API. Теперь я хочу сделать то же самое с Java, но у меня есть проблемы.

На данный момент это мое решение:

  public static void GetCreds()
      {

          AWSCognitoIdentityProvider identityProvider = AWSCognitoIdentityProviderClientBuilder.defaultClient();
          AdminInitiateAuthRequest adminInitiateAuthRequest = new AdminInitiateAuthRequest().
                  withAuthFlow(AuthFlowType.USER_SRP_AUTH).
                  withClientId("234234234234").withUserPoolId("eu-central-1_sdfsdfdsf")
                  .addAuthParametersEntry("USERNAME", "UserK").
                   addAuthParametersEntry("PASSWORD","#######);

          adminInitiateAuthRequest.getAuthFlow();
          AdminInitiateAuthResult adminInitiateAuth = identityProvider.adminInitiateAuth(adminInitiateAuthRequest);
            System.out.println(adminInitiateAuth.getAuthenticationResult().getIdToken());
      }

Когда я запускаю это, я получаю исключение: Исключение в потоке "main" com.amazonaws.services.cognitoidp.model.AWSCognitoIdentityProviderException: Пользователь: arn: aws: iam :: XXXXXXXXXXXXXXXXX: пользователь / хан не авторизован для выполнения: cognito-idp: AdminInitiateAuth на ресурсе: arn: cognito-idp: eu-central-1: XXXXXXXX: userpool / eu-central-1_XXXXXXX с явным отказом (Служба: AWSCognitoIdentityProvider; Код состояния: 400; Код ошибки: AccessDeniedException; Код запроса: 21be0b8e-adec-11e8-ad45-23434 )

Там написано, что я не уполномочен выполнять подобные инструкции. Так что я думаю, что я делаю что-то вообще неправильно. Поскольку он работает с моим кодом Python и в Java, он распознает мое имя пользователя по учетным данным. Вызов Cognito на самом деле должен быть независимым от моих учетных данных AWS, верно?

Как пройти аутентификацию в Cognito с использованием Java, чтобы получить токен для доступа к защищенным службам aws?

EDIT:

  AWSCognitoIdentityProvider identityProvider = AWSCognitoIdentityProviderClientBuilder.standard()
              .build();
      InitiateAuthRequest adminInitiateAuthRequest = new InitiateAuthRequest()
              .withAuthFlow(AuthFlowType.USER_SRP_AUTH)
              .withClientId("XXXXXXXXXXXXXXXXX")
              .addAuthParametersEntry("USERNAME", "user").
               addAuthParametersEntry("PASSWORD","za$Lwn")
              .addAuthParametersEntry("SRP_A",new AuthenticationHelper("eu-central-1XXXXXXXXX").getA().toString(16));

      adminInitiateAuthRequest.getAuthFlow();
      InitiateAuthResult adminInitiateAuth = identityProvider.initiateAuth(adminInitiateAuthRequest);
      System.out.println(adminInitiateAuth);

Я изменил AdminInitateAuthRequest на InitateAuthRequest. После этого у меня был параметр Ошибка пропуска SRP_A, который я как-то исправил с похожим вопросом здесь И теперь я получаю это:

{ChallengeName: PASSWORD_VERIFIER,ChallengeParameters: {SALT=877734234324234ed68300f39bc5b, SECRET_BLOCK=lrkwejrlewrjlewkjrewlrkjwerlewkjrewlrkjewrlkewjrlewkrjZ+Q==, USER_ID_FOR_SRP=user, USERNAME=user, SRP_B=43ecc1lwkerjwelrkjewlrjewrlkewjrpoipweoriwe9r873jr34h9r834hr3455f7d079d71e5012f1623ed54dd10b832792dafa3438cca3f59c0f462cbaee255d5b7c2werwerwerkjweorkjwerwerewrf5020e4f8b5452f3b89caef4a797456743602b80b5259261f90e52374adc06b456521a9026cce9c1cbe8b9ffd6040e8c1589d35546861422110ac7e38c1c93389b802a03e3e2e4a50e75d088275195f836f66e25f1a431dd56bb2},}

Я сократил результат со всеми ключами, но что делать дальше?

1 Ответ

0 голосов
/ 04 сентября 2018

Наконец-то я смог решить эту проблему с помощью этого класса кода. Существует несколько проблем, связанных с аутентификацией SRP. InitiateAuthRequest - это один первый необходимый запрос.

Этот похожий вопрос помог мне: StackOverflow stackoverfow

String PerformSRPAuthentication(String username, String password) {
    String authresult = null;

    InitiateAuthRequest initiateAuthRequest = initiateUserSrpAuthRequest(username);
    try {
        AnonymousAWSCredentials awsCreds = new AnonymousAWSCredentials();
        AWSCognitoIdentityProvider cognitoIdentityProvider = AWSCognitoIdentityProviderClientBuilder
                .standard()
                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                .withRegion(Regions.fromName(this.region))
                .build();
        InitiateAuthResult initiateAuthResult = cognitoIdentityProvider.initiateAuth(initiateAuthRequest);
        if (ChallengeNameType.PASSWORD_VERIFIER.toString().equals(initiateAuthResult.getChallengeName())) {
            RespondToAuthChallengeRequest challengeRequest = userSrpAuthRequest(initiateAuthResult, password);
            RespondToAuthChallengeResult result = cognitoIdentityProvider.respondToAuthChallenge(challengeRequest);
            //System.out.println(result);
            System.out.println(CognitoJWTParser.getPayload(result.getAuthenticationResult().getIdToken()));
            authresult = result.getAuthenticationResult().getIdToken();
        }
    } catch (final Exception ex) {
        System.out.println("Exception" + ex);

    }
    return authresult;
}


 private InitiateAuthRequest initiateUserSrpAuthRequest(String username) {

    InitiateAuthRequest initiateAuthRequest = new InitiateAuthRequest();
    initiateAuthRequest.setAuthFlow(AuthFlowType.USER_SRP_AUTH);
    initiateAuthRequest.setClientId(this.clientId);
    //Only to be used if the pool contains the secret key.
    //initiateAuthRequest.addAuthParametersEntry("SECRET_HASH", this.calculateSecretHash(this.clientId,this.secretKey,username));
    initiateAuthRequest.addAuthParametersEntry("USERNAME", username);
    initiateAuthRequest.addAuthParametersEntry("SRP_A", this.getA().toString(16));
    return initiateAuthRequest;
}
...