Node.js socket.io授权会引发一个“;握手错误“;

Node.js socket.io授权会引发一个“;握手错误“;,node.js,session,express,socket.io,Node.js,Session,Express,Socket.io,在与session.socket.io模块进行了大量的斗争之后,我决定通过设置socket.io的授权来进行socket会话链接。这是我的服务器: /** * Module dependencies. */ var express = require('express'); var routes = require('./routes'); var http = require('http'); var path = require('path'); var io = require('s

在与session.socket.io模块进行了大量的斗争之后,我决定通过设置socket.io的授权来进行socket会话链接。这是我的服务器:

/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
var io = require('socket.io');
var redis = require('redis');
var crypto = require('crypto');
var redisClient = redis.createClient();

var app = express();

// Session Tracking
var cookieParser = express.cookieParser('secret');
var RadisStore = require('connect-redis')(express);
var sessionStore = new RadisStore({
                            host: '127.0.0.1',
                            port: 6379,
                            db: 10,
                            client:redisClient
                        });

// Redis Client Used to store user Information
var redisUsersClient = redis.createClient();
const userDB = require('redis-user')(redisUsersClient);

var PORT = process.env.PORT || 3000,
    HOST = process.env.HOST || 'localhost';

// We define the key of the cookie containing the Express SID
var EXPRESS_SID_KEY = 'express.sid';

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());
app.use(express.methodOverride());
app.use(cookieParser);
app.use(express.session({ store: sessionStore,
                                                    secret: 'SEKR37',
                                                    cookie: { httpOnly: true},
                                                    key: EXPRESS_SID_KEY
                                                }));
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', function(req, res){
    if(!req.session.user)
        res.redirect('/login')
    else {
        res.sendfile('chat.html')
    }
});
app.get('/login', function(req, res){
        res.render('login');
});
app.get('/register', function(req, res){
        res.render('register');
});

app.get('/logout', function(req, res){
        //console.log(req.session);
        sessionStore.destroy(function(err){
            console.log("there was an error: "+err);
        });
        req.session.destroy();
        res.redirect('/login');
        // redisUsersClient.hdel('users', req.session.user, function(err, reply){
//          if(reply==1) {
//              
//              res.redirect('/login');
//          }
//          else
//          res.send("you do not exist");
//      });

});

app.post('/login',function(req, res){
        var password = require('crypto').createHash('sha1WithRSAEncryption').update(req.body.password).digest('utf8');
        var username = req.body.username+"@mychat.com";
        //console.log(req.session);
        userDB.validateUser(username, password, function(result){
            if(result)
            {
                    req.session.user = username;
                    req.session.status = 1;
                    req.session.isLogged = true;
                    req.session.save();
                    res.redirect('/');
            }
            else
            {
                res.send("Wrong Credential. Please <a href='/login'>Try Again</a>");
            }
        });
});
app.post('/register',function(req, res){

        var username = req.body.username + "@mychat.com";
        var password = require('crypto').createHash('sha1WithRSAEncryption').update(req.body.password).digest('utf8');
        var verify = require('crypto').createHash('sha1WithRSAEncryption').update(req.body.verify).digest('utf8');
        if(password==verify)
        {
            userDB.createUser(username, password, function(result) {
                if (result) {
                            redisUsersClient.hset('users', username, password);
                            res.redirect('/');
                } else {
                            res.send("could not create user, Something very unexpected happened");
                }
            });

        }
        else
        {
            res.send("Passwords do not match. please <a href='/register'>try again</a> " );
        }   

});

server = http.createServer(app);
io = io.listen(server);

/****
Maybe I have to set store for io?
****/
//io.set('store', sessionStore);
io.set('authorization', function (data, accept) {
    if(!data.headers.cookie) {
        return accept('No cookie transmitted.', false);
    }
        console.log(sessionStore);

    cookieParser(data, {}, function(parseErr) {
        if(parseErr) { return accept('Error parsing cookies.', false); }

        var sidCookie = (data.secureCookies && data.secureCookies[EXPRESS_SID_KEY]) ||
                        (data.signedCookies && data.signedCookies[EXPRESS_SID_KEY]) ||
                        (data.cookies && data.cookies[EXPRESS_SID_KEY]);
                                                console.log(sidCookie);

        // Then we just need to load the session from the Express Session Store
        sessionStore.load(sidCookie, function(err, session) {
                // And last, we check if the used has a valid session and if he is logged in
                                console.log(session);
            if (err || !session) {
                accept('Error', false);
            } 
                        else {
                    // If you want, you can attach the session to the handshake data, so you can use it again later
                data.session = session;
                                //console.log('success');

                accept(null, true);
            }
        });
    });
});

