2

I've created my Cognito User Pool as follows:

settings

for allows users to log in via their email or username (and have them both unique for each user).

This is my Account Cognito implementation:

public class AccountDAO_Cognito implements AccountDAO {

    @Override
    public boolean authenticate(Account account, Context context) {
        CognitoSettings cognitoSettings = new CognitoSettings(context);
        cognitoSettings.userLogin(account.getEmail(), account.getPassword());
        return true;
    }

    @Override
    public boolean create(Account account, Context context) {
        CognitoSettings cognitoSettings = new CognitoSettings(context);
        setCognitoSettingsAttributes(cognitoSettings, account);
        cognitoSettings.signUpInBackground(account.getEmail(), account.getPassword());
        return true;
    }


    @Override
    public boolean updatePassword(Account account, Context context, String newPassword) {
        CognitoSettings cognitoSettings = new CognitoSettings(context);
        cognitoSettings
                .getCognitoUserPool()
                .getUser(account.getEmail())
                .changePasswordInBackground(account.getPassword(), newPassword, genericHandler);
        return true;
    }

    private void setCognitoSettingsAttributes(CognitoSettings cognitoSettings, Account account) {
        cognitoSettings.addAttribute("email", account.getEmail());
        cognitoSettings.addAttribute("name", account.getName());
        cognitoSettings.addAttribute("family_name", account.getLastname());
    }
}

This is my CognitoSettings class

public class CognitoSettings {
    private CognitoUserPool cognitoUserPool;
    private CognitoUserAttributes cognitoUserAttributes;
    private Context context;
    private String userPassword;

    public CognitoSettings(Context context) {
        this.context = context;
        String poolID = "SECRET";
        String clientID = "SECRET";
        String clientSecret = "SECRET";
        Regions awsRegion = Regions.US_EAST_1;
        cognitoUserPool = new CognitoUserPool(context, poolID, clientID, clientSecret, awsRegion);
        cognitoUserAttributes = new CognitoUserAttributes();
    }

    public void signUpInBackground(String userId, String password) {
        cognitoUserPool.signUpInBackground(userId, password, this.cognitoUserAttributes, null, signUpCallback);
    }

    SignUpHandler signUpCallback = new SignUpHandler() {
        @Override
        public void onSuccess(CognitoUser cognitoUser, boolean userConfirmed, CognitoUserCodeDeliveryDetails cognitoUserCodeDeliveryDetails) {
            // Sign-up was successful
            Log.d(TAG, "Sign-up success");
            Toast.makeText(context, "Sign-up success, codice inviato a " + cognitoUserCodeDeliveryDetails.getDestination(), Toast.LENGTH_LONG).show();
            // Check if this user (cognitoUser) needs to be confirmed
            if (!userConfirmed) {

            } else {
                Toast.makeText(context, "Errore: l'utente era già stato confermato", Toast.LENGTH_LONG).show();
                // The user has already been confirmed
            }
        }

        @Override
        public void onFailure(Exception exception) {
            Toast.makeText(context, "Sign-up failed " + exception.getMessage(), Toast.LENGTH_LONG).show();
            Log.d(TAG, "Sign-up failed: " + exception);
        }
    };

    public void confirmUser(String userId, String code) {
        CognitoUser cognitoUser = cognitoUserPool.getUser(userId);
        cognitoUser.confirmSignUpInBackground(code, false, confirmationCallback);
    }

    // Callback handler for confirmSignUp API
    GenericHandler confirmationCallback = new GenericHandler() {
        @Override
        public void onSuccess() {
            // User was successfully confirmed
            Toast.makeText(context, "User Confirmed", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onFailure(Exception exception) {
            // User confirmation failed. Check exception for the cause.
        }
    };

    public void addAttribute(String key, String value) {
        cognitoUserAttributes.addAttribute(key, value);
    }

    public void userLogin(String userId, String password) {
        CognitoUser cognitoUser = cognitoUserPool.getUser(userId);
        userPassword = password;
        cognitoUser.getSessionInBackground(authenticationHandler);
    }

    // Callback handler for the sign-in process
    AuthenticationHandler authenticationHandler = new AuthenticationHandler() {
        @Override
        public void authenticationChallenge(ChallengeContinuation continuation) {

        }

        @Override
        public void onSuccess(CognitoUserSession userSession, CognitoDevice newDevice) {
            if (!userSession.isValid())
                Toast.makeText(context, "Rifai il login", Toast.LENGTH_SHORT).show();
            else
            //Toast.makeText(context, "Sign in success", Toast.LENGTH_LONG).show();
        }

        @Override
        public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) {
            // The API needs user sign-in credentials to continue
            AuthenticationDetails authenticationDetails = new AuthenticationDetails(userId, userPassword, null);
            // Pass the user sign-in credentials to the continuation
            authenticationContinuation.setAuthenticationDetails(authenticationDetails);
            // Allow the sign-in to continue
            authenticationContinuation.continueTask();
        }

        @Override
        public void getMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) {
            // Multi-factor authentication is required; get the verification code from user
            //multiFactorAuthenticationContinuation.setMfaCode(mfaVerificationCode);
            // Allow the sign-in process to continue
            //multiFactorAuthenticationContinuation.continueTask();
        }

        @Override
        public void onFailure(Exception exception) {
            // Sign-in failed, check exception for the cause
            Toast.makeText(context, "Sign in Failure " + exception.getMessage(), Toast.LENGTH_LONG).show();
        }
    };

