translate to sqlite3 userdb (working)

This commit is contained in:
andrzej 2024-05-29 19:22:58 +02:00
parent ce215a4efb
commit d867ecf5b1
7 changed files with 41 additions and 12 deletions

View File

@ -1,18 +1,24 @@
import passport from 'passport' import passport from 'passport'
import { Strategy as localStrategy } from 'passport-local' import { Strategy as localStrategy } from 'passport-local'
import { User, UserModel } from '../model/model.mjs' import { User, UserModel, encryptPwd, pwdIsValid } from '../model/model.mjs'
import { Strategy as JWTstrategy, ExtractJwt } from 'passport-jwt' import { Strategy as JWTstrategy, ExtractJwt } from 'passport-jwt'
import { userDb } from '../db.mjs'
passport.use('signup', new localStrategy( passport.use('signup', new localStrategy(
{ {
usernameField: 'email', usernameField: 'username',
passwordField: 'password' passwordField: 'password'
}, },
async (email, password, done) => { async (username, password, done) => {
console.log("signup auth strategy has begun")
try { try {
const user = await UserModel.create({ email, password }) // const user = await UserModel.create({ email, password })
const encryptedPwd = await encryptPwd(password)
const user = await userDb("users").insert({ username: username, password: encryptedPwd }).returning(["username", "password"])
console.log(`user: ${user}`)
return done(null, user) return done(null, user)
} catch (err) { } catch (err) {
console.error(err)
done(err) done(err)
} }
})) }))
@ -20,20 +26,23 @@ passport.use('signup', new localStrategy(
passport.use('login', passport.use('login',
new localStrategy( new localStrategy(
{ {
usernameField: "email", usernameField: "username",
passwordField: "password", passwordField: "password",
session: false session: false
}, },
async (email, password, done) => { async (email, password, done) => {
console.log("local strategy called") console.log("local strategy called")
try { try {
const user: User = await UserModel.findOne({ email }) // const user: User = await UserModel.findOne({ email })
let returnedUser: Array<User> = await userDb("users").select("username", "password").where({ username: email })
const user: User = returnedUser[0]
console.log(`user: ${user}`) console.log(`user: ${user}`)
if (!user) { if (!user || returnedUser.length === 0) {
return done(null, false, { message: "user not found" }) return done(null, false, { message: "user not found" })
} }
const validate: boolean = await user.isValidPassword(password) // const validate: boolean = await user.isValidPassword(password)
const validate: boolean = await pwdIsValid(password, user)
console.log(`isValidPassword? ${validate}`) console.log(`isValidPassword? ${validate}`)
if (!validate) { if (!validate) {

7
db.mts
View File

@ -16,6 +16,13 @@ export const testDb = knex({
useNullAsDefault: true useNullAsDefault: true
}) })
export const userDb = knex({
client: "sqlite3",
connection: {
filename: "./users"
},
useNullAsDefault: true
})

View File

@ -2,8 +2,7 @@ import express from "express"
import mongoose from "mongoose" import mongoose from "mongoose"
import passport from "passport" import passport from "passport"
import bodyParser from "body-parser" import bodyParser from "body-parser"
import { db } from "./db.mjs"
import { UserModel } from "./model/model.mjs"
import { default as routes } from "./routes/routes.mjs" import { default as routes } from "./routes/routes.mjs"
import { default as secureRoute } from "./routes/secure-routes.mjs" import { default as secureRoute } from "./routes/secure-routes.mjs"
import "./auth/auth.mjs" import "./auth/auth.mjs"

View File

@ -37,5 +37,17 @@ export interface User {
export const UserModel = mongoose.model("user", UserSchema) export const UserModel = mongoose.model("user", UserSchema)
export interface User {
username: string;
password: string;
}
export async function encryptPwd(pwd: string) {
return Promise.resolve(bcrypt.hash(pwd, 10))
}
export async function pwdIsValid(pwd: string, user: User): Promise<boolean> {
return Promise.resolve(bcrypt.compare(pwd, user.password))
}

View File

@ -20,6 +20,7 @@
"typescript": "^5.4.5" "typescript": "^5.4.5"
}, },
"dependencies": { "dependencies": {
"@types/knex": "^0.16.1",
"bcrypt": "^5.1.1", "bcrypt": "^5.1.1",
"body-parser": "^1.20.2", "body-parser": "^1.20.2",
"express": "^4.19.2", "express": "^4.19.2",
@ -28,6 +29,7 @@
"mongoose": "^8.4.0", "mongoose": "^8.4.0",
"passport": "^0.7.0", "passport": "^0.7.0",
"passport-jwt": "^4.0.1", "passport-jwt": "^4.0.1",
"passport-local": "^1.0.0" "passport-local": "^1.0.0",
"sqlite3": "^5.1.7"
} }
} }

View File

@ -32,7 +32,7 @@ router.post(
async (error) => { async (error) => {
if (error) return next(error); if (error) return next(error);
const body = { _id: user._id, email: user.email }; const body = { _id: user._id, username: user.username };
const token = jwt.sign({ user: body }, 'TOP_SECRET', { expiresIn: "20m" }); const token = jwt.sign({ user: body }, 'TOP_SECRET', { expiresIn: "20m" });
return res.json({ token }); return res.json({ token });

Binary file not shown.