Skip to content

Commit 09b704d

Browse files
authored
Merge pull request #2305 from trycompai/tofik/fix-assistent-chat-permission-error
[dev] [tofikwest] tofik/fix-assistent-chat-permission-error
2 parents 6eb60a9 + ac97916 commit 09b704d

2 files changed

Lines changed: 31 additions & 7 deletions

File tree

apps/api/src/assistant-chat/assistant-chat.controller.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { streamText, convertToModelMessages, stepCountIs, type UIMessage } from
2424
import type { Response, Request } from 'express';
2525
import { AuthContext } from '../auth/auth-context.decorator';
2626
import { HybridAuthGuard } from '../auth/hybrid-auth.guard';
27+
import { SessionOnlyGuard } from '../auth/session-only.guard';
2728
import { PermissionGuard } from '../auth/permission.guard';
2829
import { RequirePermission } from '../auth/require-permission.decorator';
2930
import type { AuthContext as AuthContextType } from '../auth/types';
@@ -36,7 +37,7 @@ import { RolesService } from '../roles/roles.service';
3637

3738
@ApiTags('Assistant Chat')
3839
@Controller({ path: 'assistant-chat', version: '1' })
39-
@UseGuards(HybridAuthGuard, PermissionGuard)
40+
@UseGuards(HybridAuthGuard, SessionOnlyGuard, PermissionGuard)
4041
@RequirePermission('app', 'read')
4142
@ApiSecurity('apikey')
4243
export class AssistantChatController {
@@ -55,12 +56,6 @@ export class AssistantChatController {
5556
throw new BadRequestException('Organization ID is required');
5657
}
5758

58-
if (auth.isApiKey) {
59-
throw new BadRequestException(
60-
'Assistant chat is only available for user-authenticated requests.',
61-
);
62-
}
63-
6459
if (!auth.userId) {
6560
throw new BadRequestException('User ID is required');
6661
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import {
2+
CanActivate,
3+
ExecutionContext,
4+
ForbiddenException,
5+
Injectable,
6+
} from '@nestjs/common';
7+
import { AuthenticatedRequest } from './types';
8+
9+
/**
10+
* Guard that rejects API key and service token auth.
11+
* Use on endpoints that require a real user session (e.g., assistant chat).
12+
*
13+
* Place between HybridAuthGuard and PermissionGuard:
14+
* @UseGuards(HybridAuthGuard, SessionOnlyGuard, PermissionGuard)
15+
*/
16+
@Injectable()
17+
export class SessionOnlyGuard implements CanActivate {
18+
canActivate(context: ExecutionContext): boolean {
19+
const request = context.switchToHttp().getRequest<AuthenticatedRequest>();
20+
21+
if (request.isApiKey || request.isServiceToken) {
22+
throw new ForbiddenException(
23+
'This endpoint is only available for user-authenticated requests.',
24+
);
25+
}
26+
27+
return true;
28+
}
29+
}

0 commit comments

Comments
 (0)