2017-02-06 20 views
0

私は私のJavaのバックエンドからユーザー名とパスワードを使用して、私のアマゾンのcognitoユーザプールのユーザを登録しようが、私は常にエラーを取得:AWS Cognito:秘密のJava SDK(Androidのではない)とのハッシュとADMIN_NO_SRP_AUTHフロー

Unable to verify secret hash for client 

ドキュメントには私はどのように登録要求でclientSecretを渡すための情報が見つかりませんでした。私はclientSecretなしで(バックエンド)アプリケーションを作成したくありません。

私のコードは、あなたがSignUp APIを使用する必要があるユーザーを登録するには、この

identityProvider = AWSCognitoIdentityProviderClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCreds)).withRegion(Regions.EU_CENTRAL_1).build(); 

Map<String, String> authParameters = new HashMap<>(); 
authParameters.put("USERNAME", "username"); 
authParameters.put("PASSWORD", "password"); 
authParameters.put("SECRET_HASH", "secret copy and paste from the aws console"); // i read in a forum post, that this should work 

AdminInitiateAuthRequest authRequest = new AdminInitiateAuthRequest(); 
authRequest.withAuthFlow(AuthFlowType.ADMIN_NO_SRP_AUTH); 
authRequest.setAuthParameters(authParameters); 
authRequest.setClientId("clientId"); 
authRequest.setUserPoolId("userPoolId"); 

AdminInitiateAuthResult authResponse = identityProvider.adminInitiateAuth(authRequest); 

おかげ マルセル

答えて

1

のように見えます。 Javaで次のように秘密のハッシュを計算することができます。

public String calculateSecretHash(String userPoolclientId, String userPoolclientSecret, String userName) { 
     if (userPoolclientSecret == null) { 
      return null; 
     } 

     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 Encoding.encodeBase64(rawHmac); 
     } catch (Exception e) { 
      throw new RuntimeException("Error while calculating "); 
     } 
    } 

あなたのバックエンドからユーザーを作成する代わりに、直接あなたの顧客からアマゾンCognitoを呼び出すのユースケースを詳しく説明していただけますか?

編集:compute the secret hashについてのセクションを含むようにドキュメントを更新しました。

+1

cognitoが使用されていることが分かりべきではありません、私はAPIとクライアント/顧客を提供します。おそらく後で、私は自分の "ユーザー管理"または別のプロバイダに変更します。お客様のAPIを変更することはできません。 –

+0

意味があります。ちなみに、私たちはあなたが自分のユーザー管理に変更する必要がないように、私たちが提供できる機能を聞いてみたいと思っています:) –

+0

正直言って:Cognitoユーザープールの概念に関するより良い文書と例連合は良い出発点です。アカウント間のリンクは十分に文書化されていません。私の側からの小さなケース。 Facebookにログインしたユーザー - フェデレーションされたIDが作成されます。その後、私は自分のユーザープール(この前に、私は自分自身でFacebookからのメールを把握する必要がある)でこのユーザーがいるかどうかを確認する必要があります。そうでない場合は、このユーザーを作成し、このプールユーザーアカウントをフェデレーションアカウントにリンクする必要があります。私はそれを管理しましたが、それは正しい流れを見つけ出すための長い道でした。 –

0

次のコードは完璧に動作します:

AdminInitiateAuthRequest adminInitiateAuthRequest = new AdminInitiateAuthRequest().withAuthFlow(AuthFlowType.ADMIN_NO_SRP_AUTH).withClientId("<ID of your client application>").withUserPoolId("<your user pool ID>") 
      .addAuthParametersEntry("USERNAME", "<your user>").addAuthParametersEntry("PASSWORD", "<your password for the user>"); 
    AdminInitiateAuthResult adminInitiateAuth = identityProvider.adminInitiateAuth(adminInitiateAuthRequest); 
    System.out.println(adminInitiateAuth.getAuthenticationResult().getIdToken()); 
関連する問題