我正在使用快递框架.我想从socket.io访问会话数据.我尝试使用client.listener.server.dynamicViewHelpers数据表达dynamicHelpers,但我无法获取会话数据.有一个简单的方法吗?请参阅代码
app.listen(3000);
var io = require('socket.io');
var io = io.listen(app);
io.on('connection', function(client){
// I want to use session data here
client.on('message', function(message){
// or here
});
client.on('disconnect', function(){
// or here
});
});
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) 在node.js和express中,有很多示例显示如何获取会话数据.
正如您在访问第3个链接时所看到的,它是指向StackOverflow的链接.有一个很好的答案,但正如@UpTheCreek在那些评论中指出的那样,connect不再具有parseCookie方法.我也遇到过这个问题.我发现的所有教程都使用connect的parseCookie方法,现在这个方法不存在.所以我问他如何获取会话数据,他说他不知道最好的方法,所以我想我会在这里发布问题.使用express@3.0.0rc4时socket.io,和redis,我们如何获取会话数据并使用它来授权用户?我已经能够使用require('connect').utils.parseSignedCookie;,但是当我这样做时,我总是在握手时收到警告/错误,
warn - handshake error Error
Run Code Online (Sandbox Code Playgroud)
从我所读到的内容来看,听起来这并不是永久的解决方案.
好的,我session.socket.io在我的服务器上工作了.正如我所怀疑的那样,我在授权时陷入困境.我想我可能会以错误的方式解决这个问题,所以请随意纠正我.在我的Redis数据库中,我将获得用户的信息.他们第一次登录时,我想更新他们的cookie,以便它包含他们的用户信息.然后,当他们下次回到网站时,我想检查他们是否有cookie以及用户信息是否存在.如果它不存在,我想将它们发送到登录屏幕.在登录屏幕上,当用户提交信息时,它将针对Redis数据库测试该信息,如果匹配,它将使用用户信息更新cookie.我的问题是这些:
1)如何通过RedisStore更新/更改cookie?
2)看起来会话数据仅保存在cookie中.如果有人关闭了cookie,我如何在页面之间跟踪用户信息?
这是我的适用代码:
//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');
app.configure(function(){
//...hiding unapplicable code...
app.use(cookieParser);
app.use(express.session({secret: 'secret', store: redis_store}));
});
//...hiding code that starts the server and socket.io
var SessionSockets = require('session.socket.io');
var ssockets = new …Run Code Online (Sandbox Code Playgroud) 我正在使用Socket.io我正在构建的聊天应用程序.我正在尝试设置会话,以便我可以在会话之间保持用户的登录.
这是相关的代码:
index.js(服务器)
var cookieParser = require('cookie-parser')();
var session = require('cookie-session')({ secret: 'secret' });
app.use(cookieParser);
app.use(session);
io.use(function(socket, next) {
var req = socket.handshake;
var res = {};
cookieParser(req, res, function(err) {
if (err) return next(err);
session(req, res, next);
});
});
io.on('connection', function(socket){
socket.on('test 1', function(){
socket.handshake.test = 'banana';
});
socket.on('test 2', function(){
console.log(socket.handshake.test);
});
});
Run Code Online (Sandbox Code Playgroud)
chat.js(客户端)
var socket = io();
socket.emit('test 1');
socket.emit('test 2');
Run Code Online (Sandbox Code Playgroud)
上面的代码工作,它将banana按预期打印到控制台.但是,如果我像这样评论'test 1':
var socket = io();
// socket.emit('test 1');
socket.emit('test …Run Code Online (Sandbox Code Playgroud) 有没有一种在Express 3.0中使用Socket.io会话的好方法?一种以安全的方式获取客户会话ID的方法?这样我就可以向会员特定的会员发送通知,并从会员到会员进行私聊?
我在Express 3.0中使用MySQL商店
我目前正在尝试使用express 4.x和socket io 1.4实现会话管理,引用此答案.问题是快速会话函数的第二个参数是res(响应)对象,它在我的路由中返回'undefined'.这个问题已经过时了还是我做错了什么?
var http = require('http');
var session = require('express-session')(
{
saveUninitialized : false,
resave:false,
secret:'secretstuff',
cookie : {
path : '/'
}
}
);
var express = require('express');
var app = express();
app.use(session)
var http_server = http.createServer(app);
var io = require('./sockets')(http_server,session);
Run Code Online (Sandbox Code Playgroud)
这是我的sockets.js
var Server = require('socket.io');
module.exports = function(http_server, session)
{
var io = new Server(http_server);
io.use(function(socket,next){
//socket.request.res === undefined
session(socket.request, socket.request.res,next);
})
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的地方
未捕获的TypeError:参数res是必需的
有没有办法在快速中间件中获取请求的套接字?
IE:
import express from 'express';
import io from 'socket.io';
const app = express();
// combine app and io somehow ...
// When client makes a GET request to '/emit/to/self', that client's socket will recieve the 'hello:world' message.
app.get('/emit/to/self', (req, res) => {
req.socket.emit('hello:world', { ... });
res.send('You just triggered your own socket!')
})
Run Code Online (Sandbox Code Playgroud)
这个想法是 express 中间件具有req.socket引用来自同一客户端的连接套接字的属性。这将允许一些更复杂的用例,例如:
app.post('/image/create', (req, res) => {
createExpensiveImage({
onProgress: (progress) => { req.socket.emit('image:progress', { progress }) },
});
})
Run Code Online (Sandbox Code Playgroud)
客户端将拥有他们刚刚请求通过 API 创建的图像的准确进度条。
aiohttp内置了对websockets 的支持。它非常简单并且运行良好。
文档中示例的简化版本是:
async def handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
# Async iterate the messages the client sends
async for message in ws:
ws.send_str('You sent: %s' % (message.data,))
print('websocket connection closed')
Run Code Online (Sandbox Code Playgroud)
在示例中,ws是对与客户端的 websocket 连接的引用。我可以轻松地将此引用放入request.app,就像@Crandel 在这里所做的那样(即全局状态),但不能放在生产应用程序中,因为每个应用程序服务器(甚至每个工作人员)都有自己的app实例。
对此有公认的模式吗?还有其他方法吗?
注意:我不是指会话。我指的是连接。当服务器 B 中的应用程序代码中发生事件时,我想向连接到服务器 A 的客户端发送一条消息,等等。
我有一个script.js设置服务器,如下所示:
var io_session = require("express-socket.io-session");
var e_session = require("express-session")({
secret: "a-secret",
resave: true,
saveUninitialized: true
});
(...)
//this block is the last "io.use" before the socket logic (io.on("connection"))
io.use(io_session(e_session,{
autoSave: true
}));
Run Code Online (Sandbox Code Playgroud)
在我的typescript/angular2前端环境中使用以下种子https://github.com/NathanWalker/angular2-seed-advanced我使用Http类在多个服务/组件中执行http请求.
然而,当我尝试再次请求服务器我尝试记录用户会话时,没有记录任何内容...我真的不知道为什么会发生这种情况,因为不仅没有保留用户的会话而且会话没有从http到套接字层系统共享(显然,如果没有创建它也不会被共享).
有谁知道这里可能有什么问题?如果需要我可以提供更多信息,但我真的不知道缺少什么.
我想知道socket.IO身份验证的最佳做法是什么.
Alice发出包含Bobs唯一标识符等参数的事件"消息".Bob在收听socket.on('message')事件时接收消息.
如何防止未经身份验证的用户使用Socket.IO连接到服务器,如何仅向特定用户发出事件?
非常感谢您提供所有建议和答案.彼得
我正在尝试使用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, …Run Code Online (Sandbox Code Playgroud) 我偶然发现了这篇文章。它谈到
强制每个用户使用单个 Web 套接字连接
它指出,它的一些优点是它使服务器端逻辑不那么复杂。我的问题是
- - - - - -编辑 - - - - - - -