Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return the user's status within AWS's user pool using Amplify with Javascript?

I have some users in my user pool: enter image description here

How can I return the status of that particular user with Amplify? I have this.state.email for the user.

Here is what my handleSubmit function looks like:

  handleSubmit = async event => {
    event.preventDefault();

    this.setState({ isLoading: true });

    try {
      const newUser = await Auth.signUp({
        username: this.state.email,
        password: this.state.password,
      });

      this.setState({ newUser });
    } catch (e) {
      if (e.name === 'UserNotConfirmedException') {
        alert(
          'Looks like your account isn\'t confirmed! ' +
          'Please check your email to find the confirmation code.',
        );

        // await Auth.resendSignUp(this.state.email);

        this.setState({
          newUser: {
            username: this.state.email,
            password: this.state.password,
          },
        });
      } else if (e.name === 'UsernameExistsException') {
        // how to check if unconfirmed?
        if ('not sure what to put here') {
          alert(
            'Looks like your account isn\'t confirmed! ' +
            'Please check your email to find the confirmation code.',
          );
          // bring up confirmation page
        } else {
          alert(
            'Looks like you already have an account! ' +
            'Please log in with your current password.',
          );
          this.props.history.push('/login');
        }
      } else {
        alert(e.message);
      }
    }

    this.setState({ isLoading: false });
  }

Any ideas?

like image 789
Ralph David Abernathy Avatar asked May 17 '18 21:05

Ralph David Abernathy


2 Answers

I'm not sur what do you really want, but if you want to find way to retrieve the information about the status of the user in order to manage a specific workflow, you have to check the challengeName and challengeParam. For instance, when you signIn a new user, the auth.signIn, return a cognito User: if this user is not confirmed the user will have a challengeName and challengeParm attributes than you can verify within your code for example: I create a user from the console with a temporary password so he was in new password required status, from the code I did this to be able to complete the new password workflow

  return fromPromise(Auth.signIn(username, password)).pipe(
   tap(user => {
     console.log('signIn Methode', user)
      if (user.challengeName === 'NEW_PASSWORD_REQUIRED') {
             this.navigate(['/completePassword']);
      }
  }), catchError(..){ }

Here below, you can see the answer that I display from the console.log user with "NEW PASSWORD REQUIRED STATUS"

If the user is confirmed you will not see the challengeName/challangeParm.

hope this will help you.

like image 141
Yassou Avatar answered Oct 16 '22 22:10

Yassou


I did not understand your question completely but I think my explanation will help anyway.

You will get "UsernameExistsException" when you try to Signup the user again.

But, the 'UserNotConfirmedException' is returned when you try to login with this user. Hence this needs to be handled in Sign in.

What you need is something like this.

    handleSubmit = async event => {
    event.preventDefault();

    this.setState({ isLoading: true });

    try {
        const newUser = await Auth.signUp({
            username: this.state.email,
            password: this.state.password, 'attributes': {
                name: this.state.name,
                email: this.state.email
            }
        });
        this.setState({
            newUser
        });
        } catch (e) {
            if(e.name === 'UsernameExistsException') {
                alert("You are already registered. Resending the verification code to " + this.state.email);
                await Auth.resendSignUp(this.state.email);
                this.state.resent = true;
            } else {
                alert(e.message);
            }
        }

    this.setState({ isLoading: false });
}
like image 37
Shanaka Avatar answered Oct 16 '22 20:10

Shanaka