passport.js 1.6 KB

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