Node.js Basics — Add 3rd Party Authentication to an Express App with Auth0
Tags: node, webdev, programming, javascript
Published: 2021-01-22 21:32:43

**Check out my books on Amazon at https://www.amazon.com/John-Au-Yeung/e/B08FT5NT62**

**Subscribe to my email list now at http://jauyeung.net/subscribe/**


Node.js is a popular runtime platform to create programs that run on it.

It lets us run JavaScript outside the browser.

In this article, we’ll look at how to start using Node.js to create programs.

### Set Up Our App in Auth0

Before we write our app, we have to set up our Node app in Auth0.

To create our app in Auth0, we log into Auth0, then we go to [https://manage.auth0.com/dashboard/us/dev-v7h077zn/applications](https://manage.auth0.com/dashboard/us/dev-v7h077zn/applications) to go to the Applications page.

Then we click Create Application to create a new application.

Once we did that, we click on Regular Web App, then click Create.

Then we click on Node.js to create our app.

### Create the Express App

Once we created our Express app, we can write the following to create our app:

```
const express = require('express');
const bodyParser = require('body-parser');
const { auth } = require('express-openid-connect');
const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

const config = {
    authRequired: false,
    auth0Logout: true,
    secret: 'a long, randomly-generated string stored in env',
    baseURL: 'http://localhost:3000',
    clientID: 'client id',
    issuerBaseURL: 'https://<domain>.us.auth0.com'
};

// auth router attaches /login, /logout, and /callback routes to the baseURL
app.use(auth(config));

// req.isAuthenticated is provided from the auth router
app.get('/', (req, res) => {
    res.send(req.oidc.isAuthenticated() ? 'Logged in' : 'Logged out');
});

app.listen(3000, () => console.log('server started'));
```

We install the `express-openid-connect` package to let us add authentication with Open ID.

To install it, we run:

```
npm i express-openid-connect
```

to install the package.

We call the `app.use(auth(config));` to add the routes for login, logout, and the callback route that’s called after authentication succeeds.

Then we can go to the `/` route and see if we’re authenticated or not.

We check if we’re authenticated by calling the `req.oidc.isAuthenticated()` method.

The `config` object has the `clientID`, `issuerBaseURL`, `baseURL`, and the `secret` properties.

We can get all them all from the app’s page in our Auth0 account.

`issuerBaseURL` is the domain that our app is hosted on.

Now when we go to `http://localhost:3000/login` , we should be able to log in with a Google account.

### Getting Logged in User’s Data

To get the data of the currently logged in user, we can write:

```
const express = require('express');
const bodyParser = require('body-parser');
const { auth, requiresAuth } = require('express-openid-connect');
const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

const config = {
    authRequired: false,
    auth0Logout: true,
    secret: 'a long, randomly-generated string stored in env',
    baseURL: 'http://localhost:3000',
    clientID: 'client id',
    issuerBaseURL: 'https://<domain>.us.auth0.com'
};

// auth router attaches /login, /logout, and /callback routes to the baseURL
app.use(auth(config));

// req.isAuthenticated is provided from the auth router
app.get('/', (req, res) => {
    res.send(req.oidc.isAuthenticated() ? 'Logged in' : 'Logged out');
});

app.get('/profile', requiresAuth(), (req, res) => {
    res.send(JSON.stringify(req.oidc.user));
});

app.listen(3000, () => console.log('server started'));
```

We add the `/profile` route with the middleware returned by the `requiresAuth` function to make it available only to authenticated users.

Then the `req.oidc.user` property has the user data.

Once we logged into the Google account, we should see the data from the `/profile` route.

### Conclusion

We can add 3rd party auth into our Express app easily with Auth0.