Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Websocket握手,JWT了解安全性_Node.js_Security_Websocket_Jwt_Handshaking - Fatal编程技术网

Node.js Websocket握手,JWT了解安全性

Node.js Websocket握手,JWT了解安全性,node.js,security,websocket,jwt,handshaking,Node.js,Security,Websocket,Jwt,Handshaking,嗨,我想了解这个握手是如何工作的,JWT。所以我有了一个网页,一些用户可以自己登录。然后我创建一个JWT,所以当我向服务器发出请求时,我使用这个令牌来验证用户。我想创建和WebSocket连接,并使用这个令牌。所以我这样做服务器 var server = app.listen(3000, function(){ console.log('Server listening on', 3000); }); require('./websockets').connect(server); 在

嗨,我想了解这个握手是如何工作的,JWT。所以我有了一个网页,一些用户可以自己登录。然后我创建一个JWT,所以当我向服务器发出请求时,我使用这个令牌来验证用户。我想创建和WebSocket连接,并使用这个令牌。所以我这样做服务器

var server = app.listen(3000, function(){
    console.log('Server listening on', 3000);
});
require('./websockets').connect(server);
在这个文件中,我有websockets.js

var _  = require('lodash')
var ws = require('ws')
var url = require('url')
var jwt = require('jwt-simple')
var config = require('./config')
var clients = [];

exports.connect = function(server){

    var wss = new ws.Server({server:server});
        wss.on('connection', function(ws){

            var location = url.parse(ws.upgradeReq.url, true);
            var token = location.query.token;

            console.log( ws.upgradeReq.headers );

            console.log( 'New connection.' );
            try {
                var user = jwt.decode( token, config.secret );
            }catch (err) {
                ws.close()
            }

            clients[token] = ws

            ws.on('message', function(data, flags) {

                console.log( ws.upgradeReq.headers );

                console.log( data )
            });

            ws.on('close', function(){
                _.remove(clients, token)
                if( user ){
                    console.log('User disconnect:' + user.username);
                }else{
                    console.log( 'Authentication failed.' );
                }
            })

    })

}
所以问题是,如果我登录broswer并复制头中的令牌。我可以使用wscat连接到具有不同终端的服务器。所以我试着去理解握手是如何工作的,这能帮助我避免这种情况

所以我的想法是得到这个表单的标题
mtmtq0mjk1ot3njy1na==

 connection: 'Upgrade',
  upgrade: 'websocket',
  host: 'localhost:3000',
  'sec-websocket-version': '13',
  'sec-websocket-key': 'MTMtMTQ0Mjk1OTI3NjY1NA==',
  'sec-websocket-extensions': 'permessage-deflate; client_max_window_bits' 

将其添加到客户端,并在每次调用表单中检查客户端的值是否相同,但不确定是否正确。我不能很好地理解它,所以如果有人能解释这会很好,或者如果我没有ssl连接,我可以用什么来防止这次劫持。

-秒websocket密钥是
用于防止缓存代理重新发送以前的websocket对话,[24]并且不提供任何身份验证,隐私或完整性。您如何验证您的WS-connection?首先感谢您的评论。身份验证发生在web上,我向api发出请求,返回JWT,然后我将此令牌添加到http头中,以便每个其他请求都有此令牌。在我的应用程序中,我有一个中间件,用于检查令牌是否有效。因此,我希望有和web套接字以及,所以我附加了一个到我的express服务器。因此,如果有人想要连接到套接字,则需要一个令牌,该令牌随查询一起传递。这是正确的方法还是我错过了什么?问题是我可以从10个不同的终端连接这个令牌。你的JWT是否会被发送到套接字,并且它是否在你的后端经过身份验证?如果用户能够获取令牌并自己使用它,这应该不会是一个问题-他们只能攻击自己的会话。同源策略将阻止另一个域获取使用的令牌。请尝试以下操作: