Every SignUp page contains a field to enter a password, but it should not be just a dumb component that takes input and saves it on server. A password field on a SignUp page should tell how weak or strong the password is. We decided to implement this in our SUSI.AI Web Chat SignUp Page.
Our SignUp page look like this:
After entering a valid email, user needs to enter the password. It shows that minimum 6 character are required:
We have the following div for our Password Field :
<PasswordField name="password" style={fieldStyle} value={this.state.passwordValue} onChange={this.handleChange} errorText={this.passwordErrorMessage} floatingLabelText="Password" />
In our OnChange Method we need to check the strength of password once the six character limit is crossed and display the strength visually.
We have used Dropbox’s zxcvbn library for the purpose of getting the strength of password.
Major reasons of choosing this library are :
- Flexibility : It allows different passwords as long as certain level of complexity is matched.
- Usability : It is very easy use and gives instant feedback. This helps user towards less guessable passwords.
For installing this library :
npm -S install zxcvbn
For importing this:
import zxcvbn from 'zxcvbn';
Now in our OnChange Method:
handleChange = (event) => { let email; let password; let confirmPassword; let serverUrl; let state = this.state // Checking if event is password if (event.target.name === 'password') { password = event.target.value; let validPassword = password.length >= 6; state.passwordValue=password; state.passwordError = !(password && validPassword); if(validPassword) { //getting strength of password from zxcvbn let result = zxcvbn(password); state.passwordScore=result.score; let strength = [ 'Worst', 'Bad', 'Weak', 'Good', 'Strong' ]; state.passwordStrength=strength[result.score]; } else { state.passwordStrength=''; state.passwordScore=-1; } }
Explanation:
In the above method result variable gets the strength of password and result.score gives us the score of password in terms of an integer and according to which we have made an array to get result in remarks corresponding to score. We have remarks like Good, Strong, etc.
Initially we have set the score to -1 to know that user has not entered the password yet. Once user has entered password the score changes.
Then we made a wrapper class to help css format the color of remark and display a meter (determining password strength) with corresponding length and color. We have used template strings to make our wrapper class. This helps us in having different names of wrapper class according to the score of the password.
// using Template Strings(look at resources for more info) const PasswordClass=[`is-strength-${this.state.passwordScore}`];
Then we wrapped our Password field in div with className = “PasswordClass”.
<div className={PasswordClass.join(' ')}> <PasswordField name="password" style={fieldStyle} value={this.state.passwordValue} onChange={this.handleChange} errorText={this.passwordErrorMessage} floatingLabelText="Password" /> <div className="ReactPasswordStrength-strength-bar" /> <div>
All that was left to was add css code corresponding to every score. For example for score=3, the following css was made:
.is-strength-3 { color: #57B8FF; } .ReactPasswordStrength-strength-bar { box-sizing: border-box; height: 2px; position: relative; top: 1px; right: 1px; transition: width 300ms ease-out; } .is-strength--1 .ReactPasswordStrength-strength-bar { background: #D1462F; display: none; } // if strength = -1 then setting display of block equals to none .is-strength--1 .ReactPasswordStrength-strength-bar { background: #D1462F; display: none; } .is-strength-3 .ReactPasswordStrength-strength-bar { background: #57B8FF; //Changing color according to password’s strength width: 192px; //Changing width according to password’s strength display: block; }
After successfully implementing all these features, We had following SignUP page:
Resources:
1)Dropbox’s library(ZXVBN): https://github.com/dropbox/zxcvbn
2)Template Strings(Used here for making wrapping class of Password Field): https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals
Test Link:
This can be tested here.