PassportJS аутентифицирует пользователя, но возвращает 401 не авторизованным при последующих запросах - PullRequest
0 голосов
/ 04 октября 2018

Я пишу одно из моих первых приложений на NodeJS, поэтому, пожалуйста, потерпите меня.Мне удалось успешно аутентифицировать пользователя в нашем Active Directory, и я вижу, что cookie connect.sid устанавливается и используется для последующих запросов.

После отладки приложения путем выгрузки объекта req я также вижучто пользовательская переменная была успешно установлена.Из документации, которую я прочитал, кажется, что это критерий успешного сеанса?

Тем не менее, запрос все еще получает 401 Unauthorized.

Подводя итог:

  1. Пользователь успешно аутентифицирован после отправки учетных данных /login.
  2. При успешной аутентификации пользователь перенаправляется на "/".
  3. . Путь" / "отвечает 401 Несанкционированным.

Любые идеи высоко ценится.Код ниже.

const express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');
var passport = require('passport')
var ActiveDirectoryStrategy = require('passport-activedirectory')

// Setup the authentication strategy
passport.use(new ActiveDirectoryStrategy({
    integrated: false,
    ldap: {
        url: 'ldap://myad.company.com',
        baseDN: 'DC=domain,DC=company,DC=com',
        username: 'user',
        password: 'password'
    }
}, function (profile, ad, done) {
    ad.isUserMemberOf(profile._json.dn, 'Group', function (err, isMember) {
        if (err) return done(err)
        return done(null, profile)
    })
}));

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

passport.deserializeUser(function(user, done) {
    done(null, JSON.parse(user));
});

const app = express();

app.use(bodyParser.urlencoded({extended: true}));
app.use(session(
    { secret: "password" }
));
app.use(passport.initialize());
app.use(passport.session());

// For debugging purposes
app.use(function (req, res, next) {
    console.log(req)
    next()
})

// The login page posts a form containing user and password
app.get("/login", (req, res) => {
    res.sendFile(__dirname + '/public/index.html');
})

// Handler for the login page. Receives user and password and redirects the user to /
app.post('/login', 
    passport.authenticate('ActiveDirectory', {
            failWithError: true,
            successRedirect: "/",
            failureRedirect: "/login"
        }
    ), function(req, res) {
        res.json(req.user)
    }, function (err) {
        res.status(401).send('Not Authenticated')
    }
)

// This is where the issue happens. The page returns "Unauthorized".
// Using console.log(req) shows that the user property has been set to the req object.
// However, for some reason it still fails.
app.get('/',
    passport.authenticate('ActiveDirectory', {
            failWithError: true,
        }
    ), function(req, res) {
        res.send("test")
}, function (err) {
    res.status(401).send('Not Authenticated')
})

1 Ответ

0 голосов
/ 04 октября 2018

Обнаружил, что я сделал не так!

Метод .authenticate используется только для проверки учетных данных, а не для проверки сеанса.

Итак, это:

app.get('/',
    passport.authenticate('ActiveDirectory', {
            failWithError: true,
        }
    ), function(req, res) {
        res.send("test")
}, function (err) {
    res.status(401).send('Not Authenticated')
})

Должно стать:

app.get('/', function(req, res, next) {
    // This is verifying that the user part has been populated,
    // which means that the user has been authenticated.
    if (req.user) {
        res.send('Returning with some text');
    } else {
        // If the user property does no exist, redirect to /login
        res.redirect('/login');
    }
  });

Еще одна вещь, которую я изменил, это функции сериализации / десериализации:

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

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

Это удаляет избыточную сериализацию / десериализацию.

Эти статьи действительно помоглия понимаю поток:

Надеюсь, это поможет кому-то еще!

/ Patrik

...