54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
const { sign, verify } = require("jsonwebtoken");
|
|
const { compare, hash, genSalt } = require("bcryptjs");
|
|
const { NotAuthError } = require("./errors");
|
|
|
|
const KEY = "supersecret";
|
|
|
|
async function generatePasswordHash(password) {
|
|
const password_hash = await hash(password, await genSalt(10));
|
|
return password_hash;
|
|
}
|
|
|
|
function createJSONToken(email) {
|
|
return sign({ email }, KEY, { expiresIn: "1h" });
|
|
}
|
|
|
|
function validateJSONToken(token) {
|
|
return verify(token, KEY);
|
|
}
|
|
|
|
function isValidPassword(password, storedPassword) {
|
|
return compare(password, storedPassword);
|
|
}
|
|
|
|
function checkAuthMiddleware(req, res, next) {
|
|
if (req.method === "OPTIONS") {
|
|
return next();
|
|
}
|
|
if (!req.headers.authorization) {
|
|
console.log("NOT AUTH. AUTH HEADER MISSING.");
|
|
return next(new NotAuthError("Not authenticated."));
|
|
}
|
|
const authFragments = req.headers.authorization.split(" ");
|
|
|
|
if (authFragments.length !== 2) {
|
|
console.log("NOT AUTH. AUTH HEADER INVALID.");
|
|
return next(new NotAuthError("Not authenticated."));
|
|
}
|
|
const authToken = authFragments[1];
|
|
try {
|
|
const validatedToken = validateJSONToken(authToken);
|
|
req.userid = validatedToken;
|
|
} catch (error) {
|
|
console.log("NOT AUTH. TOKEN INVALID.");
|
|
return next(new NotAuthError("Not authenticated."));
|
|
}
|
|
next();
|
|
}
|
|
|
|
exports.createJSONToken = createJSONToken;
|
|
exports.validateJSONToken = validateJSONToken;
|
|
exports.isValidPassword = isValidPassword;
|
|
exports.checkAuth = checkAuthMiddleware;
|
|
exports.generatePasswordHash = generatePasswordHash;
|