Защита http-триггера функции Azure с помощью passport azure-ad

#azure-functions #passport.js

#azure-функции #passport.js

Вопрос:

Как я могу защитить функцию Azure с помощью passport и passport-azure-ad я не хочу защищать все функции Azure, для некоторых функций потребуется проверка access_token перед запуском кода. И большинство примеров, которые я нашел в Интернете, используют express, который нельзя использовать в функциях Azure.

Я попробовал приведенный ниже подход, но код по-прежнему выполнялся без аутентификации.

 const passport = require("passport");
const config = require("../shared/config");
const createMongoClient = require("../shared/mongo");
const BearerStrategy = require("passport-azure-ad").BearerStrategy;

const bearerStrategy = new BearerStrategy(config, function (token, done) {
  // Send user info using the second argument
  done(null, {}, token);
});
passport.use(bearerStrategy);
passport.initialize();

module.exports = async function (context, req) {
  passport.authenticate("oauth-bearer", { session: false });
  const dish = req.body || {};

  if (dish) {
    context.res = {
      status: 400,
      body: "Dish data is required! ",
    };
  }

  const { db, connection } = await createMongoClient();

  const Dishes = db.collection("dishes");

  try {
    const dishes = await Dishes.insertOne(dish);
    connection.close();

    context.res = {
      status: 201,
      body: dishes.ops[0],
    };
  } catch (error) {
    context.res = {
      status: 500,
      body: "Error creating a new Dish",
    };
  }
};
  

Ответ №1:

Поскольку функции Azure не управляются вами (вы только предоставляете код), аутентификация выполняется в другом месте и может быть настроена через портал.
Если требуется защита только некоторых функций, лучшим решением было бы разделить функции на два разных функциональных приложения. Один будет защищен, а другой — нет.

Вот официальная документация для аутентификации:https://learn.microsoft.com/en-us/azure/app-service/overview-authentication-authorization


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

У меня есть пример, который создает функцию Azure с аутентификацией на портале. Сам код написан на .Net но конфигурация на портале должна быть точно такой же.
https://www.pshul.com/2020/02/07/azure-ad-authentication-from-angular-to-azure-functions/

Комментарии:

1. Спасибо, но я хочу аутентифицировать токен перед запуском функции Azure

2. Да, я понимаю. Защита вашей функции таким образом не приведет к запуску функции, если отправленный токен действительно действителен. Он остановится еще до того, как достигнет вашего кода.

Ответ №2:

Может быть, вы можете использовать Azure следующим образом:https://www.npmjs.com/package/azure-function-express

Также здесь есть полный пример с тем же подходом:

https://github.com/Azure-Samples/ms-identity-nodejs-webapi-onbehalfof-azurefunctions