passport.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import passport from 'passport';
  2. import { Strategy as JwtStrategy, ExtractJwt } from 'passport-jwt';
  3. import { Strategy as LocalStratergy } from 'passport-local';
  4. import { Strategy as LocalAPIKeyStrategy } from 'passport-localapikey-update';
  5. import bcrypt from 'bcryptjs';
  6. import { getUser } from './db/user';
  7. const jwtOptions = {
  8. jwtFromRequest: ExtractJwt.fromHeader('authorization'),
  9. secretOrKey: process.env.JWT_SECRET,
  10. };
  11. passport.use(
  12. new JwtStrategy(jwtOptions, async (payload, done) => {
  13. try {
  14. const user = await getUser(payload.sub);
  15. if (!user) return done(null, false);
  16. return done(null, user);
  17. } catch (err) {
  18. return done(err);
  19. }
  20. })
  21. );
  22. const localOptions = {
  23. usernameField: 'email',
  24. };
  25. passport.use(
  26. new LocalStratergy(localOptions, async (email, password, done) => {
  27. try {
  28. const user = await getUser(email);
  29. if (!user) {
  30. return done(null, false);
  31. }
  32. const isMatch = await bcrypt.compare(password, user.password);
  33. if (!isMatch) {
  34. return done(null, false);
  35. }
  36. return done(null, user);
  37. } catch (err) {
  38. return done(err);
  39. }
  40. })
  41. );
  42. const localAPIKeyOptions = {
  43. apiKeyField: 'apikey',
  44. apiKeyHeader: 'x-api-key',
  45. };
  46. passport.use(
  47. new LocalAPIKeyStrategy(localAPIKeyOptions, async (apikey, done) => {
  48. try {
  49. const user = await getUser(apikey);
  50. if (!user) {
  51. return done(null, false);
  52. }
  53. return done(null, user);
  54. } catch (err) {
  55. return done(err);
  56. }
  57. })
  58. );