问题产生的原因是AWS Cognito在用户验证设备时,并未标记已被验证的设备。因此,下次用户使用已验证的设备登录时,AWS Cognito并不知道该设备是否已被验证。
解决方案是在用户使用MFA (Multi-Factor Authentication 多因素身份验证)时,为设备打上验证标记。 在AWS Cognito中,可以使用以下代码示例标记已验证的设备:
AuthenticateUserRequest authenticateUserRequest = new AuthenticateUserRequest()
.withClientId(clientId)
.withAuthFlow(AuthFlowType.USER_PASSWORD_AUTH)
.withAuthParameters(authParams);
AuthUserResult authUserResult = amazonCognitoIdentityProviderClient.authenticateUser(authenticateUserRequest);
if (authUserResult.getAuthenticationResult().getMFAToken() != null) {
String accessToken = authUserResult.getAuthenticationResult().getAccessToken();
adminSetUserMFAPreferenceRequest
= new AdminSetUserMFAPreferenceRequest().withUsername(userName)
.withSoftwareTokenMfaSettings(
new SoftwareTokenMfaSettingsType().withEnabled(true));
amazonCognitoIdentityProviderClient.adminSetUserMFAPreference(adminSetUserMFAPreferenceRequest);
}
以上代码示例包括在进行用户认证时,检查身份验证结果是否为MFA请求。如果是,则使用以下代码在AWS Cognito中为设备打上标记:
adminSetUserMFAPreferenceRequest = new AdminSetUserMFAPreferenceRequest().withUsername(userName)
.withSoftwareTokenMfaSettings(new SoftwareTokenMfaSettingsType().withEnabled(true));
amazonCognitoIdentityProviderClient.adminSetUserMFAPreference(adminSetUserMFAPreferenceRequest);
使用上述代码行可以在 AWS Cognito 中标记设备,使得系统知道已验证的设备可以用于再次进行身份验证。