放大 "Unable to verify secret hash for client"
Amplify "Unable to verify secret hash for client"
我们一直在使用 Amplify 和 Cognito 为部署到 Lambda 的 Angular6 应用程序注册我们的用户。客户希望从电子邮件过渡到用户名作为主要用户标识。所以我们创建了一个新的用户池/客户端。我看不到配置设置,我只是得到了新的用户池、身份池和客户端 ID。然后我将应用程序注册代码更改为如下所示:
return from(Auth.signUp({
'username': username, // was email
'password': password,
attributes: { // added these
'email': email,
'phone_number': phone_number,
'family_name': name,
'birthdate': DOB,
'custom:last_4_ssn': SSN // custom attribute
}}));
我得到的响应没有进行其他更改是:无法验证客户端的秘密哈希。 Google 声称问题是 secretAccess 目前是一个不受支持的配置,但是有权访问这些服务的人向我发誓,我们的设置中没有任何地方配置 secretAccess。
对于无法访问配置,我深表歉意,但是否有任何其他可能的原因导致收到此错误?
该错误可能源于您所连接的应用程序客户端具有关联的密钥。当您创建用户池应用程序客户端时,它会默认生成一个秘密:
现在,对于 React-Native Amplify,您必须使用没有生成密钥的应用程序客户端。因此,当您使用所需属性创建新的应用程序客户端时,请确保未选中 "Generate client secret" 框。
解决方案是将 secret_hash 与 adminAuthInitiate 请求一起传递。要计算秘密哈希,您可以使用以下方法:
public 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 ");
}
}
如何通过Secret_Hash
Map<String, String> authParams = new HashMap<>(2);
authParams.put("USERNAME", <username>);
authParams.put("PASSWORD", <password>);
authParams.put("SECRET_HASH", calculateSecretHash(cognitoClientId, cognitoClientSecret, <username>));
AdminInitiateAuthRequest authRequest = new AdminInitiateAuthRequest()
.withClientId(userPool.getClientId()).withUserPoolId(userPool.getUserPoolId())
.withAuthFlow(AuthFlowType.ADMIN_NO_SRP_AUTH).withAuthParameters(authParams);
AdminInitiateAuthResult result = cognito.adminInitiateAuth(authRequest);
auth = result.getAuthenticationResult();
我们一直在使用 Amplify 和 Cognito 为部署到 Lambda 的 Angular6 应用程序注册我们的用户。客户希望从电子邮件过渡到用户名作为主要用户标识。所以我们创建了一个新的用户池/客户端。我看不到配置设置,我只是得到了新的用户池、身份池和客户端 ID。然后我将应用程序注册代码更改为如下所示:
return from(Auth.signUp({
'username': username, // was email
'password': password,
attributes: { // added these
'email': email,
'phone_number': phone_number,
'family_name': name,
'birthdate': DOB,
'custom:last_4_ssn': SSN // custom attribute
}}));
我得到的响应没有进行其他更改是:无法验证客户端的秘密哈希。 Google 声称问题是 secretAccess 目前是一个不受支持的配置,但是有权访问这些服务的人向我发誓,我们的设置中没有任何地方配置 secretAccess。
对于无法访问配置,我深表歉意,但是否有任何其他可能的原因导致收到此错误?
该错误可能源于您所连接的应用程序客户端具有关联的密钥。当您创建用户池应用程序客户端时,它会默认生成一个秘密:
现在,对于 React-Native Amplify,您必须使用没有生成密钥的应用程序客户端。因此,当您使用所需属性创建新的应用程序客户端时,请确保未选中 "Generate client secret" 框。
解决方案是将 secret_hash 与 adminAuthInitiate 请求一起传递。要计算秘密哈希,您可以使用以下方法:
public 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 ");
}
}
如何通过Secret_Hash
Map<String, String> authParams = new HashMap<>(2);
authParams.put("USERNAME", <username>);
authParams.put("PASSWORD", <password>);
authParams.put("SECRET_HASH", calculateSecretHash(cognitoClientId, cognitoClientSecret, <username>));
AdminInitiateAuthRequest authRequest = new AdminInitiateAuthRequest()
.withClientId(userPool.getClientId()).withUserPoolId(userPool.getUserPoolId())
.withAuthFlow(AuthFlowType.ADMIN_NO_SRP_AUTH).withAuthParameters(authParams);
AdminInitiateAuthResult result = cognito.adminInitiateAuth(authRequest);
auth = result.getAuthenticationResult();