标签: express-session

为什么我会收到“通过指定其 SameSite 属性来指示是否在跨站点请求中发送 cookie”?

在 Chrome 警告中,它说“如果 cookie 应该在跨站点请求中发送,则指定 SameSite=None 和安全。这允许第三方使用。” 如何使用 express-session 正确执行此操作?

app.use(
  cors({
    credentials: true,
    origin: ["http://localhost:3000", "https://elated-jackson-28b73e.netlify.app"] //Swap this with the client url 
  })
);
var sess = {
  secret: 'keyboard cat',
  cookie: {}
}

if (app.get('env') === 'production') {
  app.set('trust proxy', 1) // trust first proxy
  sess.cookie.secure = true // serve secure cookies
  sess.cookie.sameSite = 'none'
}

app.use(session(sess))
Run Code Online (Sandbox Code Playgroud)

cookies express-session

47
推荐指数
1
解决办法
3万
查看次数

使用saveUninitialized并在快速会话中重新保存

我是MEAN堆栈中的新手.我读了快递会话github doc,但有一些我无法清除的选项.那些选择是saveUninitializedresave.

任何人都可以请举例说明使用的优点是什么saveUninitialized,resave以及如果我们在该选项中更改布尔值会产生什么影响.

句法:-

app.use(session({
  resave: false,
  saveUninitialized: true,
}))
Run Code Online (Sandbox Code Playgroud)

node.js express mean-stack express-session

37
推荐指数
4
解决办法
2万
查看次数

socket.io身份验证与共享会话数据,io.use()如何工作

灵感来自如何与Socket.IO 1.x和Express 4.x共享会话?我以一些"干净"的方式实现套接字身份验证,不需要使用cookie-parser并从头文件中读取cookie,但很少有项目对我来说不清楚.示例使用last stable socket.io 1.3.6版.

var express      = require('express'),
    session      = require('express-session'),
    RedisStore   = require('connect-redis')(session),
    sessionStore = new RedisStore(),
    io           = require('socket.io').listen(server);

var sessionMiddleware = session({
    store   : sessionStore,
    secret  : "blabla",
    cookie  : { ... }
});

function socketAuthentication(socket, next) {
  var sessionID = socket.request.sessionID;

  sessionStore.get(sessionID, function(err, session) {
      if(err) { return next(err); }

      if(typeof session === "undefined") {
          return next( new Error('Session cannot be found') );
      }
      console.log('Socket authenticated successfully');
      next();
  });
}

io.of('/abc').use(socketAuthentication).on('connection', function(socket) …
Run Code Online (Sandbox Code Playgroud)

javascript node.js express socket.io express-session

18
推荐指数
1
解决办法
1305
查看次数

做出反应的cookie

我需要知道我的用户是否已连接.为此,我想阅读我在服务器端使用快速会话设置的cookie:

app.use(session({
    secret: 'crypted key',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false } // Put true if https
  }))
Run Code Online (Sandbox Code Playgroud)

app.post('/connect_user', (req, res) => {
    req.session.cookie.username = req.body.username
    findUserData('username', req.body.username, req, (userData) => {
        req.session.cookie.id = userData.id
        req.session.cookie.username = userData.username
        res.redirect('/profil')
    })
})
Run Code Online (Sandbox Code Playgroud)

我尝试使用react-cookie,但它不起作用,但我复制/粘贴npm react-cookie doc:

import React from 'react';
import Landing from './Landing';
import Home from './Home';
import Profil from './Profil';
import {BrowserRouter as Router, Route} from 'react-router-dom'
import { instanceOf } from 'prop-types';
import { Cookies } from …
Run Code Online (Sandbox Code Playgroud)

cookies session reactjs express-session react-cookie

16
推荐指数
6
解决办法
3万
查看次数

Express JS/Node JS:当secure=true,sameSite:'none'时浏览器不设置cookie

如果我在本地运行服务器,它会设置 cookie,但是当它在线托管时:

  1. 如果secure=false, sameSite: 'none' 然后我收到以下错误

Cookie“connect.sid”很快就会被拒绝,因为它的“sameSite”属性设置为“none”或无效值,没有“secure”属性。要了解有关“sameSite”属性的更多信息,请阅读 https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite

