cloudant connect 的会话存储导致 req.user 在护照本地策略中找不到?
session store with cloudant connect results in req.user is not found in passport local strategy?
我使用 cloudant 作为我的数据库创建了一个快速应用程序。我使用护照作为身份验证中间件。所以默认情况下它将提供内存中的会话存储。所以每次我重新启动应用程序时,会话都会被破坏。
所以我必须使用一些会话存储机制,比如 connect-cloudant。
in app.js 当我的帐户路由被激活时我没有得到 req.user 或 req.isAuthenticated() ?
如果我删除 connect-cloudant 代码并尝试在内存会话存储中使用默认值,我可以获得 req.uesr 和 req.isAuthenticated
app.js
var https = require("https");
var fs = require("fs");
var express = require("express");
var app = express();
var cookieParser = require("cookie-parser");
var session = require("express-session");
var CloudantStore = require('connect-cloudant')(session);
var passport = require("passport");
var strategy = require("passport-local").Strategy;
var path = require("path");
var bodyParser = require("body-parser");
var cons = require('consolidate');
var config = require("./config");
var Cloudant_ip = config.CLOUDENT_IP;
var Cloudant = require('cloudant');
var cloudant = Cloudant(Cloudant_ip);
var Port = config.PORT;
var Local_ip = config.LOCAL_IP;
var cloudantStore = new CloudantStore({
url: Cloudant_ip,
databaseName: "sessions"
});
app.use(express.static("public/_attachments"));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(session({
store: cloudantStore,
secret: 'cloudant',
cookie: {maxAge:24*60*60*1000}
}));
require("./src/config/passport")(app);
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
} else {
res.redirect("/");
}
}
app.engine('html', cons.swig);
app.set('views', path.join(__dirname, 'pages'));
app.set('view engine', 'html');
app.get("/",ensureLoginAuthenticated,function(req,res) {
res.render("index.html");
});
app.get("/myaccount",ensureAuthenticated,function(req,res) {
res.render("my-account.html");
});
https.createServer({
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
}, app).listen(Port,Local_ip, function() {
console.log("server is running on port "+Port);
});
passport.js
var passport = require("passport"),
LocalStrategy = require("passport-local").Strategy,
Cloudant = require("cloudant"),
cloudant = Cloudant("https://username:password@username.cloudant.com"),
db = cloudant.db.use("myuserdatabase");
module.exports = function(app) {
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user,cb) {
cb(null,user);
});
passport.deserializeUser(function(user,cb) {
cb(null, user);
});
passport.use(new LocalStrategy({
usernameField: "username",
passwordField: "password"
},
function(username, password, cb) {
db.get("org.couchdb.user:"+username, function(err,body){
if(!err) {
if(password == body.password) {
var user = {
username: body.email,
password:body.password
};
cb(null, user);
}else {
cb(null, false);
}
}else {
cb(null, false);
}
});
}));
};
我想我在这里遗漏了一些东西所以任何人都可以帮忙。
首先,您在代码片段中粘贴了您的 Cloudant 用户名和密码。您现在可能想更改密码。
在这行代码中:
db.get("org.couchdb.user:"+username, function(err,body) ...
您正在尝试从 yhsqizvkmp
数据库中读取您的用户文档。我怀疑不需要 "org.couchdb.user:" 前缀。这是 CouchDB 为其 "users" 数据库使用的前缀。由于您没有使用用户数据库,因此可以删除前缀。
折腾了一天我终于解决了这个问题。通过使用 sessionstore-cloudant,我能够将会话存储到 cloudant。
需要记住的几件事
- 使用 sessionstore 时需要 cradle。
连接到 cloudant 时提供端口名称。
app.use(会话({
秘密:"secretword",
store:sessionstore.createSessionStore({
类型:'couchdb',
主持人:cloudanturl,
端口:443,
数据库名称:会话数据库名称,
选项: {
授权:{
用户名:cloudant用户名,
密码:cloudantPassword
}
}
})
}));
我使用 cloudant 作为我的数据库创建了一个快速应用程序。我使用护照作为身份验证中间件。所以默认情况下它将提供内存中的会话存储。所以每次我重新启动应用程序时,会话都会被破坏。
所以我必须使用一些会话存储机制,比如 connect-cloudant。
in app.js 当我的帐户路由被激活时我没有得到 req.user 或 req.isAuthenticated() ? 如果我删除 connect-cloudant 代码并尝试在内存会话存储中使用默认值,我可以获得 req.uesr 和 req.isAuthenticated
app.js
var https = require("https");
var fs = require("fs");
var express = require("express");
var app = express();
var cookieParser = require("cookie-parser");
var session = require("express-session");
var CloudantStore = require('connect-cloudant')(session);
var passport = require("passport");
var strategy = require("passport-local").Strategy;
var path = require("path");
var bodyParser = require("body-parser");
var cons = require('consolidate');
var config = require("./config");
var Cloudant_ip = config.CLOUDENT_IP;
var Cloudant = require('cloudant');
var cloudant = Cloudant(Cloudant_ip);
var Port = config.PORT;
var Local_ip = config.LOCAL_IP;
var cloudantStore = new CloudantStore({
url: Cloudant_ip,
databaseName: "sessions"
});
app.use(express.static("public/_attachments"));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(session({
store: cloudantStore,
secret: 'cloudant',
cookie: {maxAge:24*60*60*1000}
}));
require("./src/config/passport")(app);
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
} else {
res.redirect("/");
}
}
app.engine('html', cons.swig);
app.set('views', path.join(__dirname, 'pages'));
app.set('view engine', 'html');
app.get("/",ensureLoginAuthenticated,function(req,res) {
res.render("index.html");
});
app.get("/myaccount",ensureAuthenticated,function(req,res) {
res.render("my-account.html");
});
https.createServer({
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
}, app).listen(Port,Local_ip, function() {
console.log("server is running on port "+Port);
});
passport.js
var passport = require("passport"),
LocalStrategy = require("passport-local").Strategy,
Cloudant = require("cloudant"),
cloudant = Cloudant("https://username:password@username.cloudant.com"),
db = cloudant.db.use("myuserdatabase");
module.exports = function(app) {
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user,cb) {
cb(null,user);
});
passport.deserializeUser(function(user,cb) {
cb(null, user);
});
passport.use(new LocalStrategy({
usernameField: "username",
passwordField: "password"
},
function(username, password, cb) {
db.get("org.couchdb.user:"+username, function(err,body){
if(!err) {
if(password == body.password) {
var user = {
username: body.email,
password:body.password
};
cb(null, user);
}else {
cb(null, false);
}
}else {
cb(null, false);
}
});
}));
};
我想我在这里遗漏了一些东西所以任何人都可以帮忙。
首先,您在代码片段中粘贴了您的 Cloudant 用户名和密码。您现在可能想更改密码。
在这行代码中:
db.get("org.couchdb.user:"+username, function(err,body) ...
您正在尝试从 yhsqizvkmp
数据库中读取您的用户文档。我怀疑不需要 "org.couchdb.user:" 前缀。这是 CouchDB 为其 "users" 数据库使用的前缀。由于您没有使用用户数据库,因此可以删除前缀。
折腾了一天我终于解决了这个问题。通过使用 sessionstore-cloudant,我能够将会话存储到 cloudant。
需要记住的几件事
- 使用 sessionstore 时需要 cradle。
连接到 cloudant 时提供端口名称。
app.use(会话({ 秘密:"secretword", store:sessionstore.createSessionStore({ 类型:'couchdb', 主持人:cloudanturl, 端口:443, 数据库名称:会话数据库名称, 选项: { 授权:{ 用户名:cloudant用户名, 密码:cloudantPassword } } })
}));