    public void tokenIsValid() {
        CognitoUser cognitoUser = cognitoUserPool.getCurrentUser();
        cognitoUser.getSessionInBackground(authenticationHandler);
    }

    public CognitoUserPool getCognitoUserPool() {
        return cognitoUserPool;
    }
}

Unfortunately when I run my android app, it displays an error:

Sign-up failed Username cannot be of email format since user pool is configured for email alias (Service: AmazonCognitoIdentityProvider, Status code: 400, Error Code: InvalidParameterException)

Edit Note that my client form is structured as follows: Name, Family Name, Nickname, Email (for example: John, Petrucci, john_petrucci72, john@example.com)

UPDATE

public class AccountDAO_Cognito implements AccountDAO {

    @Override
    public boolean authenticate(Account account, Context context) {
        CognitoSettings cognitoSettings = new CognitoSettings(context);
        cognitoSettings.userLogin(account.getEmail(), account.getPassword());
        return true;
    }

    @Override
    public boolean create(Account account, Context context) {
        CognitoSettings cognitoSettings = new CognitoSettings(context);
        setCognitoSettingsAttributes(cognitoSettings, account);
        //cognitoSettings.signUpInBackground(account.getEmail(), account.getPassword());
        cognitoSettings.signUpInBackground(account.getNickname(), account.getPassword());
        return true;
    }

    @Override
    public boolean isNicknameAvailable(String nickname) {
        // Verificare che il nickname sia disponibile (?)
        return true;
    }

    @Override
    public boolean updatePassword(Account account, Context context, String newPassword) {
        final GenericHandler genericHandler = new GenericHandler() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onFailure(Exception exception) {

            }
        };
        CognitoSettings cognitoSettings = new CognitoSettings(context);
        cognitoSettings
                .getCognitoUserPool()
                .getUser(account.getEmail())
                .changePasswordInBackground(account.getPassword(), newPassword, genericHandler);
        return true;
    }

    private void setCognitoSettingsAttributes(CognitoSettings cognitoSettings, Account account) {
        cognitoSettings.addAttribute("email", account.getEmail());
        cognitoSettings.addAttribute("name", account.getName());
        cognitoSettings.addAttribute("family_name", account.getLastname());
        //cognitoSettings.addAttribute("nickname", account.getNickname());
    }
}

and

public class CognitoSettings {
    private CognitoUserPool cognitoUserPool;
    private CognitoUserAttributes cognitoUserAttributes;
    private Context context;
    private String userPassword;

    public CognitoSettings(Context context) {
        this.context = context;
        /*String poolID = "SECRET";
        String clientID = "SECRET";
        String clientSecret = "SECRET";*/
        String poolID = "USER_POOL";
        String clientID = "CLIENT_ID";
        String clientSecret = "CLIENT_SECRET";
        Regions awsRegion = Regions.US_EAST_1;
        cognitoUserPool = new CognitoUserPool(context, poolID, clientID, clientSecret, awsRegion);
        cognitoUserAttributes = new CognitoUserAttributes();
    }

    public void signUpInBackground(String username, String password) {
        cognitoUserPool.signUpInBackground(username, password, this.cognitoUserAttributes, null, signUpCallback);
    }

    SignUpHandler signUpCallback = new SignUpHandler() {
        @Override
        public void onSuccess(CognitoUser cognitoUser, boolean userConfirmed, CognitoUserCodeDeliveryDetails cognitoUserCodeDeliveryDetails) {
            // Sign-up was successful
            Log.d(TAG, "Sign-up success");
            Toast.makeText(context, "Sign-up success, codice inviato a " + cognitoUserCodeDeliveryDetails.getDestination(), Toast.LENGTH_LONG).show();
            // Check if this user (cognitoUser) needs to be confirmed
            if (!userConfirmed) {

            } else {
                Toast.makeText(context, "Errore: l'utente era già stato confermato", Toast.LENGTH_LONG).show();
                // The user has already been confirmed
            }
        }

        @Override
        public void onFailure(Exception exception) {
            Toast.makeText(context, "Sign-up failed " + exception.getMessage(), Toast.LENGTH_LONG).show();
            Log.d(TAG, "Sign-up failed: " + exception);
        }
    };

