All files / events OnCheckSession.ts

83.33% Statements 35/42
83.67% Branches 41/49
100% Functions 2/2
83.33% Lines 35/42
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 11011x 11x   11x               11x   26x 26x 26x 3x     26x 26x       26x   26x 26x 26x 26x         26x           26x     26x 2x         2x       24x 1x         1x       23x 23x       4x 4x     19x     19x         3x           3x     16x                     16x         16x     11x  
import { CognitoUser } from 'amazon-cognito-identity-js';
import _ from 'lodash';
import { IAuthenticationResult } from '../types';
import { Auth } from 'aws-amplify';
 
/**
 * Check user authentication state
 * @param cognitoAuthResult optional result of authentication operation.
 * Else `Auth.currentSession()`
 * @returns See {@link IAuthenticationResult}
 */
export const OnCheckSession = async (
  cognitoAuthResult?: CognitoUser | any | undefined
): Promise<IAuthenticationResult> => {
  let session = cognitoAuthResult;
  if (_.isNil(session)) {
    session = await Auth.currentSession();
  }
 
  let user = session instanceof CognitoUser ? session : undefined;
  Iif (_.get(session, 'user') && session.user instanceof CognitoUser) {
    user = session.user;
  }
 
  const isError: boolean = session instanceof Error;
 
  Eif (__DEV__) {
    console.log('**** OnCheckSession ****');
    console.log('isError? ' + isError);
    console.log(session);
  }
 
  let result: IAuthenticationResult;
 
  Iif (_.get(user, 'username') && _.get(session, 'userConfirmed') !== false) {
    result = { state: 'Authenticated', user: session as CognitoUser };
 
    return result;
  }
 
  const challengeName: string = _.get(session, 'challengeName') || '';
 
  // MFA code required
  if (challengeName === 'SMS_MFA' || challengeName === 'SOFTWARE_TOKEN_MFA') {
    result = {
      state: 'ConfirmLoginMFAWaiting',
      error: new Error(_.get(session, 'message') || 'Please enter MFA code'),
    };
 
    return result;
  }
 
  // Need to setup MFA
  if (challengeName === 'MFA_SETUP') {
    result = {
      state: 'MFA_SETUP',
      error: new Error(_.get(session, 'message') || 'Must setup MFA'),
    };
 
    return result;
  }
 
  // Resetting password
  const codeDelivery = _.get(session, ['CodeDeliveryDetails', 'Destination']);
  if (
    challengeName === 'NEW_PASSWORD_REQUIRED' ||
    (!_.isNil(codeDelivery) && !_.isEmpty(codeDelivery))
  ) {
    result = { state: 'NEW_PASSWORD_REQUIRED' };
    return result;
  }
 
  const code = _.get(session, 'code');
 
  // Not confirmed
  if (
    code === 'UserNotConfirmedException' ||
    code === 'CodeMismatchException' ||
    _.get(session, 'userConfirmed') === false
  ) {
    result = {
      state: 'ConfirmAccountCodeWaiting',
      user: (user as CognitoUser) || (session as CognitoUser) || undefined,
      error: new Error(_.get(session, 'message') || 'User not confirmed'),
    };
 
    return result;
  }
 
  Iif (!_.isNil(code) && _.get(session, 'message')) {
    // Other codes
    result = { state: 'Unauthenticated', error: new Error(session.message) };
    console.log(
      '*** Cognito OnCheckSession other code: "' + code + '" result:'
    );
    console.log(result);
 
    return result;
  }
 
  result = {
    state: isError ? 'AuthenticationError' : 'Unauthenticated',
    error: isError ? session : undefined,
  };
 
  return result;
};
 
export default OnCheckSession;