@fdm-monster/server
Version:
FDM Monster is a bulk OctoPrint, Klipper, PrusaLink and BambuLab manager to set up, configure and monitor 3D printers. Our aim is to provide neat overview over your farm.
48 lines (47 loc) • 2.39 kB
JavaScript
import { DITokens } from "../container.tokens.js";
import { AuthenticationError } from "../exceptions/runtime.exceptions.js";
import { AppConstants } from "../server.constants.js";
import { AUTH_ERROR_REASON } from "../constants/authorization.constants.js";
import { ApiKeyStrategy } from "./api-key.strategy.js";
import { ExtractJwt, Strategy } from "passport-jwt";
import { Strategy as Strategy$1 } from "passport-anonymous";
//#region src/middleware/passport.ts
function getPassportJwtOptions(settingsStore, configService, jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken()) {
return {
jwtFromRequest,
secretOrKeyProvider: async (_req, _token, done) => {
const { jwtSecret } = await settingsStore.getCredentialSettings();
return done(null, jwtSecret);
},
audience: configService.get(AppConstants.OVERRIDE_JWT_AUDIENCE, AppConstants.DEFAULT_JWT_AUDIENCE),
issuer: configService.get(AppConstants.OVERRIDE_JWT_ISSUER, AppConstants.DEFAULT_JWT_ISSUER)
};
}
function verifyUserCallback(userService) {
return function(jwt_payload, done) {
userService.getUser(jwt_payload.userId).then((user) => {
if (user?.isVerified && !user.needsPasswordChange) return done(null, userService.toDto(user));
if (user?.needsPasswordChange) return done(new AuthenticationError("Password change required", AUTH_ERROR_REASON.PasswordChangeRequired), false);
if (!user?.isVerified) return done(new AuthenticationError("User not verified", AUTH_ERROR_REASON.AccountNotVerified), false);
return done(null, false);
}).catch((err) => {
if (err) return done(err, false);
});
};
}
function initializePassportStrategies(passport, container) {
const settingsStore = container.resolve(DITokens.settingsStore);
const configService = container.resolve(DITokens.configService);
const userService = container.resolve(DITokens.userService);
const apiKeyService = container.resolve(DITokens.apiKeyService);
const opts = getPassportJwtOptions(settingsStore, configService, ExtractJwt.fromAuthHeaderAsBearerToken());
passport.use(new Strategy(opts, function(jwt_payload, done) {
verifyUserCallback(userService)(jwt_payload, done);
}));
passport.use(new ApiKeyStrategy(apiKeyService));
passport.use(new Strategy$1());
return passport;
}
//#endregion
export { getPassportJwtOptions, initializePassportStrategies, verifyUserCallback };
//# sourceMappingURL=passport.js.map