Возможно, глупый вопрос, я пытаюсь проработать пример для OAuth и хочу точно понять, что происходит, прежде чем добавлять в свой собственный код.

Образец node, express с использованием passport-azure-ad

Маршрут определяется, и выполняется вызов passport.authenticate.

app.get('/login',
  (req, res, next) => {
      passport.authenticate('azuread-openidconnect', 
      { 
        response: res,
        resourceURL: config.resourceURL,
        failureRedirect: '/' 
      })(req, res, next); // <-- Here is what I am stuck on. 
   },
   (req, res) => {
       log.info('Login was called in the Sample');
       res.redirect('/');
});

Я пытаюсь понять (req, res, next);, который следует непосредственно после аутентификации.

Цените любую помощь, или ссылку на теорию / документацию по этому синтаксису.

0
Bibberty 29 Май 2019 в 23:42

2 ответа

Лучший ответ

Это потому, что passport.authenticate возвращает функцию (промежуточное ПО) для обработки запроса, поэтому вы передаете запрос фактическому обработчику здесь

Типа того:

function authenticate(someArg) {
    return function (req, res, next) {
        // the handler
    }
}

И это упрощенная версия предоставленного вами примера, без дополнительной явной передачи параметров

app.get('/login', passport.authenticate('azuread-openidconnect', { 
    response: res,
    resourceURL: config.resourceURL,
    failureRedirect: '/' 
}), (req, res) => {
    log.info('Login was called in the Sample');
    res.redirect('/');
});
1
Rami Jarrar 30 Май 2019 в 00:01

Я думаю, что это просто вопрос понимания синтаксиса Javascript для того, что называется «лямбда-функцией». Рассмотрим следующее выражение:

(a) => { console.log(a) }

Это способ написания функции, которая принимает один аргумент и печатает его. Вы можете поместить это выражение в любое место, где вам нужно указать функцию, которая выводит один аргумент. Это полезно, потому что в Javascript функции могут передаваться точно так же, как данные, и этот синтаксис позволяет вам определять функцию именно тогда, когда вам это нужно, не удосуживаясь дать ей имя.

В вашем примере вы вызываете app.get с тремя аргументами. Первой является строка '/ login'. Второй - это функция, которая принимает 3 аргумента, и эта функция определена прямо в строке для вызова passport.authenticate, который возвращает функцию, которая вызывается с этими 3 аргументами. Третья - это функция, которая принимает 2 аргумента, также определенных прямо в строке.

0
Duncan 29 Май 2019 в 21:30
56368223