【问题标题】:PassportJS authenticates user but returns 401 Unauthorized on subsequent requestsPassportJS 对用户进行身份验证,但在后续请求中返回 401 Unauthorized
【发布时间】:2018-10-04 07:53:21
【问题描述】:

我正在用 NodeJS 编写我的第一个应用程序,所以请多多包涵。我已经成功地对我们的 Active Directory 的用户进行身份验证,并且我可以看到在后续请求中设置和使用了 connect.sid cookie。

通过转储 req 对象调试应用程序时,我还可以看到用户变量已成功设置。从我读过的文档来看,这似乎是成功会话匹配的标准?

但是,请求仍然得到 401 Unauthorized。

总结一下:

  1. 用户在发布凭据 /login 后成功通过身份验证。
  2. 身份验证成功后,用户被重定向到“/”。
  3. “/”路径回复 401 Unauthorized。

非常感谢任何想法。代码如下。

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')
})

【问题讨论】:

    标签: node.js authentication active-directory passport.js unauthorized


    【解决方案1】:

    发现我做错了什么!

    .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);
    });
    

    这消除了多余的序列化/反序列化。

    这些文章确实帮助我理解了流程:

    希望对其他人有所帮助!

    /帕特里克

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多