T J*_*T J 1 cookies node.js express socket.io express-session
我正在尝试使用socket.io实现身份验证和会话.
经过大量的研究1,我设置了以下使用快速和快速会话.
问题是,express和socket.io连接似乎有不同的会话,因为id我得到的是不同的.
此外,浏览器中没有从我的应用程序中设置cookie(这可能是两个组件创建不同会话的原因?)
我正在使用express 4.13.3express-session 1.12.1和socket.io 1.3.7.
下面是我设置的服务器端代码:
var app = require('express')();
var server = app.listen(80);
var parser = require('body-parser');
var Session = require('express-session');
var io = require('socket.io')(server);
var game = require('./game.js');
var session = Session({
secret: 'some secret',
resave: false,
saveUninitialized: false,
cookie: {
'name': 'test',
httpOnly: false,
secure: false,
maxAge: ((60 * 1000) * 60)
}
});
app.use(parser.urlencoded({
extended: false
}));
app.use(session);
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
app.post('/login', function(req, res) {
console.log('login %s', req.session.id);
console.dir(req.session, {
color: true
});
res.json({
status: 'success'
});
});
io.use(function(socket, next) {
session(socket.handshake, {}, next);
});
console.log('socket server started @ %s !', 80);
io.on('connection', function(socket) {
console.log('user connected %s', socket.handshake.session.id);
console.dir(socket.handshake.session, {
color: true
});
socket.on('disconnect', function() {
console.log('user disconnected');
console.dir(socket.handshake.session, {
color: true
});
});
});
Run Code Online (Sandbox Code Playgroud)
以及客户端的代码用于测试目的:
$.ajax({
url: 'http://127.0.0.1:80/login',
type:'post',
success: function(response) {
var socket = io('http://127.0.0.1:80');
}
});
Run Code Online (Sandbox Code Playgroud)
以下是控制台中的输出:
这是浏览器中的资源部分:
我甚至很困惑地看到session对象id在登录控制台时没有任何属性,但session.id打印出不同的值.也许这是来自对象原型链或其他东西.
我可以想到的唯一区别是我的代码和教程,它们都是index.html从同一个快速服务器提供的页面.在我的情况下,我在本地文件.
我已经读过某些地方,在这种情况下,我必须http在建立socket.io连接之前发送请求.
该socket.io.js客户端库是从一个由快递和socket.io(共享相同的服务器提供服务<script src="http://127.0.0.1/socket.io/socket.io.js"></script>),除了这个我也打快速通道/login建立套接字连接之前的测试目的.
所以我想知道为什么客户端没有设置cookie,为什么express和socket请求创建了不同的会话..?我在这里想念的是什么..?
1代码主要基于:
PS:我想要做的是,当一个套接字客户端重新连接时,我需要让他回到他所处的会话细节.我真的不想与express共享会话,但是我发现使用socket.io实现会话的唯一方法是表达中间件.
这个问题与express或socket.io无关.
问题是,我从Express和socket.io服务器以外的本地服务器加载项目.
所以这是一个跨域的ajax请求,在这种情况下,某些浏览器拒绝处理Set-Cookie标头.
我们可以通过添加修复此问题
xhrFields: {
withCredentials: true
},
Run Code Online (Sandbox Code Playgroud)
在这个答案中有关的ajax选项
或者,如果你正在使用角度,发送{withCredentials: true}像
$http({withCredentials: true, ...}).get(...)如本回答所述.
在服务器端,设置此标头:
res.header("Access-Control-Allow-Credentials", 'true');
Run Code Online (Sandbox Code Playgroud)
如果你添加它,chrome将不再允许你*在Access-Control-Allow-Origin标题中使用通配符.
您还应将其设置为特定的允许域.
res.header("Access-Control-Allow-Origin", "allowed domains");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3704 次 |
| 最近记录: |