【问题标题】:Multiple Issuers for common-endpoint公共端点的多个发行者
【发布时间】:2022-12-18 07:10:43
【问题描述】:

根据passport-azure-ad documentation,我应该能够将发行者列表指定为字符串数组。

但是,我无法让下面的第二个示例正常工作。

第一个例子工作正常:

示例 1 - 使用 <TENANT_1_GUID> 颁发的令牌

{
  identityMetadata: 'https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration',
  issuer: [
    'https://login.microsoftonline.com/<TENANT_1_GUID>/v2.0'
  ],
  clientID: '<APP_GUID>',
  validateIssuer: true,
}

示例 2 - 不适用于 <TENANT_1_GUID> 或 <TENANT_2_GUID> 颁发的令牌

但我的问题是,当提供可接受的发行者列表时,令牌未成功验证:-

{
  identityMetadata: 'https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration',
  issuer: [
    'https://login.microsoftonline.com/<TENANT_1_GUID>/v2.0',
    'https://login.microsoftonline.com/<TENTANT_2_GUID>/v2.0'
  ],
  clientID: '<APP_GUID>',
  validateIssuer: true,
}

这不是验证可能来自两个租户之一的令牌的正确方法吗?

谢谢!

【问题讨论】:

    标签: passport-azure-ad


    【解决方案1】:

    我想出了一些有用的东西......创造了一个带有护照的中间件:-

    const jwt = require('jsonwebtoken');
    const passport = require('passport');
    const BearerStrategy = require('passport-azure-ad').BearerStrategy;
    
    module.exports = (req, res, next) => {
      try {
        const token = req.headers.authorization.split(" ")[1];
        decodedToken = jwt.decode(token);
    
        let issuer;
        const iss_company1 = "https://login.microsoftonline.com/<TENANT_1_GUID>/v2.0";
        const iss_company2 = "https://login.microsoftonline.com/<TENANT_2_GUID>/v2.0";
    
        switch (decodedToken.iss) {
          case iss_company1:
              issuer = iss_company1;
              break;
          case iss_company2:
              issuer = iss_company2;
              break;
          default:
              issuer = iss_company1;
        }
    
        let passportOptions = {
          identityMetadata: process.env.passport_identityMetadata,
          issuer,
          clientID: process.env.passport_clientID,
          passReqToCallback: process.env.passport_passReqToCallback,
          loggingLevel: "error",
          loggingNoPII: true
        };
    
        let bearerStrategy = new BearerStrategy(passportOptions,
          function(token, done) {
            return done(null, token);
          }
        );
    
        passport.use(bearerStrategy);
    
        passport.authenticate('oauth-bearer', { session: false })(req, res, next);
    
      } catch (error) {
        res.status(401).json({ message: "Unauthorized" });
      }
    
    };
    

    【讨论】:

      猜你喜欢
      • 2017-02-21
      • 2016-08-05
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2010-12-16
      相关资源
      最近更新 更多