我正在开发一个 nodejs 应用程序,我想在其中使用 Microsoft AD oath2 流。我在这里查看了微软的官方文档,发现他们列出了两个库 -
- msal节点
- 护照天蓝色广告
我需要帮助选择最能满足我需求的图书馆。我需要 -
- 执行身份验证
- 通过令牌验证保护一些 API
- 公开所有 api,以便它们可以在外部进行测试
- 在我的应用程序中调用外部网络 API
此外,文档说“Acces web apis”不能使用passport-azure-ad。他们这是什么意思?
我正在开发一个 nodejs 应用程序,我想在其中使用 Microsoft AD oath2 流。我在这里查看了微软的官方文档,发现他们列出了两个库 -
我需要帮助选择最能满足我需求的图书馆。我需要 -
此外,文档说“Acces web apis”不能使用passport-azure-ad。他们这是什么意思?
我使用 passport-azure-ad 在涉及许多不同身份验证协议的复杂登录服务中处理 Azure SSO。
建立客户端凭据流非常有效,其中会话由后端管理。
msal-node 库更好地实现隐式流,其中 SPA 可以访问令牌,然后可以使用该令牌从身份提供者获取数据。
另一种解决方法是使用 passport-azure-ad 来处理登录,然后将其绑定到自定义 JWT 生成系统。
最终会看起来像这样:
const passport = require('passport');
const OIDCStrategy = require('passport-azure-ad').OIDCStrategy;
const Token = require('Token.js');
settings = {
azureDirectoryId: '',
azureClientId: '',
azureClientSecret: '',
callbackUrl: 'https://example.com/auth/callback',
}
passport.use(new OIDCStrategy(
{
identityMetadata: `https://login.microsoftonline.com/${settings.azureDirectoryId}/.well-known/openid-configuration`,
clientID: settings.azureClientId,
responseType: 'code id_token',
responseMode: 'form_post',
redirectUrl: settings.callbackUrl,
clientSecret: settings.azureClientSecret,
// ...additional settings if needed
},
(req, iss, sub, profile, accessToken, refreshToken, done) => {
process.nextTick(async () => {
profile.accessToken = accessToken;
profile.refreshToken = refreshToken;
profile.token = Token.generate(profile);
done(null, profile);
});
},
));
router.get('/auth/login', (req, res, next) => {
passport.authenticate('azuread-openidconnect', {
response: res,
resourceURL: null,
customState: Math.random().toString(36).substr(2, 10),
failureRedirect: '/failure',
})(req, res, next);
});
router.use('/auth/callback', (req, res, next) => {
passport.authenticate('azuread-openidconnect', {
response: res,
successRedirect: '/success',
failureRedirect: '/failure',
})(req, res, next);
});
router.get('/auth/success', (req, res, next) => {
if (req.user.token) {
res.cookie('token', req.user.token);
return res.redirect('https://example.com');
}
failure(req, res);
});
const failure = (req, res) => {
req.session.destroy(() => {
res.clearCookie('token', cookieSettings);
res.redirect('https://example.com');
});
};
router.get('/auth/failure', failure);
这样,将用户发送到https://example.com/auth/login将开始通过护照进行身份验证的过程。完成后,您将使用身份提供者 ( Token.generate(profile);
) 返回的信息生成 JWT,将该令牌存储为 cookie,并将用户重定向回主页。