Nestjs websocket 网关,如何从握手中解析签名的 cookie 以进行警卫授权?
Nestjs websocket gateway, how to parse signed cookies from handshake for guard authorization?
我的守卫包含以下代码:
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);
生成的sessionId在调用cookieParse.signedCookie()后仍然被签名;
client.request.cookies 和 signedCookies 都未定义。
会话 ID 在那里,浏览器正在发送 cookie,但我无法在网关中解析它。
我遇到了同样的问题并找到了答案。您的代码很接近,但再次 cookieParser.signedCookie(...)
returns 签名 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);
我的守卫包含以下代码:
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);
生成的sessionId在调用cookieParse.signedCookie()后仍然被签名;
client.request.cookies 和 signedCookies 都未定义。
会话 ID 在那里,浏览器正在发送 cookie,但我无法在网关中解析它。
我遇到了同样的问题并找到了答案。您的代码很接近,但再次 cookieParser.signedCookie(...)
returns 签名 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);