在 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) 我是MEAN堆栈中的新手.我读了快递会话github doc,但有一些我无法清除的选项.那些选择是saveUninitialized和resave.
任何人都可以请举例说明使用的优点是什么saveUninitialized,resave以及如果我们在该选项中更改布尔值会产生什么影响.
句法:-
app.use(session({
resave: false,
saveUninitialized: true,
}))
Run Code Online (Sandbox Code Playgroud) 灵感来自如何与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) 我需要知道我的用户是否已连接.为此,我想阅读我在服务器端使用快速会话设置的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)如果我在本地运行服务器,它会设置 cookie,但是当它在线托管时:
Cookie“connect.sid”很快就会被拒绝,因为它的“sameSite”属性设置为“none”或无效值,没有“secure”属性。要了解有关“sameSite”属性的更多信息,请阅读 https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite
然后我尝试使用 secure=true
它可以工作,并且当服务器在本地托管时设置了 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) TL; DR:
无法通过Express,Express-Session和Express-Cors在Backbone App和Node.js服务器之间执行的多个API调用之间保持会话持久性.看起来每次通话后会话都会重新初始化/丢失.
长版:
我正在运行客户端Backbone/React/Flux应用程序,在运行localhost:3000的Node.js服务器上执行以下调用localhost:4242:
Http电话
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)
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) Express的会话中间件提供了几个可配置选项.
resave:'强制将会话保存回会话存储区,即使在请求期间从未修改过会话.
saveUninitialized:'强制将"未初始化"的会话保存到商店.会话在新的但未修改时未初始化.
看来这两个选项都用于保存未修改的会话.有什么不同?
我正在尝试构建一个 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) 基本上我正在从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)
我从类似问题中尝试过的
所以我把path : '/'快递会话中间件放在如下:
app.use(express.session({ ..., path : '/' });
Run Code Online (Sandbox Code Playgroud)
没有成功.
没有成功.
我尝试在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) express-session ×10
express ×8
node.js ×8
cookies ×4
session ×3
javascript ×2
backbone.js ×1
cors ×1
mean-stack ×1
react-cookie ×1
reactjs ×1
redis ×1
socket.io ×1
typescript ×1