React Authentication - LOGIN
Tags: react, auth, login, tutorial
Published: 2021-01-28 13:11:40

> This tutorial is a continuation from my [last article](https://dev.to/ebereplenty/react-authentication-part-1-39aj). We are still learning how to build an authentication system with react. Check out [this article](https://dev.to/ebereplenty/react-authentication-part-1-39aj) to bring you up to speed.

If you want to follow this tutorial step by step, please get the starter code from last article [here](https://github.com/EBEREGIT/react-auth/tree/register)

## Login
Now we turn attention to the ``Login.js`` file. If you are coming from the last article, most of the following steps will be familiar.

* Set initial states for ``email``, ``password`` and ``login``

```javascript

  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const [login, setLogin] = useState(false);

```

* Set a ``name`` and ``value`` attribute for the ``email`` and ``password`` input fields. This is mine:

```javascript

{/* email */}
        <Form.Group controlId="formBasicEmail">
          <Form.Label>Email address</Form.Label>
          <Form.Control
            type="email"
            name="email"
            value={email}
            placeholder="Enter email"
          />
        </Form.Group>

        {/* password */}
        <Form.Group controlId="formBasicPassword">
          <Form.Label>Password</Form.Label>
          <Form.Control
            type="password"
            name="password"
            value={password}
            placeholder="Password"
          />
        </Form.Group>

```
*At this point, you will notice that you can no longer type into the ``Login`` Form fields. This is because we have not set the field to update from the previous state to the current state. Let's do that*

* Add ``onChange={(e) => setEmail(e.target.value)}``
and ``onChange={(e) => setPassword(e.target.value)}`` to the ``email`` and ``password`` input fields respectively. This is mine:

```javascript

       {/* email */}
        <Form.Group controlId="formBasicEmail">
          <Form.Label>Email address</Form.Label>
          <Form.Control
            type="email"
            name="email"
            value={email}
            onChange={(e) => setEmail(e.target.value)}
            placeholder="Enter email"
          />
        </Form.Group>

        {/* password */}
        <Form.Group controlId="formBasicPassword">
          <Form.Label>Password</Form.Label>
          <Form.Control
            type="password"
            name="password"
            value={password}
            onChange={(e) => setPassword(e.target.value)}
            placeholder="Password"
          />
        </Form.Group>

```
*Now you can type into the form fields because it is now updating the state to the content you type in*

* Add ``onSubmit={(e)=>handleSubmit(e)}`` and ``onClick={(e)=>handleSubmit(e)}`` to the ``form`` and ``button`` element respectively. **The ``onSubmit`` enables form submission using the ``Enter`` key while the ``onClick`` enables form submission by clicking the button**. Now the form looks like this:

```javascript

      <Form onSubmit={(e)=>handleSubmit(e)}>
        {/* email */}
        <Form.Group controlId="formBasicEmail">
          <Form.Label>Email address</Form.Label>
          <Form.Control
            type="email"
            name="email"
            value={email}
            onChange={(e) => setEmail(e.target.value)}
            placeholder="Enter email"
          />
        </Form.Group>

        {/* password */}
        <Form.Group controlId="formBasicPassword">
          <Form.Label>Password</Form.Label>
          <Form.Control
            type="password"
            name="password"
            value={password}
            onChange={(e) => setPassword(e.target.value)}
            placeholder="Password"
          />
        </Form.Group>

        {/* submit button */}
        <Button
          variant="primary"
          type="submit"
          onClick={(e) => handleSubmit(e)}
        >
          Login
        </Button>
      </Form>

```
* To test if this is working, create the following function just before the ``return`` line

```javascript

const handleSubmit = (e) => {
    // prevent the form from refreshing the whole page
    e.preventDefault();
    // make a popup alert showing the "submitted" text
    alert("Submited");
  }

```

*If you click the button or hit the Enter Key, this should be your result:*

![Testing the handleSubmit function](https://dev-to-uploads.s3.amazonaws.com/i/zryimfq0tsf20umz70oj.JPG)

## Building out the handleSubmit function
* Now remove the ``alert`` statement from the handleSubmit function

* Install Axios if you are not coming from the [previous article](https://dev.to/ebereplenty/react-authentication-part-1-39aj). *We will be using axios to call the API or connect the frontend to the backend as the case maybe*. 

```javascript

npm i axios

```

* Import axios at the top of the file like so:

```javascript

import axios from "axios";

```

* In the handleSubmit function, let's build out the configuration needed for axios to successfully connect our frontend to the backend. 

```javascript

// set configurations
    const configuration = {
      method: "post",
      url: "https://nodejs-mongodb-auth-app.herokuapp.com/login",
      data: {
        email,
        password,
      },
    };

```

**The ``method`` tells how our data will be processed, ``url`` is the endpoint through which the API function will be accessed and ``data`` contains all the input or ``request body`` that the backend is expecting. Hopefully that is clear enough.**

* Having the configurations setup, let's now make the call. The API call is just a one-line statement. Here:

```javascript

axios(configuration)

```
*With that, the API call has been completed. However, we need to be sure if it actually succeeded or not. And maybe show the result to our users. So to fix that, we will use a then...catch... block*

* Now we have this:

```javascript

    // make the API call
    axios(configuration)
    .then((result) => {console.log(result);})
    .catch((error) => {console.log(error);})

```

*We are logging to the console just for testing purposes*

* Now try logging in a new user and check the console for the result. Mine was successful. See below:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/82z97iv2ym4z9sbng7ib.JPG)

*Of course we will not direct our users to the console to check for the result of their login attempt. So let's find a way to communicate to the user*

* Replace the code with the following code:

```javascript

    // make the API call
    axios(configuration)
      .then((result) => {
        setLogin(true);
      })
      .catch((error) => {
        error = new Error();
      });

```
*By setting ``login`` to ``true``, we can now tell when the login process is completed. So let's tell the user*

* Add the following code in the ``Form`` element

```javascript

      {/* display success message */}
        {login ? (
          <p className="text-success">You Are Logged in Successfully</p>
        ) : (
          <p className="text-danger">You Are Not Logged in</p>
        )}

```
*The code is a conditional statement to display success message when the ``login`` is ``true``. Now let's give it a try*

This is mine:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ujiildu7dqscevjhai3z.gif)

If you are getting same result as mine, then you did it!!!

You are awesome

### Conclusion
We began this tutorial from where we left off [last time](https://dev.to/ebereplenty/react-authentication-part-1-39aj). We have see how to log in a user that we have registered already.

[All codes are here](https://github.com/EBEREGIT/react-auth/tree/login)

Next, we will look at [how to extract our login token and use it to access endpoints or routes that are protected](https://dev.to/ebereplenty/react-authentication-protecting-and-accessing-routes-endpoints-96h).

Just stick around