Amazon web services awscognito:javasdk(非Android)和ADMIN\u NO\u SRP\u AUTH流的秘密哈希

Amazon web services awscognito:javasdk(非Android)和ADMIN\u NO\u SRP\u AUTH流的秘密哈希,amazon-web-services,amazon-cognito,Amazon Web Services,Amazon Cognito,我尝试使用java后端的用户名和密码在amazon cognito用户池中注册一个用户,但总是出现以下错误: Unable to verify secret hash for client 在文档中,我没有找到如何在注册请求中传递clientSecret的任何信息,并且我不希望创建没有clientSecret的(后端)应用程序 我的代码如下所示 identityProvider = AWSCognitoIdentityProviderClientBuilder.standard().withC

我尝试使用java后端的用户名和密码在amazon cognito用户池中注册一个用户,但总是出现以下错误:

Unable to verify secret hash for client
在文档中,我没有找到如何在注册请求中传递clientSecret的任何信息,并且我不希望创建没有clientSecret的(后端)应用程序

我的代码如下所示

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);
identityProvider=AWSCognitoIdentityProviderClientBuilder.standard()。带有凭据(新的AWSStaticCredentialsProvider(awsCreds))。带有区域(Regions.EU_CENTRAL_1).build();
Map authParameters=new HashMap();
authParameters.put(“用户名”、“用户名”);
authParameters.put(“密码”、“密码”);
authParameters.put(“SECRET_HASH”,“从aws控制台进行秘密复制和粘贴”);//我在论坛的帖子上读到,这应该行得通
AdminInitiateAuthRequest authRequest=新的AdminInitiateAuthRequest();
authRequest.withAuthFlow(AuthFlowType.ADMIN\u NO\u SRP\u AUTH);
authRequest.setAuthParameters(authParameters);
authRequest.setClientId(“clientId”);
authRequest.setUserPoolId(“userPoolId”);
AdminInitiateAuthResult authResponse=identityProvider.adminInitiateAuth(authRequest);
谢谢
Marcel要注册用户,您应该使用。在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 ");
        }
    }
您能详细说明一下从后端创建用户而不是直接从客户端调用Amazon Cognito的用例吗


编辑:我们已经更新了文档,增加了一个关于如何注册的部分。

要注册用户,您应该使用。在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 ");
        }
    }
您能详细说明一下从后端创建用户而不是直接从客户端调用Amazon Cognito的用例吗


编辑:我们已经更新了文档,其中包含了一节关于如何操作的内容。

以下代码非常有效:

    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());
AdminInitiateAuthRequest AdminInitiateAuthRequest=new AdminInitiateAuthRequest().withAuthFlow(AuthFlowType.ADMIN\u NO\u SRP\u AUTH).withClientId(“”)。withUserPoolId(“”)
.addAuthParametersEntry(“用户名”),addAuthParametersEntry(“密码”);
AdminInitiateAuthResult adminInitiateAuth=identityProvider.adminInitiateAuth(adminInitiateAuthRequest);
System.out.println(adminInitiateAuth.getAuthenticationResult().getIdToken());

以下代码工作正常:

    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());
AdminInitiateAuthRequest AdminInitiateAuthRequest=new AdminInitiateAuthRequest().withAuthFlow(AuthFlowType.ADMIN\u NO\u SRP\u AUTH).withClientId(“”)。withUserPoolId(“”)
.addAuthParametersEntry(“用户名”),addAuthParametersEntry(“密码”);
AdminInitiateAuthResult adminInitiateAuth=identityProvider.adminInitiateAuth(adminInitiateAuthRequest);
System.out.println(adminInitiateAuth.getAuthenticationResult().getIdToken());

我将提供一个API,客户/客户不应该看到使用了cognito。也许以后,我会改用自己的“用户管理”或其他提供商。不应该为我们的客户更改API。这是有道理的。顺便说一句,我们很想知道我们可以提供哪些功能,这样您就不必改变自己的用户管理:)…老实说:关于cognito用户池和联合概念的更好的文档和示例是一个很好的起点。账户之间的联系没有很好的记录。我这边的一个小箱子。通过facebook登录的用户-将创建一个联合身份。之后,我需要检查这个用户是否在我的用户池中(之前,我需要自己计算来自facebook的电子邮件)。如果没有,我需要创建这个用户,并需要将这个池用户帐户链接到联邦帐户。我做到了,但要找到正确的流程还有很长的路要走。另一个问题是。客户正在使用facebook登录。在联邦身份中,帐户链接到cognito用户池。如何获取链接的用户池数据-仅使用facebook的accessToken?如果您有时间,可以查看。我进一步描述了我的流程,我将提供一个API,客户/客户不应该看到使用了cognito。也许以后,我会改用自己的“用户管理”或其他提供商。不应该为我们的客户更改API。这是有道理的。顺便说一句,我们很想知道我们可以提供哪些功能,这样您就不必改变自己的用户管理:)…老实说:关于cognito用户池和联合概念的更好的文档和示例是一个很好的起点。账户之间的联系没有很好的记录。我这边的一个小箱子。通过facebook登录的用户-将创建一个联合身份。之后,我需要检查这个用户是否在我的用户池中(之前,我需要自己计算来自facebook的电子邮件)。如果没有,我需要创建这个用户,并需要将这个池用户帐户链接到联邦帐户。我做到了,但要找到正确的流程还有很长的路要走。另一个问题是。客户正在使用facebook登录。在联邦身份中,帐户链接到cognito用户池。如何获取链接的用户池数据-仅使用facebook的accessToken?如果您有时间,可以查看。我更详细地描述了我的流程什么是identityProvider?它就在那里,但我不知道这是从哪里来的啊AWSCognitoIdentityProviderClientBuilder.standard()。带有凭据(新的AWSStaticCredentialsProvider(awsCreds))。带有区域(Regions.EU_CENTRAL_1).build();你在哪里设置秘密哈希?我猜你的应用程序客户端是在没有客户端密码的情况下安装的。什么是identityProvider?它就在那里,但我不知道这是从哪里来的啊AWSCognitoIdentityProviderClientBuilder.standard()。带有凭据(新的AWSStaticCredentialsProvider(awsCreds))。带有区域(Regions.EU_CENTRAL_1).build();你在哪里设置秘密哈希?我猜你的应用程序客户端是在没有客户端密码的情况下安装的。