Аутентификация с помощью Passport.js ActiveDirectory не поддерживает сеанс - PullRequest
0 голосов
/ 28 сентября 2018

У меня проблема с Passport.js, использующим стратегию ActiveDirectory, когда я успешно аутентифицируюсь, но не могу поддерживать сеанс при последующих запросах.После аутентификации любой вызов req.isAuthenticated() возвращает false.Кроме того, в браузере клиента не устанавливается cookie.Я потратил весь день на схожие посты, но пока ни одно из предложенных решений не сработало.

Некоторые замечания, на которые следует обратить внимание:

-Аутентификация всегда успешна и возвращает req.user вclient.

-Console.log в serializeUser() всегда запускается и правильно регистрирует запись пользователя.

-Console.log в deserializeUser() никогда не запускается, я не уверен, когда эта функция должна вызываться, но она не выглядит?

-После входа в системукаждый раз, когда я обращаюсь к моей / тестовой конечной точке, срабатывают условия без аутентификации.

// Passport Requires
const passport = require('passport');
const session = require('express-session');
var ActiveDirectoryStrategy = require('passport-activedirectory');

// Setup
app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: false,
    cookie: { secure: false, maxAge: 600000 }
}));

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function(user, done) {
    console.log('userStrategy -- serialized:', user)
    done(null, user);
});

passport.deserializeUser(function(user, done) {
    console.log('userStrategy -- deserializeUser', user)
    done(null, user);
});

passport.use(new ActiveDirectoryStrategy({ 
    integrated: false,
    passReqToCallback: true,
    ldap: {
        url: "url",
        baseDN: "baseDN",
        username: `username`,
        password: `password`
    }
}, function (req, profile, ad, done) {
    ad.isUserMemberOf(profile._json.dn, 'Access Group', function (err, isMember) {
        console.log('isMember:', isMember)
        if (err) {
            return done(err)
        } else {
            return done(null, profile)
        }
    })
}))

// Login Route
app.post('/login', 
    passport.authenticate('ActiveDirectory', { failWithError: true }), 
    function (req, res) {
        console.log('Authenticated');
        return res.status(200).send(req.user);
    }, function (err) {
        console.log('Not Authenticated');
        return res.sendStatus(401).send(err);
    }
)

// Test endpoint to check whether user is authenticated
app.get('/test', function(req, res) {
    if (req.isAuthenticated()) {
        res.send('Youre authenticated!')
    } else {
        res.send('Youre not authenticated!')
    }
})

Цените любые мысли по проблеме - спасибо!

1 Ответ

0 голосов
/ 28 сентября 2018

Я выяснил проблему, которая не имеет ничего общего с настройкой Passport или сервера.

В моем клиентском API-вызове для входа в систему я использовал fetch(), но у меня не было *Опция 1004 * на начальном POST для входа в систему.После того, как я добавил эту опцию, куки-файл был отправлен обратно в браузер клиента, и будущие вызовы API к isAuthenticated() вернули true.

Убедитесь, что credentials: 'include' на ВСЕХ ваших вызовах API, включая начальный POSTвойти.

...