e289f3056e
- moves applicationRoleId to application entity - add new `APPLICATION` FieldActorSource and `APPLICATION` JwtTokenTypeEnum value - create a new token with applicationId when executing a function - when applicationId is in token, check for application.defaultRole permissions -use twenty-shared types in `twenty-sdk/application` - create a new import from generate called "Twenty" that you can use directly without having to set TWENTY_API_KEY AND TWENTY_API_URL (keep metadata or core parameter only) - provide to serverless unique one time BEARER TOKEN to run it Result <img width="977" height="566" alt="image" src="https://github.com/user-attachments/assets/e78428a0-5b13-4975-aa13-58ee3b32450c" /> <img width="910" height="596" alt="image" src="https://github.com/user-attachments/assets/6ec72bf5-7655-4093-a45e-ad269595a324" /> <img width="741" height="568" alt="image" src="https://github.com/user-attachments/assets/7683944c-fd79-4417-8fb2-8e4815cc112f" />
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import {
|
|
type CanActivate,
|
|
type ExecutionContext,
|
|
Injectable,
|
|
Logger,
|
|
} from '@nestjs/common';
|
|
|
|
import { isDefined } from 'twenty-shared/utils';
|
|
|
|
import { AccessTokenService } from 'src/engine/core-modules/auth/token/services/access-token.service';
|
|
import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service';
|
|
import { bindDataToRequestObject } from 'src/engine/utils/bind-data-to-request-object.util';
|
|
|
|
@Injectable()
|
|
export class JwtAuthGuard implements CanActivate {
|
|
private readonly logger = new Logger(JwtAuthGuard.name);
|
|
|
|
constructor(
|
|
private readonly accessTokenService: AccessTokenService,
|
|
private readonly workspaceStorageCacheService: WorkspaceCacheStorageService,
|
|
) {}
|
|
|
|
async canActivate(context: ExecutionContext): Promise<boolean> {
|
|
const request = context.switchToHttp().getRequest();
|
|
|
|
try {
|
|
const data =
|
|
await this.accessTokenService.validateTokenByRequest(request);
|
|
const metadataVersion = data.workspace
|
|
? await this.workspaceStorageCacheService.getMetadataVersion(
|
|
data.workspace.id,
|
|
)
|
|
: undefined;
|
|
|
|
if (!isDefined(data.apiKey) && !isDefined(data.userWorkspaceId)) {
|
|
this.logger.warn(
|
|
`Auth failed: no apiKey or userWorkspaceId in context`,
|
|
);
|
|
|
|
return false;
|
|
}
|
|
|
|
bindDataToRequestObject(data, request, metadataVersion);
|
|
|
|
return true;
|
|
} catch (error) {
|
|
this.logger.warn(`Auth failed with error: ${error}`);
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|