PassportJS没有在本地策略中保存会话

时间:2017-01-08 06:00:47

标签: node.js session authentication passport.js passport-local

我松散地遵循教程here,并且我不确定它为什么不起作用。登录将正常工作 - 它接受并完全拒绝我的预期,它将不会保存会话,因此访问任何链接后会说我没有经过身份验证。

Vivaldi开发小组说保存了no cookiessessions。我已将其设置为在PostgreSQL中以redis和用户身份验证保存会话,并且两个数据库都连接正常。

以下是相关代码:

index.js:

const express = require('express');

const passport = require('passport'); 
const session = require('express-session');

const Redis = require('ioredis');
const RedisStore = require('connect-redis')(session);

const bodyParser   = require('body-parser');
const cookieParser = require('cookie-parser');

const auth      = require("./app/authenticate");
const config    = require('./config');

const app = express();

var redis_client = new Redis({
  host: config.redisStore.host,
  port: config.redisStore.port,
  lazyConnect: true
});
redis_client.connect().catch(function(err) {
  throw err;
});

app.use(cookieParser(config.redisStore.secret));
app.use(session({
  cookie : {
    maxAge: 36000000000,
    secure: true
  },
  secret: config.redisStore.secret,
  store: new RedisStore({ client: redis_client }),
  resave: false,
  saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.urlencoded({extended: true}));

auth.init.initPassport();
app.post('/login', passport.authenticate('local', {
  successRedirect: '/testroute',
  failureRedirect: '/'
}));

var urlencodedParser = bodyParser.urlencoded({extended: false});
app.get("/testroute", passport.authenticationMiddleware(), urlencodedParser, function(req, res) {
    res.send("You are authenticated!");
});

app.listen(8080);

/app/authenticate/init.js:

const passport      = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const scrypt        = require("scrypt");

const auth = require("./userfunctions");

const authenticationMiddleware = function() {
  return function (req, res, next) {
    if (req.isAuthenticated()) {
      return next();
    }
    res.send('ERR: You are not authenticated!');
  };
}

module.exports = {
  initPassport: function() {
    passport.serializeUser(function(user, done) {
      done(null, user);
    });

    passport.deserializeUser(function(id, done) {
      auth.getUserById(id, done);
    });

    passport.use(new LocalStrategy({
        usernameField: 'email',
        passwordField: 'pwd',
      },
      function(username, password, done) {
        auth.login(username, function(err, user) {
          if (err) {console.log(err); return done(err);}
          if (!user) {return done(null, false);}
          if (!scrypt.verifyKdfSync(user.password, password)) {return done(null, false);}
          return done(null, user);
        });
      }
    ));

    passport.authenticationMiddleware = authenticationMiddleware;
  }
};

/ app / authenticate中还有一些其他文件,它们是index.js(只是将所有其他东西添加到modules.exports)和userfunctions.js,它们只包含登录和注册功能。如果需要,我可以发布这些。

我也省略了配置文件,它只是PostgreSQL和redis的数据库凭据。最后,我排除了你在GET /时提供的test.html,它只是一个测试HTML登录和注册表单。

1 个答案:

答案 0 :(得分:0)

您可以使用快速会话npm模块来保存会话值。

以下是步骤 -

  1. npm install express-session
  2. 在你的启动JS文件中写下代码 var expressSession = require(' express-session'); app.use(expressSession({secret:' yourothersecretcode',saveUninitialized:true,resave:true}));
  3. 现在您可以在代码中使用req.session
  4. req.session只是一个json对象,它由快速会话中间件持久保存,使用您选择的存储,例如: Mongo或Redis。