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 <peeroke@gmail.com>
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
Co-authored-by: Morgan Vernay <morgan@cal.com>
This commit is contained in:
Lauris Skraucis
2024-06-14 11:25:27 +00:00
committed by GitHub
co-authored by Peer Richelsen Morgan Morgan Vernay
parent 54162f8568
commit 65f50e9f25
4 changed files with 19 additions and 10 deletions
@@ -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(),
},
};
}
@@ -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<KeysResponseDto> {
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,
},
};
@@ -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 {
@@ -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,
};
}