NodeJS Nestjs WebSocket网关,如何解析握手中签名的cookie进行保护授权?

3lxsmp7m  于 2022-12-29  发布在  Node.js
关注(0)|答案(2)|浏览(103)

我的guard包含以下代码:

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()后,生成的sessionId仍然是签名的;
client.request.cookies和signedCookies都是未定义的。
会话ID在那里,cookie正在由浏览器发送,但我无法在网关中解析它。

vkc1a9a2

vkc1a9a21#

我遇到了同样的问题,并找到了答案。您的代码很接近,但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);
up9lanfz

up9lanfz2#

除此之外:

client.handshake.headers.cookie?.split('; ')

由于存在可能性,因此需要可选链接(.?)。

相关问题