快速护照检查用户是不是已通过身份验证

Posted

技术标签:

【中文标题】快速护照检查用户是不是已通过身份验证【英文标题】:express passport check if user is authenticated快速护照检查用户是否已通过身份验证 【发布时间】:2018-12-21 17:08:46 【问题描述】:

我正在使用护照登录并显示“/home”。登录有效并重定向到“/home”。但是这个端点不受保护,可以通过在浏览器中输入来访问。我尝试使用 req.isAuthenticated () (并在这里经历了多个问题)无济于事。

路由//index.js

var express = require('express');
var router = express.Router();
var User = require('../models/user');
var passport = require('passport');
var session = require('express-session');
const LocalStrategy = require('passport-local').Strategy;




passport.use(new LocalStrategy(
  function(username, password, done) 
      User.findOne(
        username: username
      , function(err, user) 
        if (err) 
          return done(err);
        

        if (!user) 
          return done(null, false);
        

        if (user.password != password) 
          return done(null, false);
        
        return done(null, user);        
      );
  
));





router.get('/', function(req, res, next) 
  res.render('index',  title: 'Express' );
);

router.get('/login', function(req, res, next) 
  res.render('login');
);

router.post('/login', passport.authenticate('local',  failureRedirect : '/', successRedirect : '/home'))

router.get('/register', function(req, res, next) 
  res.render('register');
);



router.get('/logout', function(req, res)
  req.logout();
  res.redirect('/');
);

router.get('/home', ensureLocalAuthenticated, function(req, res)
  res.render('home',  user: req.user );
);



function ensureLocalAuthenticated(req, res, next) 
  console.log(req.isAuthenticated());
  if (req.isAuthenticated())  return next(); 
  res.redirect('/login');




module.exports = router;

在我的 app.js 文件中,我已经像这样配置了护照:

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

passport.serializeUser(function(user, done)
  done(null, user.id)
)

passport.deserializeUser(function(id, done)
  User.findById(id, function(err, user)
    done(err, user)
  )
)

app.use('/', indexRouter);
app.use('/users', usersRouter);

isAuthenticated 总是返回 false,无法使用该中间件登录。如果我删除它,我可以正常登录,但所有用户都可以访问“/home”

【问题讨论】:

req.user 给你什么?试着把它放在ensureLocalAuthenticated 我在ensureLocalAuthenticated 中添加了console.log(req.user)。它返回未定义。我尝试登录后 这意味着护照无法加载用户。在passport.serializeUser 中查看userreq.cookies 的值是什么 另外,您使用的是cookie-parser吗?因为这会加载解析并加载cookie,所以passport会使用cookie来加载用户。 嘿,我想通了。这在 app.js 中丢失了。谢谢app.use(require('express-session')( secret: 'keyboard cat', resave: false, saveUninitialized: false )); 【参考方案1】:

将以下行添加到 app.js 对我有用:

app.use(require('express-session')(
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false
));

所以护照配置如下:

var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var passport = require('passport');
var mongoose = require('mongoose');
var User = require('./models/user')
const LocalStrategy = require('passport-local').Strategy;

使用它们:

app.use(express.json());
app.use(express.urlencoded( extended: false ));
app.use(cookieParser());

app.use(require('express-session')(
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false
));

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded( extended: false ))
app.use(bodyParser.json())
app.use(express.static(path.join(__dirname, 'public')));

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

// used to serialize the user for the session
passport.serializeUser(function(user, done) 
  done(null, user.id); 
 // 
);

// used to deserialize the user
passport.deserializeUser(function(id, done) 
  User.findById(id, function(err, user) 
      done(err, user);
  );
);

【讨论】:

以上是关于快速护照检查用户是不是已通过身份验证的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要使用快速会话以及护照和 JSON Web 令牌进行身份验证?

Apollo express 没有快速护照会话

Laravel 通过生成的令牌进行身份验证,无需护照和 jwt

护照身份验证不适用于使用快速路由器的特定路由

使用护照 jwt 进行身份验证

nodejs护照身份验证令牌