passport.js 1.6 KB

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