I've created my Cognito User Pool as follows:
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