React + AWS Cognito: Email Authentication Setup Guide (Second Part)

React + AWS Cognito: Email Authentication Setup Guide (Second Part)

In the last post, we handled everything on the AWS side; now let's dive into React to set up our code.

AWS provides the npm package @aws-sdk/client-cognito-identity-provider, which includes functions for:

  • Creating an account using an email and password
  • Verifying the email via a code sent by AWS
  • Logging in with the email and password


AWS Steps
Check out the demo page to try it yourself, and feel free to look at the code in the GitHub repository.

Sign up

The first step is signing up

import { SignUpCommand } from "@aws-sdk/client-cognito-identity-provider";

const AWS_CLIENT_ID = "REPLACE_WITH_YOUR_AWS_CLIENT_ID";

export const signUp = async (email: string, password: string) => {
  const params = {
    ClientId: AWS_CLIENT_ID,
    Username: email,
    Password: password,
    UserAttributes: [
      {
        Name: "email",
        Value: email,
      },
    ],
  };

  const command = new SignUpCommand(params);

  try {
    await cognitoClient.send(command);
  } catch (error) {
    throw error;
  }
};        

Note how AWS_CLIENT_ID is required, and this helper function takes in email and password. In the demo, both values are input by the user in a form, and the UI then calls this method, passing those values.

If there’s an error, an exception is thrown, and the UI handles it accordingly.

Confirmation

Note: During testing, any email used in the form must first be verified. This won’t be necessary in production.

When SignUpCommand runs, AWS registers the account and sends a verification code by email, so the next step is to check the inbox and copy the code.

import { ConfirmSignUpCommand } from "@aws-sdk/client-cognito-identity-provider";

const AWS_CLIENT_ID = "REPLACE_WITH_YOUR_AWS_CLIENT_ID";

export const confirmSignUp = async (username: string, code: string) => {
  const params = {
    ClientId: AWS_CLIENT_ID,
    Username: username,
    ConfirmationCode: code,
  };

  const command = new ConfirmSignUpCommand(params);
  try {
    await cognitoClient.send(command);
  } catch (error) {
    throw error;
  }
};        

Notice that ConfirmSignUpCommand requires your AWS ClientId, username (email), and the confirmation code that was sent to the email.

Sign In

If ConfirmSignUpCommand completes successfully, the account should be all set for logging in.

import { SignUpCommand } from "@aws-sdk/client-cognito-identity-provider";

const AWS_CLIENT_ID = "REPLACE_WITH_YOUR_AWS_CLIENT_ID";

export const signIn = async (username: string, password: string) => {
  const params = {
    AuthFlow: AuthFlowType.USER_PASSWORD_AUTH,
    ClientId: AWS_CLIENT_ID,
    AuthParameters: {
      USERNAME: username,
      PASSWORD: password,
    },
  };
  const command = new InitiateAuthCommand(params);

  let AuthenticationResult;
  try {
    const response = await cognitoClient.send(command);
    AuthenticationResult = response.AuthenticationResult;
  } catch (error) {
    throw error;
  }

  if (!AuthenticationResult) {
    return;
  }

  sessionStorage.setItem("idToken", AuthenticationResult.IdToken || "");
  sessionStorage.setItem("accessToken", AuthenticationResult.AccessToken || "");
  sessionStorage.setItem(
    "refreshToken",
    AuthenticationResult.RefreshToken || ""
  );

  return AuthenticationResult;
};        

In the InitiateAuthCommand, AWS requires the ClientId, username (email), and password provided by the user through the form. If the email has already been verified, the login will succeed.

Additionally, some values are stored in sessionStorage for potential future use.

Conclusion

Check out the demo and explore the code base.

Cognito is relatively easy to set up yet powerful. It handles essentials like creating, verifying, and authenticating accounts. While building your own service for this is possible, it demands significant effort for proper implementation and maintenance.

When starting a project, cloud services offer the advantage of offloading these responsibilities so you can focus on your core business logic, even if it introduces some dependency.


要查看或添加评论,请登录

Jaime Garcia Diaz的更多文章

  • How to Set Up a Node.js Web Server on Raspberry Pi

    How to Set Up a Node.js Web Server on Raspberry Pi

    A couple of years ago, I bought a Raspberry Pi Model B+, and I finally decided to set up a web server on it. Raspberry…

  • React 19: New API use(promise)

    React 19: New API use(promise)

    In this post, I’ll demo how to read a value from a promise using use. Links Demo Codebase Snippet Let’s check out the…

    1 条评论
  • Web Development: Three Predictions for 2025

    Web Development: Three Predictions for 2025

    In my last post, I shared three things I learned during 2024. In this post, I’ll try to predict three things for 2025.

  • Programming: Three Lessons Learned in 2024

    Programming: Three Lessons Learned in 2024

    Three lessons I’ve learned this year: 1. AI: Use it or see ya later It’s no surprise that is everywhere, but this year…

  • React 19: Server Functions

    React 19: Server Functions

    Server Functions are functions referenced on the client but executed on the server. Here’s an example: Check my earlier…

  • React 19: New hook useActionState

    React 19: New hook useActionState

    Usually, when working with a form, you’d want to: a) Display a loader b) Show validation errors This often means…

  • Javascript: Implementing Passwordless Login with Salesforce

    Javascript: Implementing Passwordless Login with Salesforce

    Salesforce offers a Headless Passwordless Login Flow that allows registered users to access an application seamlessly…

  • React: Implementing Passwordless Login with AWS Cognito

    React: Implementing Passwordless Login with AWS Cognito

    Passwords are easy to forget, and users often reuse the same password for everything. On the other hand, almost…

  • React: ReCAPTCHA v3 Client and Server Demo

    React: ReCAPTCHA v3 Client and Server Demo

    In this demo, I’ll use Google ReCAPTCHA v3 credentials within a React application built on Next.js.

  • React: LinkedIn Access Token in 10 Steps

    React: LinkedIn Access Token in 10 Steps

    I recently integrated with the LinkedIn API, and it turned out to be pretty straightforward. The task was to retrieve…