Nestjs Websocket网关,如何从握手中解析签名的Cookie以获得警卫授权?

时间:2019-12-21 18:33:26

标签: node.js cookies socket.io nestjs nestjs-gateways

我的守卫包含以下代码:

    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,但是我无法在网关中解析它。

1 个答案:

答案 0 :(得分: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);