Validatie, authenticatie en autorisatie
Installeer bcrypt
npm install bcrypt
Installeer cookie-parser
npm install cookie-parser
Installeer express-validator
npm install express-validator
Installeer jsonwebtoken
npm install jsonwebtoken
app.use(cookieParser());
import cookieParser from "cookie-parser";
Validatie, authenticatie en autorisatie
Middleware functions are functions that have access to the request object ( req ), the response object ( res ), and the next function in the application's request-response cycle. The next function is a function in the Express router which, when invoked, executes the middleware succeeding the current middleware.
request
response
body-parser
bodyparser kan o.a. de data die wordt meegegeven vanaf de client omzetten naar json.
Validatie, authenticatie en autorisatie
Validatie is het controleren van een waarde of een methode op geldigheid of juistheid. Meestal wordt deze werkwijze gebruikt bij het versturen van data met behulp van een formulier.
app.post('/register', postRegister);
app.post('/login', postLogin);
app.post('/logout', logout);
request
response
express-
validation
postRegister
register controller
body('email').isEmail()
body('email')
.isEmail()
.withMessage('Onjuist e-mail adres');
body('email')
.notEmpty()
.withMessage('E-mail is een verplicht veld.')
.isEmail()
.withMessage('Onjuist e-mail adres'),
body('email')
.notEmpty()
.withMessage('E-mail is een verplicht veld.')
.bail()
.isEmail()
.withMessage('Onjuist e-mail adres'),
import { body } from 'express-validator';
export default [
body('email')
.notEmpty()
.withMessage('E-mail is een verplicht veld.')
.bail()
.isEmail()
.withMessage('Onjuist e-mail adres'),
body('password')
.isLength({ min: 6 })
.withMessage('Wachtwoord moet bestaan uit minstens zes tekens.'),
]
app.post('/register', ...validationAuthentication, postRegister);
app.post('/login', ...validationAuthentication, postLogin);
export const postRegister = async (req, res, next) => {
try {
const errors = validationResult(req);
// if we have validation errors
if (!errors.isEmpty()) {
console.log("We\'ve got some errors, dude...");
}
} catch(e) {
next(e.message);
}
}
app.post('/register', ...validationAuthentication, postRegister, register);
app.post('/login', ...validationAuthentication, postLogin, login);
// if we have validation errors
if (!errors.isEmpty()) {
// errors on a field
req.formErrorFields = {};
errors.array().forEach(({ msg, param }) => {
req.formErrorFields[param] = msg
});
// we have errors, so re-render the registration page
return next();
}
export const register = async (req, res) => {
// do we have errors?
const formErrors = [];
// input fields
const inputs = [{
name: 'email',
label: 'E-mail',
type: 'text',
value: req.body?.email ? req.body.email : '',
error: req.formErrorFields?.email ? req.formErrorFields['email'] : ''
}, {
name: 'password',
label: 'Password',
type: 'password',
value: req.body?.password ? req.body.password : '',
error: req.formErrorFields?.password ? req.formErrorFields['password'] : ''
}]
// render the register page
res.render('register', {
layout: 'authentication',
inputs,
formErrors,
});
}
[...]
else {
// get the user repository
const userRepository = getConnection().getRepository('User');
// get a user with a specific e-mail address
const user = await userRepository.findOne({ where: { email: req.body.email } });
// validate if the user already exists
if(user) {
req.formErrors = [{ message: "Gebruiker bestaat al." }];
return next();
}
// hash the password
const hashedPassword = bcrypt.hashSync(req.body.password, 12);
// create a new user
await userRepository.save({ email: req.body.email, password: hashedPassword });
// go to login page
res.redirect('/login');
}
[...]
Validatie, authenticatie en autorisatie
Authenticatie is het proces waarbij iemand nagaat of een gebruiker, een andere computer of applicatie daadwerkelijk is wie hij beweert te zijn.
Client
Aanmelden
Server
JWT
// create the webtoken
const token = jwt.sign(
{ userId: user.id, email: user.email },
process.env.TOKEN_SALT,
{ expiresIn: '1h' }
);
// add token to cookie in response
res.cookie('token', token, { httpOnly: true });
// redirect to home page
res.redirect('/');
import jwt from 'jsonwebtoken';
export const jwtAuth = (req, res, next) => {
const token = req.cookies.token;
try {
const user = jwt.verify(token, process.env.TOKEN_SALT);
req.user = user;
next();
} catch(e) {
res.clearCookie('token');
return res.redirect('/login');
}
}
app.get('/', jwtAuth, home);
Validatie, authenticatie en autorisatie
Autorisatie in de informatica is het proces waarmee een gebruiker rechten krijgt op het benaderen van een object. Je krijgt toegang via autorisatie, wat je mag bekijken of aanpassen hangt af van de rollen die de gebruiker kreeg.
In deze oefening breid je je applicatie uit tot een forum achtige landingspagina met slecht één message board. Een gebruiker kan al dan niet berichten toevoegen of verwijderen naargelang de rol die hij/zij/hen heeft verkregen.