0

我正在开发一个 nodejs 应用程序,我想在其中使用 Microsoft AD oath2 流。我在这里查看了微软的官方文档,发现他们列出了两个库 -

  1. msal节点
  2. 护照天蓝色广告

我需要帮助选择最能满足我需求的图书馆。我需要 -

  • 执行身份验证
  • 通过令牌验证保护一些 API
  • 公开所有 api,以便它们可以在外部进行测试
  • 在我的应用程序中调用外部网络 API

此外,文档说“Acces web apis”不能使用passport-azure-ad。他们这是什么意思?

4

1 回答 1

0

我使用 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,并将用户重定向回主页。

于 2021-02-13T20:26:32.250 回答