Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 反序列化用户isn';t调用,cookie未使用express和passportJS发送到客户端_Node.js_Express_Passport.js - Fatal编程技术网

Node.js 反序列化用户isn';t调用,cookie未使用express和passportJS发送到客户端

Node.js 反序列化用户isn';t调用,cookie未使用express和passportJS发送到客户端,node.js,express,passport.js,Node.js,Express,Passport.js,我有一个带有passportJS本地策略身份验证的express应用程序。该应用程序被部署到Heroku的免费层(*.herokuapp.com)。在生产中,如果将cookie.secure设置为true,则通过https,将永远不会调用反序列化用户,并且不会将cookie发送到客户端。 我知道这个问题已经被问了很多次了,我已经找了一段时间了。让我抓狂的是,在实施了两天不同的解决方案之后,例如在中,我昨天终于让它开始工作了。但现在它又不起作用了。我可以在日志中看到用户和会话对象,但未调用反序列化

我有一个带有passportJS本地策略身份验证的express应用程序。该应用程序被部署到Heroku的免费层(
*.herokuapp.com
)。在生产中,如果将
cookie.secure
设置为
true
,则通过https,将永远不会调用
反序列化用户
,并且不会将cookie发送到客户端。
我知道这个问题已经被问了很多次了,我已经找了一段时间了。让我抓狂的是,在实施了两天不同的解决方案之后,例如在中,我昨天终于让它开始工作了。但现在它又不起作用了。我可以在日志中看到用户和会话对象,但未调用
反序列化用户
req.isAuthenticated()
在passport.authenticate()之外的任何位置返回false,并且客户端中没有cookie。
可能有用的其他信息是,我正在使用Knex会话存储来存储会话,并且我正在将PostgreSQL与Knex一起使用。
以下是相关代码:

servsr.js

const express=require('express');
常量头盔=需要(“头盔”);
const bodyParser=require('body-parser');
const cors=需要(“cors”);
const passport=require(‘passport’);
require('dotenv').config();
const dev_env=process.env.LOCAL_dev;
const knex=require('knex')({
客户:`pg`,
连接:{
主机:dev_env?process.env.dev_DB_主机:null,
用户:dev_env?process.env.dev_用户:null,
密码:dev_env?process.env.dev_密码:null,
数据库:dev_env?process.env.dev_DB_NAME:null,
connectionString:dev_env?null:process.env.DATABASE_URL,
ssl:dev_env?null:true
}
});
常量app=express();
应用程序集('trust proxy',true);
app.use(cors({origin:true,credentials:true}));
应用程序使用(功能(请求、恢复、下一步){
res.header('Access-Control-Allow-Credentials',true);
res.header(“访问控制-允许-来源”,请求标题-来源);
res.header('Access-Control-Allow-Methods','GET、PUT、POST、DELETE');
res.header('Access-Control-Allow-Headers','Origin,Accept,Accept Version,Content-Length,Content-MD5,Content-Type,Date,X-Api-Version,X-Response-Time,X-PINGOTHER,X-CSRF-Token,Authorization');
如果(请求方法==“选项”){
返回res.status(200.end();
}否则{
next();
}
});
应用(头盔());
use(bodyParser.json({limit:'5mb'}));
要求(“/护照”)(应用程序);
const signin=require('./控制器/signin');
const uploadData=require('./控制器/uploadData');
const getData=require('./控制器/getData');
app.get('/',(req,res)=>{res.send('its working!');})
app.post('/signin',(请求,回复,下一个)=>{signin.handleSignin(请求,回复,下一个,passport)})
//app.get('/success',(req,res)=>res.status(200.json(true))
//app.get('/fail',(req,res)=>res.status(400.json('fail'))
app.get('/logout',(请求、回复)=>{
请求注销();
res.clearCookie(process.env.COOKIE\u SECRET);
res.status(200.json)(“注销”);
})
app.post('/upload data',(req,res)=>{
log('upload-data req.headers.cookie:',req.headers.cookie)
console.log('上传数据请求协议:',请求协议)
如果(请求isAuthenticated()){
上传数据。handleUploadData(请求、回复、knex)
}否则{
res.status(400.json)(“请求未经身份验证”);
}
})
app.get('/get data',(请求,res)=>{
log('get-data req.headers.cookie:',req.headers.cookie)
console.log('get-data req.protocol:',req.protocol)
如果(请求isAuthenticated()){
getData.handleDataRequest(请求、回复、knex)
}否则{
res.status(400.json)(“请求未经身份验证”);
}
})
app.listen(process.env.PORT,()=>{
log(`listing on port${process.env.port}`);
})
passport.js

const session=require('express-session');
const passport=require(‘passport’);
const bcrypt=require('bcrypt');
const KnexSessionStore=require('connect-session-knex')(会话);
const dev_env=process.env.LOCAL_dev;
const knex=require('knex')({
客户:`pg`,
连接:{
主机:dev_env?process.env.dev_DB_主机:null,
用户:dev_env?process.env.dev_用户:null,
密码:dev_env?process.env.dev_密码:null,
数据库:dev_env?process.env.dev_DB_NAME:null,
connectionString:dev_env?null:process.env.DATABASE_URL,
ssl:dev_env?null:true
}
});
const store=新的KnexSessionStore({knex});
module.exports=(应用程序)=>{
应用程序使用(会话)({
机密:process.env.COOKIE\u secret,
saveUninitialized:false,
resave:false,
滚动:是的,
商店,
曲奇:{
httpOnly:true,
最大值:1000*60*60*2,//2小时
安全:是的,
//域:process.env.domain,
路径:'/'
} 
}));
app.use(passport.initialize());
app.use(passport.session());
const LocalStrategy=require('passport-local')。策略;
passport.use(新本地策略)(用户名、密码、完成)=>{
knex.select('id','name','hash')。from('login'))
.where('name','=',username)
。然后(用户=>{
如果(!用户){
返回完成(null,false);
}
const isValid=bcrypt.compareSync(密码,用户[0].hash);
如果(!isValid){
返回完成(null,false);
}
返回完成(空,用户[0]);
})
.catch(错误=>{
控制台日志(err);
返回完成(err);
})
}));
passport.user((用户,完成)=>{
完成(null,user.id);
});
passport.deserializeUser((id,done)=>{
console.log('反序列化!')
knex.select('id')。from('login'))
.where('id','=',id)
。然后(id=>{
完成(空,id)
})
.catch(错误=>{
console.log(错误)
完成(错误,空)
});
});
}
签名

const handleSignin=(请求、回复、下一步、护照)=>{
log('signin req.headers.cookie:',req.headers.cookie);
console.log('signin req.protocol:',req.protocol.);
const{username,password}=req.body;
如果(!用户名)||