From 65f50e9f258d5a5092a8649dddfaf0a690ff4585 Mon Sep 17 00:00:00 2001 From: Lauris Skraucis Date: Fri, 14 Jun 2024 13:25:27 +0200 Subject: [PATCH] chore: return accessTokenExpiresAt in oauth exchange and refresh (#15425) * chore: return accessTokenExpiresAt in oauth exchange and refresh * fixup! chore: return accessTokenExpiresAt in oauth exchange and refresh --------- Co-authored-by: Peer Richelsen Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> Co-authored-by: Morgan Vernay --- .../oauth-client-users.controller.ts | 3 ++- .../oauth-flow/oauth-flow.controller.ts | 15 +++++++++------ .../oauth-flow/responses/KeysResponse.dto.ts | 5 ++++- .../oauth-clients/services/oauth-flow.service.ts | 6 ++++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.ts index 29f544b5dd..48ae0e3ea9 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.ts @@ -156,7 +156,7 @@ export class OAuthClientUsersController { const { id } = await this.validateManagedUserOwnership(oAuthClientId, userId); - const { accessToken, refreshToken } = await this.tokensRepository.createOAuthTokens( + const { accessToken, refreshToken, accessTokenExpiresAt } = await this.tokensRepository.createOAuthTokens( oAuthClientId, id, true @@ -167,6 +167,7 @@ export class OAuthClientUsersController { data: { accessToken, refreshToken, + accessTokenExpiresAt: accessTokenExpiresAt.valueOf(), }, }; } diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-flow/oauth-flow.controller.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-flow/oauth-flow.controller.ts index 975db6df0e..96be69b9a8 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-flow/oauth-flow.controller.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-flow/oauth-flow.controller.ts @@ -118,16 +118,18 @@ export class OAuthFlowController { throw new BadRequestException("Missing 'Bearer' Authorization header."); } - const { accessToken, refreshToken } = await this.oAuthFlowService.exchangeAuthorizationToken( - authorizeEndpointCode, - clientId, - body.clientSecret - ); + const { accessToken, refreshToken, accessTokenExpiresAt } = + await this.oAuthFlowService.exchangeAuthorizationToken( + authorizeEndpointCode, + clientId, + body.clientSecret + ); return { status: SUCCESS_STATUS, data: { accessToken, + accessTokenExpiresAt: accessTokenExpiresAt.valueOf(), refreshToken, }, }; @@ -141,7 +143,7 @@ export class OAuthFlowController { @Headers(X_CAL_SECRET_KEY) secretKey: string, @Body() body: RefreshTokenInput ): Promise { - const { accessToken, refreshToken } = await this.oAuthFlowService.refreshToken( + const { accessToken, refreshToken, accessTokenExpiresAt } = await this.oAuthFlowService.refreshToken( clientId, secretKey, body.refreshToken @@ -151,6 +153,7 @@ export class OAuthFlowController { status: SUCCESS_STATUS, data: { accessToken: accessToken, + accessTokenExpiresAt: accessTokenExpiresAt.valueOf(), refreshToken: refreshToken, }, }; diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-flow/responses/KeysResponse.dto.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-flow/responses/KeysResponse.dto.ts index ba5c85b51e..9a5f5f4bcb 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-flow/responses/KeysResponse.dto.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-flow/responses/KeysResponse.dto.ts @@ -1,6 +1,6 @@ import { ApiProperty } from "@nestjs/swagger"; import { Type } from "class-transformer"; -import { ValidateNested, IsEnum, IsString, IsNotEmptyObject } from "class-validator"; +import { ValidateNested, IsEnum, IsString, IsNotEmptyObject, IsNumber } from "class-validator"; import { SUCCESS_STATUS, ERROR_STATUS } from "@calcom/platform-constants"; @@ -16,6 +16,9 @@ class KeysDto { }) @IsString() refreshToken!: string; + + @IsNumber() + accessTokenExpiresAt!: number; } export class KeysResponseDto { diff --git a/apps/api/v2/src/modules/oauth-clients/services/oauth-flow.service.ts b/apps/api/v2/src/modules/oauth-clients/services/oauth-flow.service.ts index 86c8ff45bb..e65cab8bc0 100644 --- a/apps/api/v2/src/modules/oauth-clients/services/oauth-flow.service.ts +++ b/apps/api/v2/src/modules/oauth-clients/services/oauth-flow.service.ts @@ -103,7 +103,7 @@ export class OAuthFlowService { tokenId: string, clientId: string, clientSecret: string - ): Promise<{ accessToken: string; refreshToken: string }> { + ): Promise<{ accessToken: string; refreshToken: string; accessTokenExpiresAt: Date }> { const oauthClient = await this.oAuthClientRepository.getOAuthClientWithAuthTokens( tokenId, clientId, @@ -120,7 +120,7 @@ export class OAuthFlowService { throw new BadRequestException("Invalid Authorization Token."); } - const { accessToken, refreshToken } = await this.tokensRepository.createOAuthTokens( + const { accessToken, refreshToken, accessTokenExpiresAt } = await this.tokensRepository.createOAuthTokens( clientId, authorizationToken.owner.id ); @@ -129,6 +129,7 @@ export class OAuthFlowService { return { accessToken, + accessTokenExpiresAt, refreshToken, }; } @@ -158,6 +159,7 @@ export class OAuthFlowService { return { accessToken: accessToken.secret, + accessTokenExpiresAt: accessToken.expiresAt, refreshToken: refreshToken.secret, }; }