2024-08-11 18:41:03 +03:30
|
|
|
const { Strategy: LocalAPIKeyStrategy } = require("passport-localapikey-update");
|
|
|
|
const { Strategy: JwtStrategy, ExtractJwt } = require("passport-jwt");
|
|
|
|
const { Strategy: LocalStrategy } = require("passport-local");
|
|
|
|
const passport = require("passport");
|
|
|
|
const bcrypt = require("bcryptjs");
|
2019-10-08 21:56:03 +03:30
|
|
|
|
2024-08-11 18:41:03 +03:30
|
|
|
const query = require("./queries");
|
|
|
|
const env = require("./env");
|
2018-02-13 16:04:29 +03:30
|
|
|
|
|
|
|
const jwtOptions = {
|
2024-08-21 21:22:59 +03:30
|
|
|
jwtFromRequest: req => req.cookies?.token,
|
2020-01-30 18:51:52 +03:30
|
|
|
secretOrKey: env.JWT_SECRET
|
2018-02-13 16:04:29 +03:30
|
|
|
};
|
|
|
|
|
|
|
|
passport.use(
|
|
|
|
new JwtStrategy(jwtOptions, async (payload, done) => {
|
|
|
|
try {
|
2024-12-28 11:11:29 +03:30
|
|
|
// 'sub' used to be the email address
|
|
|
|
// this check makes sure to invalidate old JWTs where the sub is still the email address
|
2025-01-04 13:25:09 +03:30
|
|
|
if (typeof payload.sub === "string" || !payload.sub) {
|
2024-12-28 11:11:29 +03:30
|
|
|
return done(null, false);
|
|
|
|
}
|
|
|
|
const user = await query.user.find({ id: payload.sub });
|
2018-02-13 16:04:29 +03:30
|
|
|
if (!user) return done(null, false);
|
2024-09-12 17:38:00 +03:30
|
|
|
return done(null, user, payload);
|
2018-02-13 16:04:29 +03:30
|
|
|
} catch (err) {
|
|
|
|
return done(err);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
const localOptions = {
|
2019-10-08 21:56:03 +03:30
|
|
|
usernameField: "email"
|
2018-02-13 16:04:29 +03:30
|
|
|
};
|
|
|
|
|
|
|
|
passport.use(
|
2022-05-30 23:43:01 -04:00
|
|
|
new LocalStrategy(localOptions, async (email, password, done) => {
|
2018-02-13 16:04:29 +03:30
|
|
|
try {
|
2020-01-30 18:51:52 +03:30
|
|
|
const user = await query.user.find({ email });
|
2018-02-13 16:04:29 +03:30
|
|
|
if (!user) {
|
|
|
|
return done(null, false);
|
|
|
|
}
|
|
|
|
const isMatch = await bcrypt.compare(password, user.password);
|
|
|
|
if (!isMatch) {
|
|
|
|
return done(null, false);
|
|
|
|
}
|
|
|
|
return done(null, user);
|
|
|
|
} catch (err) {
|
|
|
|
return done(err);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
2018-03-04 09:19:05 +08:00
|
|
|
const localAPIKeyOptions = {
|
2019-10-08 21:56:03 +03:30
|
|
|
apiKeyField: "apikey",
|
|
|
|
apiKeyHeader: "x-api-key"
|
2018-03-04 09:19:05 +08:00
|
|
|
};
|
|
|
|
|
2018-02-13 16:04:29 +03:30
|
|
|
passport.use(
|
2018-03-04 09:19:05 +08:00
|
|
|
new LocalAPIKeyStrategy(localAPIKeyOptions, async (apikey, done) => {
|
2018-02-13 16:04:29 +03:30
|
|
|
try {
|
2020-01-30 18:51:52 +03:30
|
|
|
const user = await query.user.find({ apikey });
|
2018-02-13 16:04:29 +03:30
|
|
|
if (!user) {
|
|
|
|
return done(null, false);
|
|
|
|
}
|
|
|
|
return done(null, user);
|
|
|
|
} catch (err) {
|
|
|
|
return done(err);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|