【问题标题】:Microsoft AD Authentication node js LibraryMicrosoft AD 身份验证节点 js 库
【发布时间】:2021-05-17 05:19:47
【问题描述】:

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

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

我需要帮助来选择最能满足我需求的库。我需要 -

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

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

【问题讨论】:

    标签: node.js oauth-2.0 azure-active-directory msal.js passport-azure-ad


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我使用 msal-node 来获取访问和 id 令牌。我将 id 令牌添加到 cookie,然后使用 jsonwebtoken nodejs 包在所有受保护的端点中验证它。
    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2022-10-07
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多