使用护照azure-ad

问题描述

如何使用passportpassport-azure-ad保护Azure函数,我不想保护所有的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",};
  }
};

解决方法

由于您不管理Azure功能(您仅提供代码),因此身份验证发生在其他位置,可以通过门户进行配置。
如果只需要保护某些功能,最好的选择就是将这些功能分为两个不同的应用程序。一个将受到保护,而一个将不会受到保护。

这是身份验证的官方文档:https://docs.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/

,

也许您可以这样:https://www.npmjs.com/package/azure-function-express

这里也有使用相同方法的完整示例:

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