Как заставить мой сервер вернуть правильное значение заголовка Sec-WebSocket-Accept? - PullRequest
0 голосов
/ 26 мая 2019

Кажется, я получаю неправильное хеш-значение, учитывая ключ через мой webSocket. Из того, что я могу сказать, клиентская сторона сокета работает, потому что, когда у меня есть это, соединяются с другими серверами, это успешно.

index.js

const http = require('http')
const cryp=require('crypto')
const port = 8080
var ourHTML=require('fs').readFile("index.html",(err,data) => {
        if(err) throw err;
        ourHTML = data.toString();
    });

const requestHandler = (request, response) => {
    //console.log(request)
    response.end(ourHTML)
}

const server = http.createServer(requestHandler)

server.on('upgrade',(req,socket)=>{
    if(req.headers['upgrade'] !== 'websocket'){
        socket.end('HTTP/1.1 400 Bad Request');
        return;
    }
    const hash=getAVal(req.headers['sec-websocket-key']);
    console.log(hash);
    socket.write([
        "HTTP/1.1 101 Web Socket Protocol Handshake",
        "Upgrade: WebSocket",
        "Connection: Upgrade",
        `Sec-WebSocket-Accept: ${hash}`
    ].join('\r\n')+'\r\n\r\n');
    //socket.end();
});

function getAVal(key){
    console.log(key);
    return cryp
    .createHash('sha1')
    .update(key+'258EAFA5-E914–47DA-95CA-C5AB0DC85B11', 'binary')
    .digest('base64');
}

server.listen(port, (err) => {
    if(err){
        return console.log("Uhh ohh,  "+err.stack,err)
    }
    console.log("server listening at "+port)
})

index.html

<html>
<head><title>Local Server</title></head>
<body><h1>Local Server Body</h1><p id="p">To Change</p></body>

<script>
console.log("here");
var ws=new WebSocket("ws://10.0.0.150:8080");
//var ws=new WebSocket("wss://echo.websocket.org");
setInterval(req,1000);

function req(){
    ws.send("tickReq");
}

ws.addEventListener('open', () => {
    ws.send("Hello");
});

ws.addEventListener('message', event => {
    document.getElementById("p").innerHTML=event.data;
});

</script>

</html>

Примером ключа и хэш-пары при запуске является:

PxsrStN1CGLK / JBYydUFjg ==

QAK + TE6u + sV705GI + LpP4yKM04Y =

Верхняя часть - это ключ, данный браузером, а нижняя часть - это то, что возвращает функция getAVal, и это сообщение вызывается неверно.

Ошибка во время рукопожатия WebSocket: неверное значение заголовка Sec-WebSocket-Accept

1 Ответ

0 голосов
/ 26 мая 2019

В вашем примере строка base64

"QAK+TE6u+sV705GI+LpP4yKM04Y=" 

декодируется в байты

4002BE4C4EAEFAC57BD39188F8BA4FE3228CD386

Однако правильный хэш SHA1 для строки

"PxsrStN1CGLK/JBYydUFjg==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

байты

2FEA5BE3299C27C3DD290853435C7529BBBC0F0F

, и форма этих байтов в кодировке base64 равна

"L+pb4ymcJ8PdKQhTQ1x1Kbu8Dw8="

Это означает, что ваш хэш SHA1 неверен для начала.

Попробуйте позвонить digest()без указания encoding, чтобы вы могли получить Buffer вместо string, а затем убедиться, что он соответствует приведенным выше байтам.

Затем преобразовать эти байты в base64 с помощью Buffer.toString("base64") и убедиться, что он соответствуетстрока выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...