    public void confirmUser(String userId, String code) {
        CognitoUser cognitoUser = cognitoUserPool.getUser(userId);
        cognitoUser.confirmSignUpInBackground(code, false, confirmationCallback);
    }

    // Callback handler for confirmSignUp API
    GenericHandler confirmationCallback = new GenericHandler() {
        @Override
        public void onSuccess() {
            // User was successfully confirmed
            Toast.makeText(context, "User Confirmed", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onFailure(Exception exception) {
            // User confirmation failed. Check exception for the cause.
        }
    };

    public void addAttribute(String key, String value) {
        cognitoUserAttributes.addAttribute(key, value);
    }

    public void userLogin(String userId, String password) {
        CognitoUser cognitoUser = cognitoUserPool.getUser(userId);
        userPassword = password;
        cognitoUser.getSessionInBackground(authenticationHandler);
    }

    // Callback handler for the sign-in process
    AuthenticationHandler authenticationHandler = new AuthenticationHandler() {
        @Override
        public void authenticationChallenge(ChallengeContinuation continuation) {

        }

        @Override
        public void onSuccess(CognitoUserSession userSession, CognitoDevice newDevice) {
            if (!userSession.isValid())
                Toast.makeText(context, "Rifai il login", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(context, "Login valido", Toast.LENGTH_SHORT).show();
            //Toast.makeText(context, "Sign in success", Toast.LENGTH_LONG).show();
        }

        @Override
        public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) {
            // The API needs user sign-in credentials to continue
            AuthenticationDetails authenticationDetails = new AuthenticationDetails(userId, userPassword, null);
            // Pass the user sign-in credentials to the continuation
            authenticationContinuation.setAuthenticationDetails(authenticationDetails);
            // Allow the sign-in to continue
            authenticationContinuation.continueTask();
        }

        @Override
        public void getMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) {
            // Multi-factor authentication is required; get the verification code from user
            //multiFactorAuthenticationContinuation.setMfaCode(mfaVerificationCode);
            // Allow the sign-in process to continue
            //multiFactorAuthenticationContinuation.continueTask();
        }

        @Override
        public void onFailure(Exception exception) {
            // Sign-in failed, check exception for the cause
            Toast.makeText(context, "Sign in Failure " + exception.getMessage(), Toast.LENGTH_LONG).show();
        }
    };

    public void tokenIsValid() {
        CognitoUser cognitoUser = cognitoUserPool.getCurrentUser();
        cognitoUser.getSessionInBackground(authenticationHandler);
    }

    public CognitoUserPool getCognitoUserPool() {
        return cognitoUserPool;
    }
}

But when I put the verification code which Cognito send me via email into a dialog:

private void showConfirmationCodeDialog() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(signUpActivity);
        LayoutInflater layoutInflater = signUpActivity.getLayoutInflater();
        View dialogView = layoutInflater.inflate(R.layout.dialog_confirmation_code, null);
        builder.setView(dialogView);
        builder.setCancelable(false);
        final EditText editTextConfirmationCode = dialogView.findViewById(R.id.edit_text_confirmation_code);
        builder.setPositiveButton("Verifica", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
                Toast.makeText(signUpActivity, "click " + editTextConfirmationCode.getText().toString(), Toast.LENGTH_SHORT).show();
            }
        });
        builder.create();
        builder.show();
    }

email does not get verified

Al-Mustafa Azhari
  • 850
  • 1
  • 9
  • 24
  • Try to enable **Enable case insensitivity for username input** on Cognito setting and try again . Also share example of values for parameters `userId` `this.cognitoUserAttributes` – Al-Mustafa Azhari Jul 30 '20 at 11:23
  • @Al-MustafaAzhari I have just edited my post. –  Jul 30 '20 at 11:37
  • 2
    When you Sign Up , always set `userId` to username not email , and on attributes set the email . Still when you Sign in you can use user name or email , but for `signUpInBackground` pass the 'username & password' not `email & passowrd` . That what am doing on `JavaScript` and i can login by `username` or `email`. Try this . – Al-Mustafa Azhari Jul 30 '20 at 11:45
  • this seems to work. thanks –  Jul 30 '20 at 12:57

0 Answers0