passport.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. // 'sub' used to be the email address
  16. // this check makes sure to invalidate old JWTs where the sub is still the email address
  17. if (typeof payload.sub === "string" || !payload.sub) {
  18. return done(null, false);
  19. }
  20. const user = await query.user.find({ id: payload.sub });
  21. if (!user) return done(null, false);
  22. return done(null, user, payload);
  23. } catch (err) {
  24. return done(err);
  25. }
  26. })
  27. );
  28. const localOptions = {
  29. usernameField: "email"
  30. };
  31. passport.use(
  32. new LocalStrategy(localOptions, async (email, password, done) => {
  33. try {
  34. const user = await query.user.find({ email });
  35. if (!user) {
  36. return done(null, false);
  37. }
  38. const isMatch = await bcrypt.compare(password, user.password);
  39. if (!isMatch) {
  40. return done(null, false);
  41. }
  42. return done(null, user);
  43. } catch (err) {
  44. return done(err);
  45. }
  46. })
  47. );
  48. const localAPIKeyOptions = {
  49. apiKeyField: "apikey",
  50. apiKeyHeader: "x-api-key"
  51. };
  52. passport.use(
  53. new LocalAPIKeyStrategy(localAPIKeyOptions, async (apikey, done) => {
  54. try {
  55. const user = await query.user.find({ apikey });
  56. if (!user) {
  57. return done(null, false);
  58. }
  59. return done(null, user);
  60. } catch (err) {
  61. return done(err);
  62. }
  63. })
  64. );