我正在开发一个nodejs应用程序,我想使用微软AD oath2流。我查看了微软的官方文档,发现他们列出了两个库——
- msal-node
- passport-azure-ad
我需要帮助选择最能满足我需要的图书馆。我需要-
- 执行身份验证
- 通过令牌验证保护一些api
- 公开所有api,以便它们可以在外部进行测试
- 在我的应用程序中调用外部web api
另外,文档中说"访问web api"。用passport- azuread是不可能的。这是什么意思呢?
我在一个复杂的登录服务中使用了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,并将用户重定向到主页。