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

58 lines
1.7 KiB
JavaScript
Raw Normal View History

const jwt = require("jsonwebtoken")
2021-04-08 02:15:05 +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 = {
userId: dbUser._id,
builder: dbUser.builder,
}
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)
}
}