Aus*_*ust 13 authentication session node.js express socket.io
在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 SessionSockets(io, redis_store, cookieParser);
io.configure(function(){
io.set('authorization', function(handshake, callback){
if(handshake.headers.cookie){
//var cookie = parseCookie(handshake.headers.cookie);
//if(cookie.user){
// handshake.user = cookie.user;
//}
}
callback(null, true);
});
});
ssockets.on('connection', function(err, socket, session){ ... });
Run Code Online (Sandbox Code Playgroud)
看看socket.io的wiki.特别是部件配置Socket.IO和授权和握手.
它展示了如何使用socket.io和a RedisStore提供两种不同的授权方法.
有关连接express v3,redis和socket.io的更多信息
切换session.socket.io一段时间后,由于加载会话信息时模块的异步特性,我遇到了一些问题。所以我最终创建了自己的模块,名为session.io。它的使用方式如下:
var express = require('express');
var app = express();
var server = require('http').createServer(app);
//Setup cookie and session handlers
//Note: for sessionStore you can use any sessionStore module that has the .load() function
//but I personally use the module 'sessionstore' to handle my sessionStores.
var cookieParser = express.cookieParser('secret');
var sessionStore = require('sessionstore').createSessionStore();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
//...truncate...//
app.use(cookieParser);
//make sure to use the same secret as you specified in your cookieParser
app.use(express.session({secret: 'secret', store: sessionStore}));
app.use(app.router);
});
app.get('/', function(req, res){
res.send('<script src="/socket.io/socket.io.js"></script><script>io.connect();</script>Connected');
});
server.listen(app.get('port'), function(){
console.log('Listening on port ' + app.get('port'));
});
var io = require('socket.io').listen(server);
io.configure(function(){
//use session.io to get our session data
io.set('authorization', require('session.io')(cookieParser, sessionStore));
});
io.on('connection', function(socket){
//we now have access to our session data like so
var session = socket.handshake.session;
console.log(session);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5372 次 |
| 最近记录: |