From adb875976a4925c1173f4c38d3f6a43723245c63 Mon Sep 17 00:00:00 2001 From: wangziqi Date: Sun, 5 Jul 2026 23:15:34 +0800 Subject: [PATCH] feat: support JWT from query string for SSE endpoints --- apps/server/src/auth/strategies/jwt.strategy.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/server/src/auth/strategies/jwt.strategy.ts b/apps/server/src/auth/strategies/jwt.strategy.ts index 6b71f8e..349e843 100644 --- a/apps/server/src/auth/strategies/jwt.strategy.ts +++ b/apps/server/src/auth/strategies/jwt.strategy.ts @@ -2,12 +2,24 @@ import { Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; import { ConfigService } from '@nestjs/config'; +import { Request } from 'express'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { constructor(config: ConfigService) { super({ - jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + jwtFromRequest: ExtractJwt.fromExtractors([ + // 1. Standard Bearer header (existing behavior) + ExtractJwt.fromAuthHeaderAsBearerToken(), + // 2. SSE fallback: query string ?token= + (req: Request) => { + const token = req?.query?.token; + if (typeof token === 'string' && token.length > 0) { + return token; + } + return null; + }, + ]), ignoreExpiration: false, secretOrKey: config.get('JWT_SECRET', 'dorm-billing-jwt-secret-key-2024'), });