With the Nuxt Auth module, we can add authentication to our Nuxt app with ease.
In this article, we’ll look at how to add authentication to our Nuxt app with Express and the Nuxt Auth module.
Getting Started
We’ve to add the Axios and Nuxt Auth modules.
Nuxt Auth uses Axios for sending requests.
To install it, we run:
yarn add @nuxtjs/auth @nuxtjs/axios
or:
npm install @nuxtjs/auth @nuxtjs/axios
Then in nuxt.config.js
, we add:
const baseURL = "https://ReasonableRecursiveSupercollider--five-nine.repl.co";
export default {
mode: 'universal',
target: 'server',
head: {
title: process.env.npm_package_name || '',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: process.env.npm_package_description || '' }
],
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
},
css: [
],
plugins: [
],
components: true,
buildModules: [
],
modules: [
'@nuxtjs/axios',
'@nuxtjs/auth'
],
axios: {
baseURL
},
build: {
}
}
We add the baseURL
to the axios
property to set the base URL of our requests.
Also, we add the '@nuxtjs/auth'
module to the modules
array to add the module.
In the store
folder, we’ve to add index.js
to use the Nuxt auth module.
Back End
We use Express as the back end for our app.
To create it, we install Express with some packages by running:
npm i express body-parser cors
in a project folder.
Then we create index.js
in the same folder and add:
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors')
const app = express();
app.use(cors())
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/api/auth/login', (req, res) => {
res.json({});
});
app.post('/api/auth/logout', (req, res) => {
res.json({});
});
app.get('/api/auth/user', (req, res) => {
res.json({});
});
app.listen(3000, () => console.log('server started'));
We need the cors
middleware to accept cross-domain requests.
The routes are the endpoints we send our auth requests to.
We should add logic to check for users in real-world applications.
Front End
In our Nuxt app, we add a login.vue
component and add:
<template>
<div class="container">
<form @submit.prevent="userLogin">
<div>
<label>Username</label>
<input type="text" v-model="login.username" />
</div>
<div>
<label>Password</label>
<input type="text" v-model="login.password" />
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
</div>
</template>
<script>
export default {
middleware: "auth",
data() {
return {
login: {},
};
},
auth: {
strategies: {
local: {
endpoints: {
login: {
url: `/api/auth/login`,
method: "post",
propertyName: "token",
},
logout: { url: `/api/auth/logout`, method: "post" },
user: {
url: `/api/auth/user`,
method: "get",
propertyName: "user",
},
},
},
},
},
methods: {
async userLogin() {
try {
let response = await this.$auth.loginWith("local", {
data: this.login,
});
console.log(response);
} catch (err) {
console.log(err);
}
},
},
};
</script>
It has a login form that takes the username and password.
In the component options, we enable the auth
middleware with the middleware: 'auth'
property.
Then we set the auth options by adding the auth.strategies.local
property to add the endpoints, we’ll make requests to.
login
is used by the this.$auth.loginWith
method to make requests.
auth.strategies.local
optionally takes the tokenRequired
and tokenType
properties.
tokenRequired: false
disables all token handling.
tokenType
is the authorization header name to be used in Axios requests.
this.$auth.loginWith
takes the strategy as the first argument and the data as the 2nd argument with the data
property.
So when we submit the form, the userLogin
method is called and the request to https://ReasonableRecursiveSupercollider--five-nine.repl.co/api/auth/login
is made with the username and password in the request payload.
Conclusion
We can add a login form with the Nuxt and use the auth module to make the requests.