Skip to content

Commit

Permalink
poc
Browse files Browse the repository at this point in the history
  • Loading branch information
renkelvin committed Nov 9, 2023
1 parent 411a7fb commit 74291bf
Show file tree
Hide file tree
Showing 11 changed files with 413 additions and 13 deletions.
35 changes: 35 additions & 0 deletions common/api-review/auth.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ export interface Auth {
readonly settings: AuthSettings;
signOut(): Promise<void>;
tenantId: string | null;
// (undocumented)
updateApiHost(apiHost: string): void;
updateCurrentUser(user: User | null): Promise<void>;
useDeviceLanguage(): void;
}
Expand Down Expand Up @@ -298,9 +300,39 @@ export function createUserWithEmailAndPassword(auth: Auth, email: string, passwo
// @public
export type CustomParameters = Record<string, string>;

// @public (undocumented)
export function debugCreateCredential(name: string, responseStr: string): Promise<string>;

// @public
export const debugErrorMap: AuthErrorMap;

// @public (undocumented)
export function debugGetCredential(name: string, responseStr: string): Promise<string>;

// @public (undocumented)
export function debugGetFinalizePasskeyEnrollmentResponse(user: User, requestStr: string): Promise<string>;

// @public (undocumented)
export function debugGetFinalizePasskeySignInResponse(auth: Auth, requestStr: string): Promise<string>;

// @public (undocumented)
export function debugGetStartPasskeyEnrollmentResponse(user: User, requestStr: string): Promise<string>;

// @public (undocumented)
export function debugGetStartPasskeySignInResponse(auth: Auth, requestStr: string): Promise<string>;

// @public (undocumented)
export function debugPrepareFinalizePasskeyEnrollmentRequest(user: User, name: string, credentialStr: string): Promise<string>;

// @public (undocumented)
export function debugPrepareFinalizePasskeySignInRequest(credentialStr: string): Promise<string>;

// @public (undocumented)
export function debugPrepareStartPasskeyEnrollmentRequest(user: User): Promise<string>;

// @public (undocumented)
export function debugPrepareStartPasskeySignInRequest(): Promise<string>;

// @public
export function deleteUser(user: User): Promise<void>;

Expand Down Expand Up @@ -840,6 +872,9 @@ export function unlink(user: User, providerId: string): Promise<User>;

export { Unsubscribe }

// @public (undocumented)
export function updateApiHost(auth: Auth, apiHost: string): void;

// @public
export function updateCurrentUser(auth: Auth, user: User | null): Promise<void>;

Expand Down
98 changes: 98 additions & 0 deletions packages/auth/demo/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,13 @@
Action Code Settings
</a>
</li>
<li role="presentation">
<a href="#debugging-section"
aria-controls="debugging-section"
data-toggle="tab" role="tab">
Debugging
</a>
</li>
<li role="presentation" class="visible-xs">
<a href="#logs-section"
aria-controls="logs-section"
Expand All @@ -169,6 +176,17 @@
<!-- Development mode APIs -->
<div class="group">Development mode APIs</div>
<form class="form form-bordered no-submit">
<div class="btn-group radio-block" id="api-host-selection"
data-toggle="buttons">
<label class="btn btn-primary active">
<input type="radio" name="api-host" value="prod"
autocomplete="off" checked> Prod
</label>
<label class="btn btn-primary">
<input type="radio" name="api-host" value="staging"
autocomplete="off"> Staging
</label>
</div>
<div class="btn-group radio-block" id="enable-app-verification-selection"
data-toggle="buttons">
<label class="btn btn-primary active">
Expand Down Expand Up @@ -844,6 +862,86 @@
id="action-code-settings-reset">Reset</button>
</form>
</div>
<div class="tab-pane" id="debugging-section">
<div class="group">Enroll</div>
<form class="form form-bordered no-submit">
<textarea name="Start Enroll Request" id="start-enroll-request"
class="form-control" placeholder="Request"></textarea>
<button class="btn btn-block btn-primary" id="prepare-start-enroll-request">
Prepare Start Enroll Request
</button>
</form>
<form class="form form-bordered no-submit">
<textarea name="Start Enroll Response" id="start-enroll-response"
class="form-control" placeholder="Response"></textarea>
<button class="btn btn-block btn-primary" id="get-start-enroll-response">
Get Start Enroll Response
</button>
</form>
<form class="form form-bordered no-submit">
<input type="text" name="Name" id="name-enroll"
class="form-control" placeholder="Name" />
<textarea type="text" name="Credential" id="credential-enroll"
class="form-control" placeholder="Credential"></textarea>
<button class="btn btn-block btn-primary" id="create-credential-enroll">
Create Credential
</button>
</form>
<form class="form form-bordered no-submit">
<textarea name="Finalize Enroll Request" id="finalize-enroll-request"
class="form-control" placeholder="Request"></textarea>
<button class="btn btn-block btn-primary" id="prepare-finalize-enroll-request">
Prepare Finalize Enroll Request
</button>
</form>
<form class="form form-bordered no-submit">
<textarea name="Finalize Enroll Response" id="finalize-enroll-response"
class="form-control" placeholder="Response"></textarea>
<button class="btn btn-block btn-primary" id="get-finalize-enroll-response">
Get Finalize Enroll Response
</button>
</form>

<div class="group">Sign In</div>
<form class="form form-bordered no-submit">
<textarea name="Start Sign In Request" id="start-signin-request"
class="form-control" placeholder="Request"></textarea>
<button class="btn btn-block btn-primary" id="prepare-start-signin-request">
Prepare Start Sign In Request
</button>
</form>
<form class="form form-bordered no-submit">
<textarea name="Start Sign In Response" id="start-signin-response"
class="form-control" placeholder="Response"></textarea>
<button class="btn btn-block btn-primary" id="get-start-signin-response">
Get Start Sign In Response
</button>
</form>
<form class="form form-bordered no-submit">
<input type="text" name="Name" id="name-signin"
class="form-control" placeholder="Name" />
<textarea type="text" name="Credential" id="credential-signin"
class="form-control" placeholder="Credential"></textarea>
<button class="btn btn-block btn-primary" id="get-credential-signin">
Get Credential
</button>
</form>
<form class="form form-bordered no-submit">
<textarea name="Finalize Sign In Request" id="finalize-signin-request"
class="form-control" placeholder="Request"></textarea>
<button class="btn btn-block btn-primary" id="prepare-finalize-signin-request">
Prepare Finalize Sign In Request
</button>
</form>
<form class="form form-bordered no-submit">
<textarea name="Finalize Sign In Response" id="finalize-signin-response"
class="form-control" placeholder="Response"></textarea>
<button class="btn btn-block btn-primary" id="get-finalize-signin-response">
Get Finalize Sign In Response
</button>
</form>
</div>

<div class="tab-pane" id="logs-section">
<pre class="well logs"></pre>
<button class="btn btn-xs btn-default pull-right clear-logs">
Expand Down
5 changes: 5 additions & 0 deletions packages/auth/demo/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
rm -rf '/Users/chuanr/Code/firebase-js-sdk/packages/auth/demo/node_modules'
rm -rf '/Users/chuanr/Code/firebase-js-sdk/packages/auth/dist'
yarn build:deps
yarn install
yarn demo
122 changes: 121 additions & 1 deletion packages/auth/demo/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,17 @@ import {
initializeRecaptchaConfig,
validatePassword,
enrollPasskey,
signInWithPasskey
signInWithPasskey,
debugCreateCredential,
debugGetCredential,
debugPrepareStartPasskeyEnrollmentRequest,
debugGetStartPasskeyEnrollmentResponse,
debugPrepareFinalizePasskeyEnrollmentRequest,
debugGetFinalizePasskeyEnrollmentResponse,
debugPrepareStartPasskeySignInRequest,
debugGetStartPasskeySignInResponse,
debugPrepareFinalizePasskeySignInRequest,
debugGetFinalizePasskeySignInResponse
} from '@firebase/auth';

import { config } from './config';
Expand Down Expand Up @@ -534,6 +544,89 @@ function onSignInWithPasskey() {
signInWithPasskey(auth, name).then(onAuthSuccess, onAuthError);
}

// Enroll
async function onPrepareStartEnrollRequest() {
const requestStr = await debugPrepareStartPasskeyEnrollmentRequest(
activeUser()
);
$('#start-enroll-request').val(requestStr);
}

async function onGetStartEnrollResponse() {
const requestStr = $('#start-enroll-request').val();
const responseStr = await debugGetStartPasskeyEnrollmentResponse(
activeUser(),
requestStr
);
$('#start-enroll-response').val(responseStr);
}

async function onCreateCredentialEnroll() {
const name = $('#name-enroll').val();
const responseStr = $('#start-enroll-response').val();
const credentialStr = await debugCreateCredential(name, responseStr);
$('#credential-enroll').val(credentialStr);
}

async function onPrepareFinalizeEnrollRequest() {
const name = $('#name-enroll').val();
const credentialStr = $('#credential-enroll').val();
const requestStr = await debugPrepareFinalizePasskeyEnrollmentRequest(
activeUser(),
name,
credentialStr
);
$('#finalize-enroll-request').val(requestStr);
}

async function onGetFinalizeEnrollResponse() {
const requestStr = $('#finalize-enroll-request').val();
const responseStr = await debugGetFinalizePasskeyEnrollmentResponse(
activeUser(),
requestStr
);
$('#finalize-enroll-response').val(responseStr);
}

// Sign in
async function onPrepareStartSignInRequest() {
const requestStr = await debugPrepareStartPasskeySignInRequest();
$('#start-signin-request').val(requestStr);
}

async function onGetStartSignInResponse() {
const requestStr = $('#start-signin-request').val();
const responseStr = await debugGetStartPasskeySignInResponse(
auth,
requestStr
);
$('#start-signin-response').val(responseStr);
}

async function onGetCredentialSignIn() {
const name = $('#name-signin').val();
const responseStr = $('#start-signin-response').val();
const credentialStr = await debugGetCredential(name, responseStr);
$('#credential-signin').val(credentialStr);
}

async function onPrepareFinalizeSignInRequest() {
const credentialStr = $('#credential-signin').val();
const requestStr = await debugPrepareFinalizePasskeySignInRequest(
credentialStr
);
$('#finalize-signin-request').val(requestStr);
}

async function onGetFinalizeSignInResponse() {
const requestStr = $('#finalize-signin-request').val();
const responseStr = await debugGetFinalizePasskeySignInResponse(
auth,
requestStr
);
$('#finalize-signin-response').val(responseStr);
}

/**
* Updates the displayed validation status for the inputted password.
* @param {string} sectionIdPrefix The ID prefix of the section to show the password requirements in.
Expand Down Expand Up @@ -1991,6 +2084,14 @@ function onCopyLastUser() {
/** Applies selected auth settings change. */
function onApplyAuthSettingsChange() {
try {
const prodApiHost = 'identitytoolkit.googleapis.com';
const stagingApiHost = 'staging-identitytoolkit.sandbox.googleapis.com';
if ($('input[name=api-host]:checked').val() === 'prod') {
auth.updateApiHost(prodApiHost);
} else {
auth.updateApiHost(stagingApiHost);
}

auth.settings.appVerificationDisabledForTesting =
$('input[name=enable-app-verification]:checked').val() === 'No';
alertSuccess('Auth settings changed');
Expand Down Expand Up @@ -2270,6 +2371,25 @@ function initApp() {
$('#verify-password-reset-code').click(onVerifyPasswordResetCode);
$('#confirm-password-reset').click(onConfirmPasswordReset);

// Debug
// Enroll
$('#prepare-start-enroll-request').click(onPrepareStartEnrollRequest);
$('#get-start-enroll-response').click(onGetStartEnrollResponse);

$('#create-credential-enroll').click(onCreateCredentialEnroll);

$('#prepare-finalize-enroll-request').click(onPrepareFinalizeEnrollRequest);
$('#get-finalize-enroll-response').click(onGetFinalizeEnrollResponse);

// SignIn
$('#prepare-start-signin-request').click(onPrepareStartSignInRequest);
$('#get-start-signin-response').click(onGetStartSignInResponse);

$('#get-credential-signin').click(onGetCredentialSignIn);

$('#prepare-finalize-signin-request').click(onPrepareFinalizeSignInRequest);
$('#get-finalize-signin-response').click(onGetFinalizeSignInResponse);

$('#get-provider-data').click(onGetProviderData);
$('#enroll-passkey').click(onEnrollPasskey);
$('#link-with-email-and-password').click(onLinkWithEmailAndPassword);
Expand Down
2 changes: 1 addition & 1 deletion packages/auth/src/api/account_management/passkey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ interface AuthenticatorResponseJSON {
userHandle?: string;
}

interface PublicKeyCredentialJSON {
export interface PublicKeyCredentialJSON {
id: string;
type: string;
rawId: string;
Expand Down
6 changes: 6 additions & 0 deletions packages/auth/src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ export async function _performApiRequest<T, V>(
}

return FetchProvider.fetch()(
// _getFinalTarget(
// auth,
// 'staging-identitytoolkit.sandbox.googleapis.com',
// path,
// query
// ),
_getFinalTarget(auth, auth.config.apiHost, path, query),
{
method,
Expand Down
5 changes: 5 additions & 0 deletions packages/auth/src/core/auth/auth_impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,11 @@ export class AuthImpl implements AuthInternal, _FirebaseService {
this.languageCode = _getUserLanguage();
}

updateApiHost(apiHost: string): void {
console.log("!!!!!" + apiHost);
this.config.apiHost = apiHost;
}

async _delete(): Promise<void> {
this._deleted = true;
}
Expand Down
16 changes: 16 additions & 0 deletions packages/auth/src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ export function onAuthStateChanged(
export function useDeviceLanguage(auth: Auth): void {
getModularInstance(auth).useDeviceLanguage();
}
export function updateApiHost(auth: Auth, apiHost: string): void {
getModularInstance(auth).updateApiHost(apiHost);
}

/**
* Asynchronously sets the provided user as {@link Auth.currentUser} on the
* {@link Auth} instance.
Expand Down Expand Up @@ -295,6 +299,18 @@ export {
verifyBeforeUpdateEmail
} from './strategies/email';
export { signInWithPasskey, enrollPasskey } from './strategies/passkey';
export {
debugCreateCredential,
debugGetCredential,
debugPrepareStartPasskeyEnrollmentRequest,
debugGetStartPasskeyEnrollmentResponse,
debugPrepareFinalizePasskeyEnrollmentRequest,
debugGetFinalizePasskeyEnrollmentResponse,
debugPrepareStartPasskeySignInRequest,
debugGetStartPasskeySignInResponse,
debugPrepareFinalizePasskeySignInRequest,
debugGetFinalizePasskeySignInResponse
} from './strategies/passkey';

// core
export { ActionCodeURL, parseActionCodeURL } from './action_code_url';
Expand Down

0 comments on commit 74291bf

Please sign in to comment.