2

我的后卫包含以下代码:

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

4

1 回答 1

3

我有同样的问题并找到了答案。您的代码很接近,但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);
于 2020-03-14T13:59:34.923 回答