From 41b2b816eb06f22fa989ba57e7a424a9a8b14274 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Wed, 12 Mar 2025 13:10:50 +0100 Subject: [PATCH] Add request models and api service --- .../auth/opaque/default-opaque-api.service.ts | 55 +++++++++++++++++++ .../src/auth/opaque/default-opaque.service.ts | 2 +- .../opaque/models/login-finish.request.ts | 8 +++ .../auth/opaque/models/login-start.request.ts | 6 ++ .../opaque/models/login-start.response.ts | 12 ++++ .../models/registration-finish.response.ts | 7 +++ .../models/registration-start.response.ts | 6 +- .../src/auth/opaque/opaque-api.service.ts | 8 ++- libs/common/src/types/guid.ts | 2 +- 9 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 libs/common/src/auth/opaque/default-opaque-api.service.ts create mode 100644 libs/common/src/auth/opaque/models/login-finish.request.ts create mode 100644 libs/common/src/auth/opaque/models/login-start.request.ts create mode 100644 libs/common/src/auth/opaque/models/login-start.response.ts create mode 100644 libs/common/src/auth/opaque/models/registration-finish.response.ts diff --git a/libs/common/src/auth/opaque/default-opaque-api.service.ts b/libs/common/src/auth/opaque/default-opaque-api.service.ts new file mode 100644 index 00000000000..3485021d3e7 --- /dev/null +++ b/libs/common/src/auth/opaque/default-opaque-api.service.ts @@ -0,0 +1,55 @@ +import { firstValueFrom } from "rxjs"; + +import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; + +import { OpaqueSessionId } from "../../types/guid"; + +import { RegistrationFinishRequest } from "./models/registration-finish.request"; +import { RegistrationFinishResponse } from "./models/registration-finish.response"; +import { RegistrationStartRequest } from "./models/registration-start.request"; +import { RegistrationStartResponse } from "./models/registration-start.response"; +import { OpaqueApiService } from "./opaque-api.service"; + +export class DefaultOpaqueApiService implements OpaqueApiService { + constructor( + private apiService: ApiService, + private environmentService: EnvironmentService, + ) {} + + async RegistrationStart(request: RegistrationStartRequest): Promise { + const env = await firstValueFrom(this.environmentService.environment$); + const response = await this.apiService.send( + "POST", + `/opaque/registration-start`, + request, + false, + true, + env.getApiUrl(), + ); + return new RegistrationStartResponse(response); + } + + async RegistrationFinish( + credentialId: OpaqueSessionId, + request: RegistrationFinishRequest, + ): Promise { + const env = await firstValueFrom(this.environmentService.environment$); + const response = await this.apiService.send( + "POST", + `/opaque/${credentialId}registration-start`, + request, + false, + true, + env.getApiUrl(), + ); + return new RegistrationFinishResponse(response); + } + + LoginStart(): any { + throw new Error("Method not implemented"); + } + LoginFinish(): any { + throw new Error("Method not implemented"); + } +} diff --git a/libs/common/src/auth/opaque/default-opaque.service.ts b/libs/common/src/auth/opaque/default-opaque.service.ts index 9d62525ad1b..8fdfdddbf31 100644 --- a/libs/common/src/auth/opaque/default-opaque.service.ts +++ b/libs/common/src/auth/opaque/default-opaque.service.ts @@ -61,7 +61,7 @@ export class DefaultOpaqueService implements OpaqueService { ); await this.opaqueApiService.RegistrationFinish( - registrationStartResponse.credentialId, + registrationStartResponse.sessionId, new RegistrationFinishRequest( Utils.fromBufferToB64(new Uint8Array(registrationFinish.registration_finish_message)), keyset, diff --git a/libs/common/src/auth/opaque/models/login-finish.request.ts b/libs/common/src/auth/opaque/models/login-finish.request.ts new file mode 100644 index 00000000000..f8654ed50fe --- /dev/null +++ b/libs/common/src/auth/opaque/models/login-finish.request.ts @@ -0,0 +1,8 @@ +import { OpaqueSessionId } from "@bitwarden/common/types/guid"; + +export class LoginFinishRequest { + constructor( + readonly loginSessionId: OpaqueSessionId, + readonly clientLoginFinishResult: string, + ) {} +} diff --git a/libs/common/src/auth/opaque/models/login-start.request.ts b/libs/common/src/auth/opaque/models/login-start.request.ts new file mode 100644 index 00000000000..8247b20a066 --- /dev/null +++ b/libs/common/src/auth/opaque/models/login-start.request.ts @@ -0,0 +1,6 @@ +export class LoginStartRequest { + constructor( + readonly email: string, + readonly clientLoginStartRequest: string, + ) {} +} diff --git a/libs/common/src/auth/opaque/models/login-start.response.ts b/libs/common/src/auth/opaque/models/login-start.response.ts new file mode 100644 index 00000000000..dfc88ed6ee8 --- /dev/null +++ b/libs/common/src/auth/opaque/models/login-start.response.ts @@ -0,0 +1,12 @@ +import { BaseResponse } from "../../../models/response/base.response"; + +export class LoginStartResponse extends BaseResponse { + loginSessionId: string; + serverLoginStartResult: string; + + constructor(response: any) { + super(response); + this.loginSessionId = this.getResponseProperty("LoginSessionId"); + this.serverLoginStartResult = this.getResponseProperty("ServerRegistrationStartResult"); + } +} diff --git a/libs/common/src/auth/opaque/models/registration-finish.response.ts b/libs/common/src/auth/opaque/models/registration-finish.response.ts new file mode 100644 index 00000000000..0db8474a6a0 --- /dev/null +++ b/libs/common/src/auth/opaque/models/registration-finish.response.ts @@ -0,0 +1,7 @@ +import { BaseResponse } from "@bitwarden/common/models/response/base.response"; + +export class RegistrationFinishResponse extends BaseResponse { + constructor(response: any) { + super(response); + } +} diff --git a/libs/common/src/auth/opaque/models/registration-start.response.ts b/libs/common/src/auth/opaque/models/registration-start.response.ts index 1ba9d398091..fbf5bec4f0a 100644 --- a/libs/common/src/auth/opaque/models/registration-start.response.ts +++ b/libs/common/src/auth/opaque/models/registration-start.response.ts @@ -1,14 +1,14 @@ import { BaseResponse } from "../../../models/response/base.response"; -import { OpaqueCredentialId } from "../../../types/guid"; +import { OpaqueSessionId } from "../../../types/guid"; export class RegistrationStartResponse extends BaseResponse { - credentialId: OpaqueCredentialId; + sessionId: OpaqueSessionId; serverRegistrationStartResult: string; constructor(response: any) { super(response); - this.credentialId = this.getResponseProperty("CredentialId"); + this.sessionId = this.getResponseProperty("SessionId"); this.serverRegistrationStartResult = this.getResponseProperty("ServerRegistrationStartResult"); } } diff --git a/libs/common/src/auth/opaque/opaque-api.service.ts b/libs/common/src/auth/opaque/opaque-api.service.ts index 46525e84a66..35dce77fc4d 100644 --- a/libs/common/src/auth/opaque/opaque-api.service.ts +++ b/libs/common/src/auth/opaque/opaque-api.service.ts @@ -1,14 +1,16 @@ -import { OpaqueCredentialId } from "../../types/guid"; +import { OpaqueSessionId as OpaqueSessionId } from "../../types/guid"; + import { RegistrationFinishRequest } from "./models/registration-finish.request"; +import { RegistrationFinishResponse } from "./models/registration-finish.response"; import { RegistrationStartRequest } from "./models/registration-start.request"; import { RegistrationStartResponse } from "./models/registration-start.response"; export abstract class OpaqueApiService { abstract RegistrationStart(request: RegistrationStartRequest): Promise; abstract RegistrationFinish( - credentialId: OpaqueCredentialId, + sessionId: OpaqueSessionId, request: RegistrationFinishRequest, - ): Promise; + ): Promise; abstract LoginStart(): any; abstract LoginFinish(): any; } diff --git a/libs/common/src/types/guid.ts b/libs/common/src/types/guid.ts index 79ad7a7f898..79d6284a169 100644 --- a/libs/common/src/types/guid.ts +++ b/libs/common/src/types/guid.ts @@ -11,4 +11,4 @@ export type CipherId = Opaque; export type SendId = Opaque; export type IndexedEntityId = Opaque; export type SecurityTaskId = Opaque; -export type OpaqueCredentialId = Opaque; +export type OpaqueSessionId = Opaque;