Экспресс-сессия: Как исправить 'req.isAuthenticated ()', возвращая false, когда не используется LocalStrategy - PullRequest
0 голосов
/ 01 мая 2019

У меня есть приложение, которое успешно аутентифицирует пользователей и их соответствующие сеансы, используя 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);
    });
});
...