mirror of
https://github.com/bitwarden/browser
synced 2026-01-31 16:53:27 +00:00
PM-14922 - WIP SDK password login demo
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
// @ts-strict-ignore
|
||||
import { Injectable } from "@angular/core";
|
||||
import { Router } from "@angular/router";
|
||||
import { firstValueFrom } from "rxjs";
|
||||
|
||||
import {
|
||||
DefaultLoginComponentService,
|
||||
@@ -16,10 +17,21 @@ import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/
|
||||
import { OrganizationInviteService } from "@bitwarden/common/auth/services/organization-invite/organization-invite.service";
|
||||
import { CryptoFunctionService } from "@bitwarden/common/key-management/crypto/abstractions/crypto-function.service";
|
||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
||||
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
|
||||
import {
|
||||
Environment,
|
||||
EnvironmentService,
|
||||
} from "@bitwarden/common/platform/abstractions/environment.service";
|
||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { SdkService, toSdkDevice } from "@bitwarden/common/platform/abstractions/sdk/sdk.service";
|
||||
import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy";
|
||||
import {
|
||||
ClientSettings,
|
||||
PasswordManagerClient,
|
||||
PasswordPreloginResponse,
|
||||
PasswordLoginRequest,
|
||||
LoginResponse,
|
||||
} from "@bitwarden/sdk-internal";
|
||||
|
||||
import { RouterService } from "../../../../core/router.service";
|
||||
|
||||
@@ -42,6 +54,7 @@ export class WebLoginComponentService
|
||||
private router: Router,
|
||||
private accountService: AccountService,
|
||||
private configService: ConfigService,
|
||||
private sdkService: SdkService,
|
||||
) {
|
||||
super(
|
||||
cryptoFunctionService,
|
||||
@@ -125,4 +138,33 @@ export class WebLoginComponentService
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
async sdkPasswordPrelogin(email: string): Promise<PasswordPreloginResponse> {
|
||||
const anonSdkClient: PasswordManagerClient = await firstValueFrom(this.sdkService.client$);
|
||||
|
||||
const env = await firstValueFrom(this.environmentService.environment$);
|
||||
|
||||
const settings = this.toSettings(env);
|
||||
|
||||
return await anonSdkClient.auth().login(settings).get_password_prelogin(email);
|
||||
}
|
||||
|
||||
async sdkLoginWithPassword(request: PasswordLoginRequest): Promise<LoginResponse> {
|
||||
const anonSdkClient: PasswordManagerClient = await firstValueFrom(this.sdkService.client$);
|
||||
|
||||
const env = await firstValueFrom(this.environmentService.environment$);
|
||||
|
||||
const settings = this.toSettings(env);
|
||||
|
||||
return await anonSdkClient.auth().login(settings).login_via_password(request);
|
||||
}
|
||||
|
||||
private toSettings(env: Environment): ClientSettings {
|
||||
return {
|
||||
apiUrl: env.getApiUrl(),
|
||||
identityUrl: env.getIdentityUrl(),
|
||||
deviceType: toSdkDevice(this.platformUtilsService.getDevice()),
|
||||
userAgent: navigator.userAgent,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,6 +88,7 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag
|
||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||
import { SdkClientFactory } from "@bitwarden/common/platform/abstractions/sdk/sdk-client-factory";
|
||||
import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service";
|
||||
import { SdkService } from "@bitwarden/common/platform/abstractions/sdk/sdk.service";
|
||||
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
||||
import { SystemService } from "@bitwarden/common/platform/abstractions/system.service";
|
||||
import { IpcService } from "@bitwarden/common/platform/ipc";
|
||||
@@ -340,6 +341,7 @@ const safeProviders: SafeProvider[] = [
|
||||
Router,
|
||||
AccountService,
|
||||
ConfigService,
|
||||
SdkService,
|
||||
],
|
||||
}),
|
||||
safeProvider({
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
// @ts-strict-ignore
|
||||
import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options";
|
||||
import { Policy } from "@bitwarden/common/admin-console/models/domain/policy";
|
||||
import {
|
||||
PasswordLoginRequest,
|
||||
PasswordPreloginResponse,
|
||||
LoginResponse,
|
||||
} from "@bitwarden/sdk-internal";
|
||||
|
||||
export interface PasswordPolicies {
|
||||
policies: Policy[];
|
||||
@@ -47,4 +52,17 @@ export abstract class LoginComponentService {
|
||||
* Shows the back button.
|
||||
*/
|
||||
showBackButton: (showBackButton: boolean) => void;
|
||||
|
||||
/**
|
||||
* Retrieves the password prelogin data required for authentication.
|
||||
* This includes the user's KDF configuration needed to properly derive the master key.
|
||||
* - Demo method for testing SDK login functionality
|
||||
*/
|
||||
sdkPasswordPrelogin?: (email: string) => Promise<PasswordPreloginResponse>;
|
||||
|
||||
/**
|
||||
* Authenticates a user via email and master password using the SDK.
|
||||
* - Demo method for testing SDK login functionality
|
||||
*/
|
||||
sdkLoginWithPassword?: (request: PasswordLoginRequest) => Promise<LoginResponse>;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ import { DevicesApiServiceAbstraction } from "@bitwarden/common/auth/abstraction
|
||||
import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction";
|
||||
import { AuthResult } from "@bitwarden/common/auth/models/domain/auth-result";
|
||||
import { ClientType, HttpStatusCode } from "@bitwarden/common/enums";
|
||||
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
||||
// import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
||||
import { ErrorResponse } from "@bitwarden/common/models/response/error.response";
|
||||
import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service";
|
||||
import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service";
|
||||
@@ -668,20 +668,24 @@ export class LoginComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
private async makePasswordPreloginCall() {
|
||||
// Prefetch prelogin KDF config when enabled
|
||||
try {
|
||||
const flagEnabled = await this.configService.getFeatureFlag(
|
||||
FeatureFlag.PM23801_PrefetchPasswordPrelogin,
|
||||
);
|
||||
if (flagEnabled) {
|
||||
const email = this.formGroup.value.email;
|
||||
if (email) {
|
||||
void this.loginStrategyService.getPasswordPrelogin(email);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
this.logService.error("Failed to prefetch prelogin data.", error);
|
||||
if (this.formGroup.value.email) {
|
||||
await this.loginComponentService.sdkPasswordPrelogin?.(this.formGroup.value.email);
|
||||
}
|
||||
|
||||
// // Prefetch prelogin KDF config when enabled
|
||||
// try {
|
||||
// const flagEnabled = await this.configService.getFeatureFlag(
|
||||
// FeatureFlag.PM23801_PrefetchPasswordPrelogin,
|
||||
// );
|
||||
// if (flagEnabled) {
|
||||
// const email = this.formGroup.value.email;
|
||||
// if (email) {
|
||||
// void this.loginStrategyService.getPasswordPrelogin(email);
|
||||
// }
|
||||
// }
|
||||
// } catch (error) {
|
||||
// this.logService.error("Failed to prefetch prelogin data.", error);
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user