passport.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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-update').Strategy;
  6. const bcrypt = require('bcryptjs');
  7. const { getUser } = require('./db/user');
  8. const jwtOptions = {
  9. jwtFromRequest: ExtractJwt.fromHeader('authorization'),
  10. secretOrKey: process.env.JWT_SECRET,
  11. };
  12. passport.use(
  13. new JwtStrategy(jwtOptions, async (payload, done) => {
  14. try {
  15. const user = await getUser({ 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 LocalStratergy(localOptions, async (email, password, done) => {
  28. try {
  29. const user = await getUser({ 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 getUser({ 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. );