Skip to content

Commit c6b276d

Browse files
committed
Update demo to include password validation
1 parent 5ef98ff commit c6b276d

File tree

3 files changed

+123
-1
lines changed

3 files changed

+123
-1
lines changed

packages/auth/demo/public/index.html

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,34 @@
367367
Confirm Password Change
368368
</button>
369369
</form>
370+
371+
<!-- Password Validation -->
372+
<div class="group">Password Validation</div>
373+
<form class="form form-bordered no-submit">
374+
<input type="password" name="password" id="password-validation-password"
375+
class="form-control" placeholder="Password" />
376+
<ul class="list-group" id="password-validation-requirements">
377+
<li class="list-group-item" id="password-validation-meets-min-length">
378+
Password must be at least <span id="password-validation-min-length">6</span> characters.
379+
</li>
380+
<li class="list-group-item" id="password-validation-meets-max-length">
381+
Password must be at most <span id="password-validation-max-length">4096</span> characters.
382+
</li>
383+
<li class="list-group-item" id="password-validation-contains-lowercase">
384+
Password must contain a lowercase letter.
385+
</li>
386+
<li class="list-group-item" id="password-validation-contains-uppercase">
387+
Password must contain an uppercase letter.
388+
</li>
389+
<li class="list-group-item" id="password-validation-contains-numeric">
390+
Password must contain a numeric character.
391+
</li>
392+
<li class="list-group-item" id="password-validation-contains-non-alphanumeric">
393+
Password must contain a non-alphanumeric character.
394+
</li>
395+
</ul>
396+
</form>
397+
370398
<!-- Fetch Sign In Methods -->
371399
<div class="group">Fetch Sign In Methods</div>
372400
<form class="form form-bordered no-submit">

packages/auth/demo/public/style.css

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,17 @@ body.user-info-displayed {
7676
border: none;
7777
}
7878

79+
#password-validation-requirements {
80+
margin-top: 20px;
81+
margin-bottom: 0;
82+
display: none;
83+
}
84+
85+
#password-validation-requirements .list-group-item {
86+
display: none;
87+
list-style-type: none;
88+
}
89+
7990
.logs {
8091
color: #555;
8192
font-family: 'Courier New', Courier;

packages/auth/demo/src/index.js

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ import {
7272
getRedirectResult,
7373
browserPopupRedirectResolver,
7474
connectAuthEmulator,
75-
initializeRecaptchaConfig
75+
initializeRecaptchaConfig,
76+
validatePassword
7677
} from '@firebase/auth';
7778

7879
import { config } from './config';
@@ -493,6 +494,87 @@ function onInitializeRecaptchaConfig() {
493494
initializeRecaptchaConfig(auth);
494495
}
495496

497+
/**
498+
* Updates the displayed validation status for the inputted password.
499+
*/
500+
function onValidatePassword() {
501+
/**
502+
* Updates the displayed status for a requirement.
503+
* @param {string} id The ID of the DOM element displaying the requirement status.
504+
* @param {boolean} status Whether the requirement is met.
505+
*/
506+
function setRequirementStatus(id, status) {
507+
if (status) {
508+
$(id).removeClass('list-group-item-danger');
509+
$(id).addClass('list-group-item-success');
510+
} else {
511+
$(id).removeClass('list-group-item-success');
512+
$(id).addClass('list-group-item-danger');
513+
}
514+
$(id).show();
515+
}
516+
517+
const password = $('#password-validation-password').val();
518+
validatePassword(auth, password).then(
519+
status => {
520+
const customStrengthOptions = status.passwordPolicy.customStrengthOptions;
521+
522+
// Only show options required by the password policy.
523+
if (customStrengthOptions.minPasswordLength) {
524+
$('#password-validation-min-length').text(
525+
customStrengthOptions.minPasswordLength
526+
);
527+
setRequirementStatus(
528+
'#password-validation-meets-min-length',
529+
status.meetsMinPasswordLength
530+
);
531+
}
532+
if (customStrengthOptions.maxPasswordLength) {
533+
$('#password-validation-max-length').text(
534+
customStrengthOptions.maxPasswordLength
535+
);
536+
setRequirementStatus(
537+
'#password-validation-meets-max-length',
538+
status.meetsMaxPasswordLength
539+
);
540+
}
541+
if (customStrengthOptions.containsLowercaseLetter) {
542+
setRequirementStatus(
543+
'#password-validation-contains-lowercase',
544+
status.containsLowercaseLetter
545+
);
546+
}
547+
if (customStrengthOptions.containsUppercaseLetter) {
548+
setRequirementStatus(
549+
'#password-validation-contains-uppercase',
550+
status.containsUppercaseLetter
551+
);
552+
}
553+
if (customStrengthOptions.containsNumericCharacter) {
554+
setRequirementStatus(
555+
'#password-validation-contains-numeric',
556+
status.containsNumericCharacter
557+
);
558+
}
559+
if (customStrengthOptions.containsNonAlphanumericCharacter) {
560+
setRequirementStatus(
561+
'#password-validation-contains-non-alphanumeric',
562+
status.containsNonAlphanumericCharacter
563+
);
564+
}
565+
566+
$('#password-validation-password').prop('disabled', false);
567+
$('#password-validation-requirements').show();
568+
},
569+
error => {
570+
// Disable the password input and hide the requirements since validation cannot be performed.
571+
$('#password-validation-password').prop('disabled', true);
572+
$('#password-validation-requirements').hide();
573+
onAuthError(error);
574+
}
575+
);
576+
}
577+
496578
/**
497579
* Signs in with a generic IdP credential.
498580
*/
@@ -2033,6 +2115,7 @@ function initApp() {
20332115
$('#sign-in-anonymously').click(onSignInAnonymously);
20342116
$('.set-tenant-id').click(onSetTenantID);
20352117
$('#initialize-recaptcha-config').click(onInitializeRecaptchaConfig);
2118+
$('#password-validation-password').keyup(onValidatePassword);
20362119
$('#sign-in-with-generic-idp-credential').click(
20372120
onSignInWithGenericIdPCredential
20382121
);

0 commit comments

Comments
 (0)