Шлюз nestjs websocket, как разобрать подписанные файлы cookie из рукопожатия для авторизации защиты?
Моя охрана содержит следующий код:
let client: Socket = context.switchToWs().getClient();
const sessionCookie = client.handshake.headers.cookie
.split('; ')
.find((cookie: string) => cookie.startsWith('session'))
.split('=')[1];
const sessionId = cookieParser.signedCookie(
sessionCookie,
process.env.CryptoKey,
);
console.log('SESSION ID',sessionId);
Результирующий идентификатор сеанса все еще подписан после вызова cookieParse.signedCookie();
client.request.cookies и signedCookies не определены.
Идентификатор сеанса есть, и файл cookie отправляется браузером, но я не могу проанализировать его на шлюзе.
2 ответа
Решение
У меня была такая же проблема, и я нашел ответ. Ваш код близок, но причинаcookieParser.signedCookie(...)
снова возвращает подписанный файл cookie, потому что некоторые символы в значении cookie закодированы. Таким образом, он не определяет строку как подписанный файл cookie.
Чтобы это исправить, нужно пройти decodeURIComponent(sessionCookie)
вместо этого в cookieParser.
let client: Socket = context.switchToWs().getClient();
const sessionCookie = client.handshake.headers.cookie
.split('; ')
.find((cookie: string) => cookie.startsWith('session'))
.split('=')[1];
const sessionId = cookieParser.signedCookie(
decodeURIComponent(sessionCookie),
process.env.CryptoKey,
);
console.log('SESSION ID',sessionId);
В дополнение к этому:
client.handshake.headers.cookie?.split('; ')
Необязательная цепочка (.?
) нужен, потому что есть возможность.