生产环境会话对象中不存在 Passport 对象

Posted

技术标签:

【中文标题】生产环境会话对象中不存在 Passport 对象【英文标题】:Passport object does not exist in session object in production environment 【发布时间】:2018-02-02 18:41:45 【问题描述】:

护照对象在我的会话对象上不存在。它在我的本地环境中按预期工作,但是当我在 aws 上移动到我的生产服务器时,没有护照对象。会话已成功存储在我的 dynamoDB 存储中,但未显示在请求中。

这是我对 req.session 对象的期望(以及我在本地环境中得到的):

session: 
   Session 
     cookie: 
       path: '/',
        _expires: null,
        originalMaxAge: null,
        httpOnly: true ,
     passport:  user: [Object]   <------- This Object

这是我在生产中得到的:

 session: 
       Session 
         cookie: 
           path: '/',
            _expires: null,
            originalMaxAge: null,
            httpOnly: true,
            secure: false  
    ---------No sign of the passport object---------

服务器设置:

// DynamoDBStore Configuration
const options = 
  table: 'capture-sessions',
  AWSConfigJSON: 
    accessKeyId: awsConfig.accessKeyId,
    secretAccessKey: awsConfig.secretAccessKey,
    region: 'us-east-2'
  
;

app.use(cors());

app.use(expressSession(
  store: new DynamoDBStore(options),
  secret: 'keyboard cat',
  saveUninitialized: false,
  resave: false,
  cookie: 
    secure: false,
    path: '/',
    httpOnly: true
  
));

app.use(passport.initialize());
app.use(passport.session());
require('./passport/init')(passport);

【问题讨论】:

您在 AWS 中的部署模型是什么? 只是一个基本的 EC2 实例 【参考方案1】:

如果您正在访问远程/生产站点并且它使用https,您需要有secure :true。现在我在你的代码中看到它说安全是错误的。你可以使用这样的东西。

    cookie:  
        secure : process.env.NODE_ENV === "production" ? true : false
   

【讨论】:

以上是关于生产环境会话对象中不存在 Passport 对象的主要内容,如果未能解决你的问题,请参考以下文章

护照js如何在会话中存储用户对象?

如何手动重新加载 Passport 快速会话存储

Express 会话与 PassportJS 会话

会话不是持久的 [PASSPORT]

盖茨比动态样式在生产版本中不起作用

如果标头中不存在 JWT 令牌,如何执行一些逻辑?