我松散地遵循教程here,并且我不确定它为什么不起作用。登录将正常工作 - 它接受并完全拒绝我的预期,它将不会保存会话,因此访问任何链接后会说我没有经过身份验证。
Vivaldi开发小组说保存了no cookies或sessions。我已将其设置为在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登录和注册表单。
答案 0 :(得分:0)
您可以使用快速会话npm模块来保存会话值。
以下是步骤 -
req.session只是一个json对象,它由快速会话中间件持久保存,使用您选择的存储,例如: Mongo或Redis。