Как добиться условной аутентификации с passport.js а экспресс?

#node.js #express #authentication #passport.js #basic-authentication

#node.js #экспресс #аутентификация #passport.js #базовая аутентификация

Вопрос:

Я хотел бы использовать базовую аутентификацию для своих маршрутов API, но также разрешать пользователям получать доступ к API в браузере с помощью стратегии локальной аутентификации. Мой промежуточный продукт выглядит так:

         router.get("/Login", (req: Request, res: Response, next: NextFunction) => {
            let test = req.flash("loginMessage");
            res.render("Login", { message: test });
        });

        // Local authentication for user login
        router.post(
            "/Login",
            passport.authenticate("local-login", {
                failureRedirect: config.urlExtension   "/Login", // redirect back to the signup page if there is an error
                failureFlash: true, // allow flash messages
            })
        );

        // Basic authentication for API routes
        router.all("/api/*", passport.authenticate("basic", { session: false }));

        router.all("*", connectensurelogin.ensureLoggedIn(`${config.urlExtension}/Login`))
 

Итак, для маршрута аутентификации API я бы хотел обойти базовую аутентификацию, если локальная аутентификация уже достигнута путем входа в систему.

Ответ №1:

Я обнаружил, что вы можете вернуть вызов маршруту аутентификации изнутри внешнего маршрута с помощью этого условия следующим образом:

         // Basic authentication for API routes
        router.all("/api/*", (req, res, next) =>
            req.isAuthenticated()
                ? next()
                : passport.authenticate("basic", { session: false })(req, res, next),
        );