如何解决微软 AD 认证节点 js 库
我正在开发一个 nodejs 应用程序,我想在其中使用 Microsoft AD oath2 流程。我查看了 Microsoft 的官方文档 here,发现他们列出了两个库 -
- msal 节点
- passport-azure-ad
我需要帮助选择最能满足我需求的图书馆。我需要 -
- 执行身份验证
- 通过令牌验证保护一些 API
- 公开所有 api,以便它们可以在外部进行测试
- 在我的应用内调用外部网络 API
此外,文档说“访问 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',res,next) => {
passport.authenticate('azuread-openidconnect',{
response: res,resourceURL: null,customState: Math.random().toString(36).substr(2,10),failureRedirect: '/failure',})(req,next);
});
router.use('/auth/callback',successRedirect: '/success',next);
});
router.get('/auth/success',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,并将用户重定向回主页。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。