代码之家  ›  专栏  ›  技术社区  ›  Khan

Cognoto SRP认证JAVA SDK

  •  0
  • Khan  · 技术社区  · 6 年前

    我用python的权证库,效果很好。但我现在想用java做同样的事情。

    warrant 图书馆

    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。

    到目前为止,我的解决方案是:

      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());
          }
    

    当我运行这个时,我得到一个异常:

    Exception in thread "main" `com.amazonaws.services.cognitoidp.model.AWSCognitoIdentityProviderException: User: arn:aws:iam::XXXXXXXXXXXXXXXXX:user/khan is not authorized to perform: cognito-idp:AdminInitiateAuth on resource: arn:aws:cognito-idp:eu-central-1:XXXXXXXX:userpool/eu-central-1_XXXXXXX with an explicit deny (Service: AWSCognitoIdentityProvider; Status Code: 400; Error Code: AccessDeniedException; Request ID: 21be0b8e-adec-11e8-ad45-234234234)`
    

    上面说我无权执行这种指令。所以我想我做错了什么。因为它与我的python代码一起工作,在Java中,它从凭证中识别我的用户名。Cognito调用实际上应该独立于我的aws凭证/用户帐户,对吗?

    编辑:

      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\u一个参数,我用一个类似的问题修复了这个参数 here 现在我明白了:

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

    我已经用所有的钥匙缩短了结果,但下一步该怎么办?

    1 回复  |  直到 5 年前
        1
  •  5
  •   Khan    6 年前

    我终于可以用 this 代码类。

    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;
    }