1
0
Fork 0
mirror of synced 2024-07-09 08:16:34 +12:00
budibase/packages/auth/src/middleware/local.js

57 lines
1.6 KiB
JavaScript
Raw Normal View History

const jwt = require("jsonwebtoken")
2021-04-07 22:33:16 +12:00
const { UserStatus } = require("../constants")
const CouchDB = require("../db")
const { StaticDatabases, generateUserID } = require("../db/utils")
const { compare } = require("../hashing")
const INVALID_ERR = "Invalid Credentials"
exports.options = {}
/**
* Passport Local Authentication Middleware.
* @param {*} username - username to login with
* @param {*} password - plain text password to log in with
* @param {*} done - callback from passport to return user information and errors
* @returns The authenticated user, or errors if they occur
*/
exports.authenticate = async function(username, password, done) {
if (!username) return done(null, false, "Email Required.")
if (!password) return done(null, false, "Password Required.")
// Check the user exists in the instance DB by email
const db = new CouchDB(StaticDatabases.USER.name)
let dbUser
try {
dbUser = await db.get(generateUserID(username))
2021-04-07 22:33:16 +12:00
} catch (err) {
console.error("User not found", err)
return done(null, false, { message: "User not found" })
}
// check that the user is currently inactive, if this is the case throw invalid
if (dbUser.status === UserStatus.INACTIVE) {
return done(null, false, { message: INVALID_ERR })
}
// authenticate
if (await compare(password, dbUser.password)) {
const payload = {
2021-04-07 22:33:16 +12:00
_id: dbUser._id,
}
2021-04-07 22:33:16 +12:00
const token = jwt.sign(payload, process.env.JWT_SECRET, {
expiresIn: "1 day",
})
dbUser.token = token
2021-04-07 22:33:16 +12:00
// Remove users password in payload
delete dbUser.password
2021-04-07 22:33:16 +12:00
return done(null, dbUser)
} else {
done(new Error(INVALID_ERR), false)
}
}