嗨,我正在尝试了解此握手的工作原理和 JWT。所以我有一些东西作为网页,一些用户可以去那里登录自己。然后我创建了一个 JWT,所以当我向服务器发出请求时,我使用这个令牌来验证用户。我想创建和 websoket 连接并使用这个令牌。所以我做了这样的服务器
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.' );
}
})
})
}
所以问题是,如果我登录浏览器并复制标题中的那个令牌。我可以使用 wscat 连接到具有不同终端的服务器。所以我试图了解握手是如何工作的,这可以帮助我预防这一点。
所以我的想法是让这个表格成为标题MTMtMTQ0Mjk1OTI3NjY1NA==
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 连接,我可以用什么来防止这种劫持。