Проверка подлинности с помощью passport-azure-ad не удалась с jwt истек - PullRequest
0 голосов
/ 28 декабря 2018

Я настроил свое приложение Express на основе документации для passport-azure-ad, но даже после того, как прошло достаточно много времени для прохождения и очистки кэша и файлов cookie, первоначальный вход в систему всегда сразу приводит к сбою в работе узла.Срок действия JS, указывающего jwt, истек, хотя он был только что получен.Я думаю, может быть, это как-то связано с часовым поясом, но я также думаю, что Passport должен уметь обрабатывать различия часовых поясов.Что-то явно не так с этим?

Из журнала узла:

{"name": "AzureAD: OIDC Passport Strategy", "hostname": "d05a2598e38", "pid": 1436, "level": 30, "msg": "authentication failed due to: In _validateResponse: jwt is expired", "time": "2018-12-28T20:43:24,8492", "v": 0}

Конфигурация стратегии:

"azureAD": {
  "identityMetadata": "https://login.microsoftonline.com/contoso.onmicrosoft.com/v2.0/.well-known/openid-configuration",
  "clientID": "withheld",
  "responseType": "id_token code",
  "responseMode": "form_post",
  "redirectUrl": "withheld",
  "clientSecret": "withheld",
  "passReqToCallback": false,
  "scope": ["profile", "offline_access"]
}

Настройка стратегии:

  passport.use(new OIDCStrategy({
    identityMetadata: config.azureAD.identityMetadata,
    clientID: config.azureAD.clientID,
    responseType: config.azureAD.responseType,
    responseMode: config.azureAD.responseMode,
    redirectUrl: config.azureAD.redirectUrl,
    clientSecret: config.azureAD.clientSecret,
    passReqToCallback: config.azureAD.passReqToCallback,
    scope: config.azureAD.scope,
    loggingLevel: 'info'
  },
  function(iss, sub, profile, accessToken, refreshToken, done) {
    if(!profile.oid) return done(new Error('No OID found'), null);
    process.nextTick(function() {
      findByOID(profile.oid, function(err, user) {
        if(err) return done(err);
        if(!user) {
          users.push(profile);
          return done(null, profile);
        }
        return done(null, user);
      });
    });
  }));

  passport.serializeUser(function(user, done) {
    done(null, user.oid);
  });

  passport.deserializeUser(function(id, done) {
    findByOID(id, function(err, user) {
      done(err, user);
    });
  });

  var findByOID = function(oid, fn) {
    for(var i=0, len = users.length; i < len; i++) {
      var user = users[i];
      if(user.oid === oid) return fn(null, user);
    }
    console.log('A user with OID ' + oid + ' was not found')
    return fn(null, null);
  }

Маршруты:

  app.get('/login', function(req, res, next) {
      passport.authenticate('azuread-openidconnect', {
        response: res,
        failureRedirect: '/'
      })(req, res, next);
  }, function(req, res) {
      console.log('DEBUG: Login started');
      res.redirect('/');
  });

  app.post('/openid/return', function(req, res, next) {
    passport.authenticate('azuread-openidconnect', {
      response: res,
      failureRedirect: '/'
    })(req, res, next);
  }, function(req, res) {
      console.log('DEBUG: Response recieved from AAD');
      res.redirect('/');
  });

  app.get('/logout', function(req, res) {
    req.session.destroy(function(err) {
      req.logOut();
      res.redirect('https://login.microsoftonline.com/common/oauth2/logout?post_logout_redirect_uri=https://contoso.net')
    })
  });
...