io.on('connection', function (socket) {


    socket.on('add-user',function(data){
        console.log(data.username);
        clients.username = data.username;
        //console.log(clients);

        socket.broadcast.emit('entrance', data.username + ' has connected');

        io.sockets.emit('add-user',{clients:clients});
    });

        socket.on('disconnect', function(){
            delete clients[session.user];
            io.sockets.emit('add-user',{clients:clients})
        });
});

server.listen(PORT, HOST, null, function() {
    console.log('Server listening on port %d in %s mode', this.address().port, app.settings.env);
});
/**
*模块依赖关系。
*/
var express=需要(“express”);
变量路由=需要('./路由');
var http=require('http');
var path=require('path');
var io=require('socket.io');
var redis=需要('redis');
var crypto=require('crypto');
var redisClient=redis.createClient();
var-app=express();
//会话跟踪
var cookieParser=express.cookieParser('secret');
var RadisStore=require('connect-redis')(express);
var sessionStore=新RadisStore({
主持人:“127.0.0.1”,
港口:6379,
db:10,
客户:redisClient
});
//用于存储用户信息的Redis客户端
var redisUsersClient=redis.createClient();
const userDB=require('redis-user')(redisUsersClient);
var PORT=process.env.PORT | 3000,
HOST=process.env.HOST | |“localhost”;
//我们定义了包含Express SID的cookie的键
var EXPRESS_SID_KEY='EXPRESS.SID';
//所有环境
应用程序集('port',process.env.port | | 3000);
app.set('views',path.join('views');
应用程序集(“查看引擎”、“翡翠”);
app.use(express.favicon());
app.use(express.logger('dev'));
使用(express.json());
app.use(express.urlencoded());
app.use(express.multipart());
app.use(express.methodOverride());
应用程序使用(cookieParser);
app.use(express.session({store:sessionStore,
秘密:“SEKR37”,
cookie:{httpOnly:true},
密钥:EXPRESS\u SID\u密钥
}));
应用程序使用(应用程序路由器);
app.use(express.static(path.join(uu dirname,'public'));
//仅限开发
if('development'==app.get('env')){
app.use(express.errorHandler());
}
app.get('/',函数(req,res){
如果(!req.session.user)
res.redirect(“/login”)
否则{
res.sendfile('chat.html')
}
});
app.get('/login',函数(req,res){
res.render(“登录”);
});
app.get('/register',函数(req,res){
res.render(“寄存器”);
});
app.get('/logout',函数(req,res){
//控制台日志(请求会话);
销毁(函数(错误){
log(“出现错误:+err”);
});
req.session.destroy();
res.redirect('/login');
//redisUsersClient.hdel('users',req.session.user,函数(err,reply){
//如果(答复==1){
//              
//res.redirect('/login');
//          }
//否则
//res.send(“你不存在”);
//      });
});
app.post('/login',函数(req,res){
var password=require('crypto').createHash('sha1withrsacryption').update(req.body.password).digest('utf8');
var username=req.body.username+“@mychat.com”;
//控制台日志(请求会话);
userDB.validateUser(用户名、密码、函数(结果){
如果(结果)
{
req.session.user=用户名;
req.session.status=1;
req.session.isLogged=true;
session.save();
res.redirect('/');
}
其他的
{
res.send(“请发送错误的凭证”);
}
});
});
应用程序post('/register',函数(req,res){
var username=req.body.username+“@mychat.com”;
var password=require('crypto').createHash('sha1withrsacryption').update(req.body.password).digest('utf8');
var verify=require('crypto').createHash('sha1WithRSAEncryption').update(req.body.verify).digest('utf8');
如果(密码==验证)
{
userDB.createUser(用户名、密码、函数(结果){
如果(结果){
redisUsersClient.hset('users',username,password);
res.redirect('/');
}否则{
res.send(“无法创建用户,发生了非常意外的事情”);
}
});
}
其他的
{
res.send(“密码不匹配,请”);
}   
});
server=http.createServer(app);
io=io.listen(服务器);
/****
也许我必须为io设置存储?
****/
//io.set('store',sessionStore);
io.set('授权',功能(数据,接受){
if(!data.headers.cookie){
return accept('未传输cookie',false);
}
console.log(会话存储);
cookieParser(数据,{},函数(parserr){
if(parseErr){return accept('Error parsing cookies'),false);}
var sidCookie=(data.secureCookies&&data.secureCookies[EXPRESS\u SID\u KEY])||
(data.signedCookies&&data.signedCookies[EXPRESS\u SID\u KEY])||
(data.cookies和data.cookies[EXPRESS_SID_KEY]);
console.log(sidCookie);
//然后我们只需要从Express会话存储加载会话
加载(sidCookie,函数(err,session){
//最后,我们检查所使用的会话是否有效,以及他是否已登录
console.log(会话);
如果(错误会话){
接受('错误',错误);
} 
否则{
//如果需要,可以将会话附加到握手数据,以便以后再次使用
data.session=会话;
//console.log('success');
接受(null,true);
}
});
});
});
io.on('连接',函数(套接字){
socket.on('add-user',函数(数据){
console.log(data.username
<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- <script type='text/javascripts', src='/javascripts/client.js'></script> -->
<link rel='stylesheet', href='/stylesheets/style.css'>
<script>

jQuery(document).ready(function () {
    var log_chat_message = function  (message, type, divId) {
        var li = jQuery('<li />').text(message);

        if (type === 'system') {
            li.css({'font-weight': 'bold','color': '#F00','cursor':'pointer'});
        } else if (type === 'leave' || type === 'error') {
            li.css({'font-weight': 'bold', 'color': '#F00'});
        }

        jQuery('#'+divId).append(li);
    };

    // connect to the socket server
    var socket = io.connect(); 

    socket.on('error', function (reason){
                  console.error('Unable to connect Socket.IO', reason);
                });
    socket.on('welcome',function(data){
        alert("yooooo");
        var username = data.username.substr(0,data.username.indexOf('@'));
        var message = "Welcome " + username  ;
        log_chat_message(message, 'system','messages');
        socket.emit('add-user',{username: username});
    });

    socket.on('entrance', function(data){
            //var message = data.username.substr(0,data.username.indexOf('@')) + " joined the chat";
            log_chat_message(data, 'system','messages');

    });

    socket.on('add-user', function(data){

        jQuery.each(data, function(key, value){
            console.log(value.username);
            log_chat_message(value.username, 'system','users-list');
        })

    });

    jQuery('#message_input').keypress(function (event) {
        if (event.which == 13) {
            socket.emit('chat', {message: jQuery('#message_input').val()});
            jQuery('#message_input').val('');
        }
    });
    jQuery('#users-list li').on('click','li',function(){
        alert('hi');
    });
    jQuery('#users-list li').click(function () {
        var index = $(this).index();
        var text = $(this).text();
        alert('Index is: ' + index + ' and text is ' + text);
        jQuery('#user').val('');
        socket.emit('request', {username: jQuery('#user').val()});

    });
});

</script>
<style type = 'text/stylesheet'>
#users-list li {
    cursor:pointer;
}
</style>
</head>

<body>
    <a href='/logout'>Log Out</a>
    <div id="wrapper" style="width:80%;margin:0 auto;">

        <!-- <input type="text" name="user" id="user"/>
        <button id="submit" value="submit">Submit</button> -->
        <div id='mainContaner' style="width:600px;height:400px;margin:0 auto;">
            <div id="online-users" style="width:150px;float:left;height:400px;padding:20px;border:1px black solid;">
                <ul id="users-list" style="list-style:none"></ul>
            </div>
            <div id= "container" style="width:350px;float:left;height:400px;padding:20px;overflow-y:scroll;border:1px black solid;">
                <ul id='messages' style="list-style:none"></ul>
            </div>
            <input type="text" name="message_input" id='message_input' style="width:390px;height:30px;margin-left:193px;margin-top:5px;"/>
        </div>

    </div>
</body>
sessionStore.load(sidCookie, function(err, session) {})
sessionStore.get(sidCookie, function(err, session) {})