然后我尝试使用 secure=true

  1. 如果 secure=true, sameSite: 'none' 那么我知道它应该可以工作,

它可以工作,并且当服务器在本地托管时设置了 cookie。但是当它托管在 heroku 中时,cookie 没有设置,我没有收到任何错误。

好像客户端网站不安全,但它在 url 框中显示 https

我在这里做错了什么?

会话配置:

router.use(
    session({
        cookie: {
            secure: true,
            maxAge: 86400,
            sameSite: "none",
        },
        secret: process.env.SESSION_SECRET,
        resave: false,
        saveUninitialized: false,
    })
);
Run Code Online (Sandbox Code Playgroud)

注意:我已经启用了凭据设置为 true 的 cors XHR cookies 选项卡中的 cookies 选项卡为空前端和后端分别托管在 heroku XMLHttpRequest 用于发送 withCredentials 设置为 true 的 post 请求。

XHRPOSThttps://sih-drs-prototype-backend-2.herokuapp.com/api/outrages/login [HTTP/1.1 200 OK 1625ms]

POST https://sih-drs-prototype-backend-2.herokuapp.com/api/outrages/login Status200 OK VersionHTTP/1.1 Transferred367 B(2B大小)

Access-Control-Allow-Credentials
    true
Access-Control-Allow-Origin
    https://tempautocomplete.herokuapp.com …
Run Code Online (Sandbox Code Playgroud)

cookies node.js express express-session

15
推荐指数
1
解决办法
4951
查看次数

在CORS呼叫后,Express Session不会持续存在

TL; DR:

无法通过Express,Express-Session和Express-Cors在Backbone App和Node.js服务器之间执行的多个API调用之间保持会话持久性.看起来每次通话后会话都会重新初始化/丢失.

长版:

我正在运行客户端Backbone/React/Flux应用程序,在运行localhost:3000的Node.js服务器上执行以下调用localhost:4242:

Http电话

POST http:// localhost:4242/api/session

 RESPONSE HEADERS
 Content-Type application/json; charset=utf-8
 Set-Cookie connect.sid=s%3AFeNYY5GQGvkyRvOym7DhysprePaQr7xP.BrxOPP56k9pDpxQPvwjDFaxkEYoHU%2FAEtNUIXGltqjI; Domain=http://localhost:3000; Path=/
 Vary Origin
 X-Powered-By Express
 access-control-allow-credentials   true
 access-control-allow-orign http://localhost:3000
 [...]

 REQUEST HEADERS
 Accept application/json, text/javascript, */*; q=0.01
 Content-Type application/json; charset=utf-8
 Cookie connect.sid=s%3AjP4iADZvRnDHbJcCE8H81Zy6TIehj9BJ.eDOTw44GcHqq8i2dslBGd43tXMQ22ENl31fRizdC8iA
 Host localhost:4242
 Origin http://localhost:3000
 Referer http://localhost:3000/login
 [...]
Run Code Online (Sandbox Code Playgroud)

获取http:// localhost:4242/api/users

 RESPONSE HEADERS
 Content-Type application/json; charset=utf-8
 Set-Cookie connect.sid=s%3ARxf91_vLMBqzB6xN-0QFIIk_-SyBP9_8.F1Mr%2BVSkYNJ6MqnzO%2BsxxfwXRinIX6th80SoukG1QBM;Domain=http://localhost:3000; Path=/
 Vary Origin
 X-Powered-By Express
 access-control-allow-credentials   true
 access-control-allow-orign http://localhost:3000
 [...]

 REQUEST HEADERS
 Accept application/json, text/javascript, */*; q=0.01
 Content-Type application/json; …
Run Code Online (Sandbox Code Playgroud)

node.js cors express backbone.js express-session

14
推荐指数
1
解决办法
5063
查看次数

saveUninitialized和resave有什么区别?

Express的会话中间件提供了几个可配置选项.

resave:'强制将会话保存回会话存储区,即使在请求期间从未修改过会话.

saveUninitialized:'强制将"未初始化"的会话保存到商店.会话在新的但未修改时未初始化.

