问题描述
如何使用passport
和passport-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