4.2.2 Using user pools with Bayun AWSS3 wrapper 'SecureAuthentication'
User Registration, SignUp Confirmation, SignIn, SignOut needs to be done with SecureAuthentication instance.
Set up your service config
There is no change in setting up Service Config and is same as using standard AWS Mobile SDK.
// Create a user pool with default ClientConfigurationCognitoUserPool userPool =newCognitoUserPool(context, userPoolId, clientId, clientSecret, cognitoRegion);
// Create a user pool with default ClientConfigurationvar userPool: CognitoUserPool=CognitoUserPool(context, userPoolId, clientId, clientSecret, cognitoRegion)
OR
// This will also workClientConfiguration clientConfiguration =newClientConfiguration();AmazonCognitoIdentityProvider cipClient = new AmazonCognitoIdentityProviderClient(new AnonymousAWSCredentials(), clientConfiguration);
cipClient.setRegion(Region.getRegion(cognitoRegion));CognitoUserPool userPool =newCognitoUserPool(context, userPoolId, clientId, clientSecret, cipClient);
// This will also workval clientConfiguration :ClientConfiguration=ClientConfiguration() val cipClient :AmazonCognitoIdentityProvider = AmazonCognitoIdentityProviderClient( AnonymousAWSCredentials(), clientConfiguration)
cipClient.setRegion(Region.getRegion(cognitoRegion))val userPool:CognitoUserPool=CognitoUserPool(context, userPoolId, clientId, clientSecret, cipClient)
Set Up the SecureAuthentication object
The SecureAuthentication is a singleton object, and must be provided with context, appId and companyName before using it. This will serve as the object on which all function calls are to be made.
val secureAuthentication = SecureAuthentication.getInstance() secureAuthentication.setContext(appContext) secureAuthentication.setAppId(APP_ID) secureAuthentication.setAppSecret(APP_SECRET); secureAuthentication.setApplicationKeySalt(APP_SALT); secureAuthentication.setCompanyName(companyName)
Register a User
Use SecureAuthentication's method signUp to register a new user instead of relying on standard AWS Mobile SDK's signUp method.
boolean registerBayunWithPwd =true;// Hashmap to save the signup fieldsHashMap signUpFields =newHashMap<String,String>();// Read user data and registerCognitoUserAttributes userAttributes =newCognitoUserAttributes();userAttributes.addAttribute(signUpFields.put("Email","email@mydomain.com")// SignupHandler to handle signup outcomes.SignUpHandler signUpHandler =newSignUpHandler() { @OverridepublicvoidonSuccess(CognitoUser user,SignUpResult signUpResult) {if (signUpResult.getUserConfirmed()) {// User is already confirmed// handle the case where user identity is already confirmed. }else {// User is not confirmed// handle the case where user has to confirm his identity } } @OverridepublicvoidonFailure(Exception exception) {// Handle failure. }};// Signup callSecureAuthentication.getInstance().signUp(activityContext, userPool, usernameInput, userpasswordInput, userAttributes, null, signUpHandler, registerBayunWithPwd);
// Hashmap to save the signup fieldsvar signUpFields<String,String>=HashMap()// Read user data and registerval userAttributes =CognitoUserAttributes()userAttributes.addAttribute(signUpFields.put("Email", "email@mydomain.com")// SignupHandler to handle signup outcomes.val signUpHandler: SignUpHandler=object : SignUpHandler {overridefunonSuccess( user: CognitoUser, signUpConfirmationState: Boolean, cognitoUserCodeDeliveryDetails: CognitoUserCodeDeliveryDetails ) {// Check signUpConfirmationState to see if the user is already confirmedif (signUpConfirmationState) {// User is already confirmed// handle the case where user identity is already confirmed. }else {// User is not confirmed// handle the case where user has to confirm his identity } }overridefunonFailure(exception: Exception) {// Handle failure. }}// Signup callSecureAuthentication.getInstance().signUp(activityContext, userPool, usernameInput, userpasswordInput, userAttributes, null, signUpHandler, registerBayunWithPwd)
Confirm Signup
Confirm a users' sign up with the confirmation code using SecureAuthentication's confirmSignUp method. Use this method instead of CognitoUser's method, to confirm signup with both Cognito and Bayun.
// Callback to handle the confirmation api call.GenericHandler confHandler =newGenericHandler() { @OverridepublicvoidonSuccess() {Log.d(TAG,"User confirmed.");// Handle success. } @OverridepublicvoidonFailure(Exception exception) {// Handle failure. }};// Call to confirm the user.SecureAuthentication.getInstance().confirmSignUp(activityContext, cognitoUser, confirmCode, forcedAliasCreation, confHandler);
// Callback to handle the confirmation api call.val confHandler: GenericHandler=object : GenericHandler {overridefunonSuccess() {// Handle success. }overridefunonFailure(exception: java.lang.Exception) {// Handle failure. }}// Call to confirm the user.SecureAuthentication.getInstance().confirmSignUp(context, cognitoUser, confirmCode, forcedAliasCreation, confHandler)
Sign in a user
Use SecureAuthentication's signIn method to get a session, using username and password, with both Cognito and Bayun, instead of CognitoUser's method.
// Callback to handle the signIn api call.AuthenticationHandler authenticationHandler =newAuthenticationHandler() { @OverridepublicvoidonSuccess(CognitoUserSession cognitoUserSession,CognitoDevice device) {Log.d(TAG,"User sign in success.");// Handle success.// This block is also executed when a user is already signed in. } @OverridepublicvoidgetAuthenticationDetails(AuthenticationContinuation continuation,String username) {AuthenticationDetails authenticationDetails =newAuthenticationDetails(username, password, validationData);continuation.setAuthenticationDetails(authenticationDetails);continuation.continueTask(); } @OverridepublicvoidgetMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) {// Handle this block, if needed. } @OverridepublicvoidonFailure(Exception e) {// Handle failure. } @OverridepublicvoidauthenticationChallenge(ChallengeContinuation continuation) {/** * For Custom authentication challenge, implement your logic to present challenge to the * user and pass the user's responses to the continuation. */ }};// Call to sign in a user.SecureAuthentication.getInstance().signIn(activityContext, username, password, cognitoUser, authenticationHandler);
// Callback to handle the signIn api call.val authenticationHandler: AuthenticationHandler=object : AuthenticationHandler {overridefunonSuccess(cognitoUserSession: CognitoUserSession, device: CognitoDevice) { Log.d(TAG, "User sign in success.")// Handle success.// This block is also executed when a user is already signed in. }overridefungetAuthenticationDetails( continuation: AuthenticationContinuation, username: String ) {val authenticationDetails =AuthenticationDetails(username, password, validationData) continuation.setAuthenticationDetails(authenticationDetails) continuation.continueTask() }overridefungetMFACode(multiFactorAuthenticationContinuation: MultiFactorAuthenticationContinuation) {// Handle this block, if needed }overridefunonFailure(e: java.lang.Exception) {// Handle failure. }overridefunauthenticationChallenge(continuation: ChallengeContinuation) {/** * For Custom authentication challenge, implement your logic to present challenge to the * user and pass the user's responses to the continuation. */ }}// Call to sign in a user.SecureAuthentication.getInstance().signIn(activityContext, username, password, cognitoUser, authenticationHandler);
Sign out a user
Use SecureAuthentication's signOut method to clear all tokens and logout of Bayun as well, instead of using CognitoUser's method. User will have to go through the authentication process to get tokens.