看来这两个选项都用于保存未修改的会话.有什么不同?

session node.js express express-session

12
推荐指数
1
解决办法
3432
查看次数

命名空间“Express”没有导出成员“SessionData”

我正在尝试构建一个 typeScript 项目,但它有一个错误,我不知道它来自哪里,而且自上次以来没有任何变化。


node_modules/connect-mongo/src/types.d.ts:113:66 - error TS2694: Namespace 'Express' has no exported member 'SessionData'.

113         get: (sid: string, callback: (err: any, session: Express.SessionData | null) => void) => void;
                                                                     ~~~~~~~~~~~

node_modules/connect-mongo/src/types.d.ts:114:45 - error TS2694: Namespace 'Express' has no exported member 'SessionData'.

114         set: (sid: string, session: Express.SessionData, callback?: (err: any) => void) => void;
                                                ~~~~~~~~~~~

node_modules/connect-mongo/src/types.d.ts:118:47 - error TS2694: Namespace 'Express' has no exported member 'SessionData'.

118         touch: (sid: string, session: Express.SessionData, callback?: (err: any) => void) => void;
                                                  ~~~~~~~~~~~ …
Run Code Online (Sandbox Code Playgroud)

node.js express typescript express-session

12
推荐指数
2
解决办法
4329
查看次数

node express,如何在注销后清除cookie

基本上我正在从a.example.com重定向到www.example.com,我希望能够在www.example.com上删除cookie(因为cookie是以.example.com作为cookie域创建的),但是以下代码不起作用.

我知道这个问题似乎是重复的问题,我尝试了类似问题的一切,但它不起作用.看看我已经尝试过的代码.

使用express 3.0.3和node 0.10.32.

快速会话中间件

...
var cookiedata = { 
    domain              : '.example.com',
    originalMaxAge      : null,
    httpOnly            : false
};

app.use(express.session({
        store  : ..., 
        secret : ..., 
        key    : 'express.sid', 
        cookie : cookiedata 
}));
...
Run Code Online (Sandbox Code Playgroud)

注销功能

function logout(req, res){
    ...

    req.session.destroy(function(){
        req.session = null;

        res.clearCookie('express.sid', { path: '/' });
        res.redirect('https://www.example.com');

    });
}
Run Code Online (Sandbox Code Playgroud)

我从类似问题中尝试过的

  1. https://github.com/strongloop/express/issues/691

所以我把path : '/'快递会话中间件放在如下:

app.use(express.session({ ..., path : '/' });
Run Code Online (Sandbox Code Playgroud)

没有成功.

  1. https://groups.google.com/forum/#!topic/express-js/PmgGMNOzhgM
    我用过res.clearCookie:res.cookie('express.sid','',{expires:new Date(1),路径:'/'});

没有成功.

javascript cookies node.js express express-session

11
推荐指数
1
解决办法
2万
查看次数

NodeJS redis connect会话ID在保持持久性时会重新生成

我尝试在NodeJS中使用Redis的标准会话持久性:

var express = require('express');
var RedisStore = require('connect-redis')(express);
var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({ 
    secret: "keyboard cat", 
    store: new RedisStore, 
    key: 'sid' 
  }));
});


app.get('/', function (req, res) {
  if (req.session.isValid) {
    console.log("There is an existing session.");
  }
  else {
    req.session.isValid = true;
    console.log("New session.");
    console.log('Old session ID: ' + req.header('Cookie'));
    console.log('New session ID: ' + req.session.id);
  }

  res.render('index', {'title': s});
});
app.listen(4000);
Run Code Online (Sandbox Code Playgroud)

从理论上讲,我应该看到"新会议"这一行.网站的一次和所有后续调用应导致"存在现有会话".不幸的是,每次调用都会重新生成新的会话ID.浏览器中的cookie工作正常,内容正确传输,我可以看到它

req.header('Cookie')
Run Code Online (Sandbox Code Playgroud)

这是控制台日志的样子:

[app.js] New session.
[app.js] Old session ID: …
Run Code Online (Sandbox Code Playgroud)

session redis node.js express express-session

10
推荐指数
1
解决办法
2324
查看次数