embedder/app/routes/auth.ts
2023-11-18 12:53:15 -05:00

85 lines
1.8 KiB
TypeScript

import crypto from "crypto";
import express from "express";
import passport from "passport";
import { Strategy as LocalStrategy } from "passport-local";
import { User } from "../lib/lib";
import { db, UserRow } from "../lib/db";
const router = express.Router();
passport.use(
new LocalStrategy(function verify(username, password, cb) {
db.get(
"SELECT * FROM users WHERE username = ?",
[username],
function (err: Error, row: UserRow) {
if (err) {
return cb(err);
}
if (!row) {
return cb(null, false, {
message: "Incorrect username or password.",
});
}
crypto.pbkdf2(
password,
row.salt,
310000,
32,
"sha256",
function (err, hashedPassword) {
if (err) {
return cb(err);
}
if (!crypto.timingSafeEqual(row.hashed_password, hashedPassword)) {
return cb(null, false, {
message: "Incorrect username or password.",
});
}
return cb(null, row);
},
);
},
);
}),
);
passport.serializeUser(function (user: User, cb) {
process.nextTick(function () {
cb(null, {
id: user.id,
username: user.username,
});
});
});
passport.deserializeUser(function (user: User, cb) {
process.nextTick(function () {
return cb(null, user);
});
});
router.get("/login", function (req, res) {
res.render("login");
});
router.post(
"/login/password",
passport.authenticate("local", {
successRedirect: "/",
failureRedirect: "/login",
}),
);
router.post("/logout", function (req, res, next) {
req.logout(function (err) {
if (err) {
return next(err);
}
res.redirect("/");
});
});
export default router;