JavaScript: creare un misuratore di robustezza delle password con la libreria zxcvbn
In questo articolo creeremo un misuratore di robustezza delle password in JavaScript utilizzando la libreria zxcvbn.
zxcvbn è una potente libreria che controlla l'entropia e la robustezza di una data password. È molto semplice da usare: passiamo la password al costruttore e otteniamo un oggetto contenente varie informazioni.
Le informazioni che utilizzeremo qui sono la proprietà score
che riporta un punteggio da 0 a 4 che indica i cinque livelli di sicurezza di una password.
Partiamo dalla seguente marcatura:
<form id="test-form" action="" method="post" novalidate>
<div class="form-group">
<label for="password">Choose a password</label>
<input type="text" name="password" id="password" class="form-control">
<div class="password-meter-wrap">
<div class="password-meter-bar"></div>
</div>
</div>
</form>
Quindi possiamo creare cinque classi CSS con una larghezza crescente e un colore di sfondo diverso da applicare dinamicamente alla barra interna.
.password-meter-wrap {
margin-top: 5px;
height: 16px;
background-color: #ddd;
}
.password-meter-bar {
width: 0;
height: 100%;
transition: width 400ms ease-in;
}
.password-meter-bar.level0 {
width: 20%;
background-color: #d00;
}
.password-meter-bar.level1 {
width: 40%;
background-color: #f50;
}
.password-meter-bar.level2 {
width: 60%;
background-color: #ff0;
}
.password-meter-bar.level3 {
width: 80%;
background-color: rgb(161, 168, 65);
}
.password-meter-bar.level4 {
width: 100%;
background-color: #393;
}
Cinque livelli, cinque classi, cinque larghezze differenti che vanno da 0 a 100% con un singolo step pari al 20% perché 100/5 = 20.
Ora possiamo scrivere il codice JavaScript:
'use strict';
class PasswordMeter {
constructor(selector) {
this.wrappers = document.querySelectorAll(selector);
if(this.wrappers.length > 0) {
this.init(this.wrappers);
}
}
init(wrappers) {
wrappers.forEach(wrapper => {
let bar = wrapper.querySelector('.password-meter-bar');
let input = wrapper.previousElementSibling;
input.addEventListener('keyup', () => {
let value = input.value;
bar.classList.remove('level0', 'level1', 'level2', 'level3', 'level4');
let result = zxcvbn(value);
let cls = `level${result.score}`;
bar.classList.add(cls);
}, false);
});
}
}
document.addEventListener('DOMContentLoaded', () => {
const passwordMeter = new PasswordMeter('.password-meter-wrap');
}, false);
Associamo un evento keyup
al campo della password dove controlliamo la robustezza della password utilizzando il costruttore della libreria zxcvbn. Otteniamo il nostro risultato e usiamo il valore intero per modificare dinamicamente le classi CSS della barra interna. Come si può notare, questa logica è davvero semplice.