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. );