Я настроил свое приложение 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')
})
});