Шлюз 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('; ')

Необязательная цепочка (.?) нужен, потому что есть возможность.

Другие вопросы по тегам