import passport from 'passport'; import { Strategy as JwtStrategy, ExtractJwt } from 'passport-jwt'; import { Strategy as LocalStratergy } from 'passport-local'; import { Strategy as LocalAPIKeyStrategy } from 'passport-localapikey-update'; import bcrypt from 'bcryptjs'; import { getUser } from './db/user'; const jwtOptions = { jwtFromRequest: ExtractJwt.fromHeader('authorization'), secretOrKey: process.env.JWT_SECRET, }; passport.use( new JwtStrategy(jwtOptions, async (payload, done) => { try { const user = await getUser(payload.sub); if (!user) return done(null, false); return done(null, user); } catch (err) { return done(err); } }) ); const localOptions = { usernameField: 'email', }; passport.use( new LocalStratergy(localOptions, async (email, password, done) => { try { const user = await getUser(email); if (!user) { return done(null, false); } const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) { return done(null, false); } return done(null, user); } catch (err) { return done(err); } }) ); const localAPIKeyOptions = { apiKeyField: 'apikey', apiKeyHeader: 'x-api-key', }; passport.use( new LocalAPIKeyStrategy(localAPIKeyOptions, async (apikey, done) => { try { const user = await getUser(apikey); if (!user) { return done(null, false); } return done(null, user); } catch (err) { return done(err); } }) );