У меня есть приложение, которое успешно аутентифицирует пользователей и их соответствующие сеансы, используя express-session
, passport-local
и connect-ensure-login
.
При замене стратегии локального входа для паспорта на стратегию OAuth на предъявителя passport-azure-ad
я обнаружил, что маршруты, которые ранее находили сеансы пользователей с промежуточным ПО:
require('connect-ensure-login').ensureLoggedIn()
Больше не работает - вызов req.isAuthenticated()
вернет false.
Я вижу, что файл cookie сеанса connect.sid
все еще устанавливается после успешного завершения стратегии Bearer OAuth.
Полагаю, мой вопрос: есть ли что-то, что passport-local
делает для включения сеансов, а не passport-azure-ad
?
Настройка сервера:
const bearerToken = require('express-bearer-token');
const app = express();
app.set('trust proxy', 1)
const dataRouter = express.Router();
dataRouter.use(bearerToken());
dataRouter.use(require('cookie-parser')());
dataRouter.use(bodyParser.urlencoded({ extended: false }));
dataRouter.use(bodyParser.json());
dataRouter.use(session({secret: 'fake secret', resave: false, saveUninitialized: false}));
dataRouter.use(passport.initialize());
dataRouter.use(passport.session());
Настройка маршрута:
router.post('/sign-in', passport.authenticate('oauth-bearer'), (req, res) => {
res.json({ user: req.user.username } });
});
router.get('/check-session', require('connect-ensure-login').ensureLoggedIn(), (req, res) => {
res.json({ user: req.user.username } });
});
Настройка паспорта:
const LocalStrategy = require('passport-local').Strategy;
const BearerStrategy = require('passport-azure-ad').BearerStrategy;
passport.use(new BearerStrategy(config.credentials, (req, token, done) => {
let currentUser = null;
let userToken = authenticatedUserTokens.find((user) => {
currentUser = user;
user.sub === token.sub;
});
if(!userToken) {
console.log('No previous user token found');
authenticatedUserTokens.push(token);
currentUser = token.unique_name;
}
return done(null, currentUser, token);
});
passport.use('local-login', new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true
},
function(req, username, password, done) {
col.findOne({ 'local.username': username}, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false);
}
if (!validPassword(password, user.local.password)) {
return done(null, false)
}
return done(null, user);
});
}));
passport.serializeUser(function(req, user, done) {
done(null, user._id.toString());
});
passport.deserializeUser(function(id, done) {
const _id = new ObjectId(id);
col.findOne({ _id: _id}, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false);
}
done(null, user);
});
});