From c1f141f7db8e201a1014b879fae06a305196d240 Mon Sep 17 00:00:00 2001 From: Jared Snider Date: Mon, 19 May 2025 18:52:38 -0400 Subject: [PATCH] PM-20532 - WIP on SendTokenApiService --- libs/common/src/abstractions/api.service.ts | 1 + .../send-access-token.request.ts | 7 ---- .../abstractions/send-token-api.service.ts | 10 +++++ .../services/send-token-api.service.ts | 40 +++++++++++++++++-- libs/common/src/services/api.service.ts | 2 +- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/libs/common/src/abstractions/api.service.ts b/libs/common/src/abstractions/api.service.ts index e4453359015..0c45199f497 100644 --- a/libs/common/src/abstractions/api.service.ts +++ b/libs/common/src/abstractions/api.service.ts @@ -147,6 +147,7 @@ export abstract class ApiService { IdentityTokenResponse | IdentityTwoFactorResponse | IdentityDeviceVerificationResponse >; refreshIdentityToken: () => Promise; + getCredentials: () => Promise; getProfile: () => Promise; getUserSubscription: () => Promise; diff --git a/libs/common/src/auth/models/request/identity-token/send-access-token.request.ts b/libs/common/src/auth/models/request/identity-token/send-access-token.request.ts index ecefdb73f43..c3816527ee0 100644 --- a/libs/common/src/auth/models/request/identity-token/send-access-token.request.ts +++ b/libs/common/src/auth/models/request/identity-token/send-access-token.request.ts @@ -6,7 +6,6 @@ import { DeviceRequest } from "./device.request"; export type SendAccessTokenPasswordPayload = { password: string }; export type SendAccessTokenEmailOtpPayload = { email: string; otp: string }; -// If truly anonymous, you get no extra fields: export type SendAccessTokenAnonymousPayload = object; // empty object export interface SendAccessTokenPayloadBase { @@ -15,12 +14,6 @@ export interface SendAccessTokenPayloadBase { scope: Scope; send_id: string; - - // TODO: ask if we need device information on server + device claims added in server validator - // device info - // device_type: this.device.type, - // device_identifier: this.device.identifier, - // device_name: this.device.name, } // Payload is the base + only 1 set of 3 credentials. diff --git a/libs/common/src/auth/send-access/abstractions/send-token-api.service.ts b/libs/common/src/auth/send-access/abstractions/send-token-api.service.ts index e69de29bb2d..4adbb3500b3 100644 --- a/libs/common/src/auth/send-access/abstractions/send-token-api.service.ts +++ b/libs/common/src/auth/send-access/abstractions/send-token-api.service.ts @@ -0,0 +1,10 @@ +import { SendAccessTokenRequest } from "../../models/request/identity-token/send-access-token.request"; + +/** + * Abstract class for the SendTokenApiService. + * Communicates with Identity to obtain send access tokens. + */ +export abstract class SendTokenApiService { + // TODO: add return type for requestSendAccessToken and error scenarios + abstract requestSendAccessToken: (request: SendAccessTokenRequest) => Promise; +} diff --git a/libs/common/src/auth/send-access/services/send-token-api.service.ts b/libs/common/src/auth/send-access/services/send-token-api.service.ts index 9282c749917..a8db308b6c2 100644 --- a/libs/common/src/auth/send-access/services/send-token-api.service.ts +++ b/libs/common/src/auth/send-access/services/send-token-api.service.ts @@ -1,5 +1,39 @@ -import { SendAccessTokenRequest } from "../../models/request/identity-token/send-access-token.request"; +import { firstValueFrom } from "rxjs"; -export abstract class SendTokenApiService { - abstract requestSendAccessToken: (request: SendAccessTokenRequest) => Promise; +import { ApiService } from "../../../abstractions/api.service"; +import { EnvironmentService } from "../../../platform/abstractions/environment.service"; +import { SendAccessTokenRequest } from "../../models/request/identity-token/send-access-token.request"; +import { SendTokenApiService as SendTokenApiServiceAbstraction } from "../abstractions/send-token-api.service"; + +export class SendTokenApiService implements SendTokenApiServiceAbstraction { + constructor( + private environmentService: EnvironmentService, + private apiService: ApiService, + ) {} + + // TODO: talk with Justin about needing to use httpOperations or not. + async requestSendAccessToken(request: SendAccessTokenRequest): Promise { + const payload = request.toIdentityTokenPayload(); + + const headers = new Headers({ + "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", + Accept: "application/json", + }); + + const credentials = await this.apiService.getCredentials(); + + const env = await firstValueFrom(this.environmentService.environment$); + + const req = new Request(env.getIdentityUrl() + "/connect/token", { + method: "POST", + body: new URLSearchParams(payload as any), + headers: headers, + credentials: credentials, + cache: "no-store", + }); + + await this.apiService.fetch(req); + + // TODO: add processing. + } } diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index 639daa7c658..57782915c9e 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -1910,7 +1910,7 @@ export class ApiService implements ApiServiceAbstraction { .join("&"); } - private async getCredentials(): Promise { + async getCredentials(): Promise { const env = await firstValueFrom(this.environmentService.environment$); if (!this.isWebClient || env.hasBaseUrl()) { return "include";