codejockie/document-manager

View on GitHub
server/helpers/jwt.js

Summary

Maintainability
A
0 mins
Test Coverage
import bcrypt from 'bcrypt';
import { sign, verify } from 'jsonwebtoken';
import models from '../models';
 
const { User } = models;
const { JWT_SECRET } = process.env;
 
/**
* Finds a user by supplied credentials
* @param {string} email The user's email
* @param {string} password The user's password
* @returns {Promise} resolved/rejected state
*/
export function findByEmailAndPassword(email, password) {
return User.findOne({
where: {
email
}
})
.then((user) => {
if (!user) {
return Promise.reject();
}
 
return bcrypt.compare(password, user.password)
.then((isMatch) => {
if (!isMatch) {
return Promise.reject();
}
return Promise.resolve(user);
})
.catch(() => Promise.reject());
});
}
 
/**
* Finds a user by token
* @param {string} token The user's token stored in the database
* @returns {Promise | Object} resolved/rejected
*/
export function findByToken(token) {
try {
const decoded = verify(token, JWT_SECRET);
return User.findOne({
where: {
email: decoded.email
}
});
} catch (error) {
return Promise.reject(error);
}
}
 
/**
* Generates jsonwebtoken token for authentication
* @param {string} id User's id stored in the database
* @param {string} email User's email stored in the database
* @returns {string} jsonwebtoken token
*/
export function generateAuthToken(id, email) {
return sign({
id,
email
}, JWT_SECRET, { expiresIn: '72 hours' });
}
 
/**
* Verify jsonwebtoken token to check if it is valid
* @param {string} token jsonwebtoken token
* @returns {Object} valid or not valid state
*/
export function verifyToken(token) {
const status = {
error: '',
ok: false
};
 
try {
const decoded = verify(token, JWT_SECRET);
 
if (decoded) {
status.ok = true;
return status;
}
} catch (error) {
const { name } = error;
 
switch (name) {
case 'TokenExpiredError':
status.error = 'Token expired';
return status;
case 'JsonWebTokenError':
status.error = 'Invalid token signature';
return status;
default:
return status;
}
}
}