【问题标题】:Can't access cookie on http in Heroku only https只能在 Heroku 中访问 http 上的 cookie https
【发布时间】:2016-03-05 03:43:15
【问题描述】:

我的节点应用程序中的 cookie 有一个奇怪的问题。它托管在 Heroku 上,我使用存储在 cookie 中的 JSON Web 令牌,该 cookie 由我的 express 中间件进行身份验证。当我登录我的 Macbook pro 时,cookie 已成功存储。但是,当我使用 Linux Mint 桌面或 Android 平板电脑时,站点会登录,但随后会重定向到受保护的路由,并且永远不会设置 cookie。

这是登录时设置 cookie 的位置:

let token = jwt.sign({
    username: user.username,
    email: user.email
}, config.privateKey, {
   expiresIn: '7d'
});
let userResponse = {
    success: true,
    message: 'Successfully logged in!',
    id: user._id,
    email: user.email,
    username: user.username
}
    // set cookie for 7 days
res.cookie('auth_token', 
            token, 
           {maxAge: 604800000, path: "/"}).json(userResponse);

这是我的 server.js 文件:

'use strict';

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const env = process.env.NODE_ENV || "development";
const mongoose = require('mongoose');
const cookieParser = require('cookie-parser');
const config = require('./app/config/config.js');
process.env.PWD = process.cwd();

// Establish connection with MongoDB
mongoose.connect(config.db.connectString);

app.use(cookieParser());

// Allowing X-domain request
var allowCrossDomain = function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Cache-Control");

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
      res.send(200);
    }
    else {
      next();
    }
};
app.use(allowCrossDomain);

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(express.static('public'));

const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error: '));
db.once('open', () => {
  console.log('Connected to sondage database');
});

// ===== Import Routers ======
const userRouter = require('./app/routes/user.routes')(express, app);
const pollRouter = require('./app/routes/poll.routes')(express, app);
const authRouter = require('./app/routes/auth.routes')(express, app);
app.use('/api/users', userRouter);
app.use('/api/polls', pollRouter);
app.use('/api/', authRouter);

// For all other requests, use React Router
app.get('*', function (request, response){
  response.sendFile(process.env.PWD + '/public/index.html');
});

app.listen(process.env.PORT || 3000, () => {
  console.log('Server running');
});

编辑我已将其追溯到 http 与 https 问题。如果我在请求中使用 https,cookie 就会起作用。否则不会设置 cookie。所以我需要一种方法来强制用户使用 HTTPS。

【问题讨论】:

    标签: javascript node.js express cookies


    【解决方案1】:

    我能够使用 heroku-ssl-redirect 节点包解决这个问题。这需要请求并强制浏览器对每个请求使用 https。

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2021-07-24
      • 2016-06-27
      相关资源
      最近更新 更多