node.js - 如何在 Node.js 应用程序/API 中从 Azure AD 发出令牌?
问题描述
我正在构建一个带有快速后端的节点应用程序。其中一项要求是使用 Azure AD 进行身份验证。我已经安装了passport-azure-ad
模块并将其设置如下:
import * as passportAD from "passport-azure-ad";
// ... <snip> ....
const tenantName = "<MY_TENANT_NAME>"";
const clientID = "<MY_CLIENT_ID>";
app.use(passport.initialize());
app.use(passport.session());
const bearerStrategy = new passportAD.BearerStrategy(
{
identityMetadata: `https://login.microsoftonline.com/${tenantName}.onmicrosoft.com/.well-known/openid-configuration`,
clientID
},
(token: any, done: any) => {
console.log(token);
return done(null, {}, token);
}
);
passport.use(bearerStrategy);
然后我为这样的路线添加了授权:
const myHandler = () => (req, res) => return res.json({});
app.get('/my/route',
passport.authenticate("oauth-bearer", { session: false }),
myHandler()
);
这将按预期返回 401 状态,但是,我无法找到有关如何从 Azure AD 向客户端颁发令牌的文档。我想在正文中使用用户名和密码接受登录端点的 POST 并返回 Azure AD 令牌。这可能吗?
解决方案
您还可以执行以下操作。我最近用我的 react 应用程序和 nodejs 后端实现了一个
您可以在https://github.com/AzureADQuickStarts/AppModelv2-WebAPI-nodejs/blob/master/node-server/config.js找到BearerStrategyOptions的键值
允许仅供参考我使用了以下公共端点' https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration作为identityMetadata
const BearerStrategyOptions = {
identityMetadata,
clientID,
validateIssuer,
issuer,
passReqToCallback,
allowMultiAudiencesInToken,
audience
};
您可以在https://github.com/AzureADQuickStarts/AppModelv2-WebApp-OpenIDConnect-nodejs/blob/master/config.js找到OIDCStrategyOptions的键值
const OIDCStrategyOptions = {
identityMetadata,
clientID,
responseType,
responseMode,
redirectUrl,
allowHttpForRedirectUrl,
clientSecret,
validateIssuer,
isB2C,
issuer,
passReqToCallback,
scope,
nonceLifetime,
nonceMaxAmount,
useCookieInsteadOfSession,
cookieEncryptionKeys,
clockSkew
};
对于身份验证:
passport.use(
new OIDCStrategy(OIDCStrategyOptions, function(
iss,
sub,
profile,
accessToken,
refreshToken,
done
) {
if (!profile.oid) {
return done(new Error("No oid found"), null);
}
// asynchronous verification, for effect...
process.nextTick(function() {
findByOid(profile.oid, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
// "Auto-registration"
users.push(profile);
// console.log("---------profile----------", profile)
return done(null, profile);
}
// console.log("-----------user---------", user)
return done(null, user);
});
});
})
);
授权:
passport.use(
new BearerStrategy(BearerStrategyOptions, function(token, done) {
console.log("verifying the user");
console.log(token, "was the token retreived");
findByOid(token.oid, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
// "Auto-registration"
console.log(
"User was added automatically as they were new. Their oid is: ",
token.oid
);
users.push(token);
owner = token.oid;
return done(null, token);
}
owner = token.oid;
return done(null, user, token);
});
})
);
并在您的 api 中使用以下代码来授权路由
passport.authenticate('oauth-bearer', {session: false})
完毕!希望这对希望使用的人有所帮助:)passport-azure-ad
推荐阅读
- events - iPython 小部件进程事件
- android - Playstore 错误 - 您需要为您的 APK 或 Android App Bundle 使用不同的版本代码,因为您已经有一个版本代码为 4
- input - 他们是如何制作“Fast Like a Fox”中的控件的?
- javascript - Jquery .on() 要么不工作要么触发两次
- c - 我的 C 代码没有捕捉到“最终客户”结束
- c# - 当 where 子句包含双引号特殊字符时,Linq to SQL 失败
- android - 在 Android 中使用 UPI APP 向用户发送付款
- python - Python - 在 for 循环中附加到二维数组会导致以前的条目被覆盖
- android - 未报告 Firebase 致命崩溃
- javascript - 将选定的值 Id 从父级传递给子级 Kendo DropdownList