{"componentChunkName":"component---src-templates-blog-list-template-js","path":"/44","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Introduction Incorporating the latest technology in your business processes doesn’t necessarily mean you’re secure from ever-expanding…","fields":{"slug":"/identity/difference-between-authentication-login/"},"html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p>Incorporating the latest technology in your business processes doesn’t necessarily mean you’re secure from ever-expanding <a href=\"https://www.loginradius.com/blog/identity/cybersecurity-attacks-business/\">modern cybersecurity threats</a>. </p>\n<p>When we talk about various cyber threats, most of them are focused on bypassing the weak layer of authentication on online platforms that affect crucial business data and eventually put sensitive consumer information at risk. </p>\n<p>So, does it mean that most cybercriminals attack users and exploit businesses by targeting weak authentication and login mechanisms? </p>\n<p>Unfortunately, yes! </p>\n<p>And to minimize the risk, businesses first need to understand the fundamental difference when comparing authentication vs. login. Once they know the aspects of authentication vs. login, the next step is to ensure a stringent layer of security for their users. </p>\n<h2 id=\"what-is-authentication\" style=\"position:relative;\"><a href=\"#what-is-authentication\" aria-label=\"what is authentication permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is Authentication?</h2>\n<p>Authentication is identifying users and validating who they claim to be. One of the most common and apparent factors in authenticating identity is a password. </p>\n<p>If the user name matches the password credential, the identity is valid, and the system grants access to the user.</p>\n<p>Interestingly, with enterprises going passwordless, many use <a href=\"https://www.loginradius.com/authentication/\">modern authentication techniques</a> like one-time passcodes (OTP) via SMS, or email, single sign-on (SSO), multi-factor authentication (MFA) and biometrics, etc. authenticate users and deploy security beyond what passwords usually provide.</p>\n<h2 id=\"what-is-login\" style=\"position:relative;\"><a href=\"#what-is-login\" aria-label=\"what is login permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is Login?</h2>\n<p>In computer and information security, logging in is the standard process through which an individual gains access to specific resources, computer systems, or networks once they’re identified and authenticated. </p>\n<p>User credentials are typically used in a username, and a password is referred to as a login. </p>\n<p>In a nutshell, logging in to a device, database, computer, account, or network system through a username and password is called login. </p>\n<h2 id=\"vulnerabilities-associated-with-authentication-and-login\" style=\"position:relative;\"><a href=\"#vulnerabilities-associated-with-authentication-and-login\" aria-label=\"vulnerabilities associated with authentication and login permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vulnerabilities Associated with Authentication and Login</h2>\n<ul>\n<li><strong>Lack of password complexity:</strong> It's one thing to educate your consumers about password complexity; for example, they should use upper case letters, numbers, and special characters. But it is an entirely different story when you take the initiative to implement it. Ensure that for every account, a consumer's password is unique. That means no repeats. </li>\n<li><strong>Brute-force attacks:</strong> When hackers use a trial and error method to guess correct passwords, that's a <a href=\"https://www.loginradius.com/blog/identity/brute-force-lockout/\">brute-force attack</a>. Hackers use dedicated tools to make vast numbers of login attempts at high speed. Usually, these attacks are automated using a list of frequently used usernames and passwords.</li>\n<li><strong>User-generated credentials:</strong> When consumers create their passwords, there is always a possibility that they will come up with credentials that are weak and easily vulnerable to cyber attacks. Consumers may subconsciously skip password security best practices because they are more inclined to have something easy to remember. As a result, hackers can adjust their brute-force systems and crack open passwords in no time.</li>\n<li><strong>Unpatched security vulnerabilities:</strong> While thousands of threats are discovered daily, one of the most significant risks an organization may take is failing to repair or \"patch\" specific vulnerabilities once they are found. It is quite common for consumers to dismiss the \"update available\" alerts in some programs because they do not want to waste a few minutes. They aren't aware that updating patches can save them from severe cyberattacks.</li>\n<li><strong>Social engineering attacks:</strong> It happens when hackers psychologically manipulate consumers into giving up their login credentials. Common warning signs of <a href=\"https://www.loginradius.com/blog/identity/social-engineering-attacks/\">social engineering attacks</a> include asking for immediate assistance, luring with too good to be true offers, and threatening reprimands if their requests are ignored.</li>\n</ul>\n<h2 id=\"how-a-cutting-edge-ciam-like-loginradius-helps-overcome-such-vulnerabilities\" style=\"position:relative;\"><a href=\"#how-a-cutting-edge-ciam-like-loginradius-helps-overcome-such-vulnerabilities\" aria-label=\"how a cutting edge ciam like loginradius helps overcome such vulnerabilities permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How a Cutting-Edge CIAM Like LoginRadius Helps Overcome Such Vulnerabilities?</h2>\n<p>When we talk about authentication vs. login, the most crucial aspect that businesses shouldn’t miss is how they can overcome all the security challenges. </p>\n<p>And to overcome these challenges, businesses should incorporate a reliable new-age consumer identity and access management (CIAM) solution like LoginRadius that helps strengthen security without hampering the overall user experience.</p>\n<p>The <a href=\"https://www.loginradius.com/\">LoginRadius CIAM</a> simplifies every business task that deals with your customers individually, including those that haven’t registered on your site yet. CIAM seamlessly links authentication, customer management, sales, marketing, business intelligence, and services with a single data hub for all identities.</p>\n<p>Here’s what LoginRadius CIAM offers: </p>\n<h3 id=\"1--security-for-data-and-accounts\" style=\"position:relative;\"><a href=\"#1--security-for-data-and-accounts\" aria-label=\"1  security for data and accounts permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>#1.  Security for data and accounts.</h3>\n<p>LoginRadius provides essential security features that safeguard data and account access. For example, with risk-based authentication, each customer’s usage and login patterns are monitored, making it easy to spot unusual (potentially fraudulent) activity.</p>\n<p>For use cases where you need an extra layer of security, you can enable <a href=\"https://www.loginradius.com/blog/identity/what-is-multi-factor-authentication/\">multi-factor authentication</a> (MFA), which verifies a customer’s identity by requiring a second step, such as entering an SMS code or clicking an email link.</p>\n<p>Your secure login procedures reassure customers that they are safe using your services—something that’s essential with the number of public data breaches reaching the news.</p>\n<h3 id=\"2-advanced-login-options\" style=\"position:relative;\"><a href=\"#2-advanced-login-options\" aria-label=\"2 advanced login options permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>#2. Advanced login options</h3>\n<p>In the CIAM landscape, a business can gain an advantage by implementing new and advanced login options offered by LoginRadius that are not yet widely adopted. These login methods further improve customer experience, customer trust, or both.</p>\n<p>LoginRadius CIAM offers various new-age secure login options, including: </p>\n<ul>\n<li>Passwordless login</li>\n<li>One-touch login</li>\n<li>Smart login </li>\n</ul>\n<h3 id=\"3-scalability-and-uptime\" style=\"position:relative;\"><a href=\"#3-scalability-and-uptime\" aria-label=\"3 scalability and uptime permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>#3. Scalability and uptime</h3>\n<p>With just one customer identity management system that’s fully managed for you, reliability is maximized, and the need for resources is kept to a minimum. LoginRadius’ centralized login system for all of your apps and services makes it easy to add new services as they come online. </p>\n<p>A <a href=\"https://www.loginradius.com/cloud-directory/\">cloud implementation</a> can quickly scale up or down depending on your usage, and automated failover can cut downtime to virtually zero.</p>\n<h2 id=\"final-thoughts\" style=\"position:relative;\"><a href=\"#final-thoughts\" aria-label=\"final thoughts permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Final Thoughts</h2>\n<p>When we talk about authentication vs. login, the security of both users and businesses shouldn’t be compromised no matter what authentication method an enterprise uses. </p>\n<p>Since most cyberattacks are targeted by bypassing the weak authentication layer, enterprises must understand the importance of reliable consumer identity and access management solution. </p>\n<p>LoginRadius CIAM platform is designed to help businesses reach their targeted goals by enhancing the consumer experience, improving overall authentication security, and meeting regulatory compliances.</p>\n<p>If you wish to experience how LoginRadius works for your business, reach us today to schedule a free personalized demo.</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius-banner\"\n        title=\"book-a-demo-loginradius-banner\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"May 18, 2022","updated_date":null,"description":"Most cybercriminals attack users and exploit businesses by targeting weak authentication and login mechanisms. Businesses first need to understand the fundamental difference between authentication and login. Once they know the aspects of authentication vs. login, the next step is to ensure a stringent layer of security for their users.","title":"Authentication vs Login - What’s the Difference?","tags":["data security","authentication","login"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.4598540145985401,"src":"/static/0eaa1e1de1955624296185ecdd462152/33aa5/auth-login.jpg","srcSet":"/static/0eaa1e1de1955624296185ecdd462152/f836f/auth-login.jpg 200w,\n/static/0eaa1e1de1955624296185ecdd462152/2244e/auth-login.jpg 400w,\n/static/0eaa1e1de1955624296185ecdd462152/33aa5/auth-login.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Vishal Sharma","github":null,"avatar":null}}}},{"node":{"excerpt":"Introduction It's happened to all of us: we've forgotten our password and need to reset it (especially after summer vacation). While this…","fields":{"slug":"/identity/is-password-reset-ruining-cx/"},"html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p>It's happened to all of us: we've forgotten our password and need to reset it (especially after summer vacation).</p>\n<p>While this should be a <a href=\"https://www.loginradius.com/blog/identity/how-to-improve-customer-verification-process/\">simple process</a> for most websites, it can be a total nightmare for the customer if it's not done right. In fact, password resets are one of the most common customer service complaints. So, what can enterprises do to make sure this process is as smooth and painless as possible?</p>\n<p>We'll be discussing some of the best practices for a password reset, as well as ways to avoid ruining the customer experience!</p>\n<h2 id=\"why-is-the-process-of-a-password-reset-important\" style=\"position:relative;\"><a href=\"#why-is-the-process-of-a-password-reset-important\" aria-label=\"why is the process of a password reset important permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why is the Process of a Password Reset Important?</h2>\n<p>Password reset is an important process for both customers and businesses. Customers need access to their accounts as quickly as possible when they've forgotten their password (which – they will), and businesses need to make sure that the process is quick and easy for them (which is – inevitable).</p>\n<p>And with the average web user having multiple online accounts, with accounts doubling every 5 years, this becomes a real issue both for enterprises and personal security.</p>\n<p>With information and account overload, user behavior such as using the same password for multiple accounts invites security breaches, making authentication a top priority for enterprises.</p>\n<p><a href=\"https://www.loginradius.com/resource/adding-salt-to-hashing-a-step-by-step-guide-to-store-passwords/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABmklEQVQY0z2Q30uTURjHXyTt3duEYILitggtfzBborYtrUR9x2ZKYDelKUiXlnjlVdlNN9F/4ZWCIiaSZZSlF6ZGhYRK5tSlI0jMrjZl+PE5Z+CBL8/Dczif5/s9hlV6kzNFISamP8HxMT9WVpn5OMv850USiT/Y7T0Y3hrOld3CvFSL5WskL9SGy9+Eo8LGLKvHvFyHWXIDh8hQwOyi6wyNT7Hze4ev35fZiG2xK7CDg/8ZoKdaAx3y0HklzIWG+/jse1jBu5j+CFZJnYYpsGFJo4Gv3pBOp0kmk6RSKV2PDo8IdzzKAGWxy29TWBMVRSiojuKR6r7WTH5VJJNAARU5p7iWkdfv+RVP8DO2zfpmnL39f6gT7eo9dXhWIjulekOteIOturquhvX81KFq1GBwdJIvyyssidY2tojFd/krUFscZl0MYLireDzwktX1TcamPkiitwxPTDO3+I13cwucr2gkRzgaqJRXKX8jGz2BFtyB2xRKFBUrt7xe3yto8E43PU9e8KBvgI7ep1oP+5/T2fcMZ7kkEIcnUn4DLzCiOnEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"GD-salt-to-hash\"\n        title=\"GD-salt-to-hash\"\n        src=\"/static/75d07d36528b68501e972fe56628d7f3/e5715/GD-salt-to-hash.png\"\n        srcset=\"/static/75d07d36528b68501e972fe56628d7f3/a6d36/GD-salt-to-hash.png 650w,\n/static/75d07d36528b68501e972fe56628d7f3/e5715/GD-salt-to-hash.png 768w,\n/static/75d07d36528b68501e972fe56628d7f3/81501/GD-salt-to-hash.png 2886w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<h2 id=\"how-can-a-password-reset-negatively-affect-the-customer-experience\" style=\"position:relative;\"><a href=\"#how-can-a-password-reset-negatively-affect-the-customer-experience\" aria-label=\"how can a password reset negatively affect the customer experience permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How Can a Password Reset Negatively Affect the Customer Experience?</h2>\n<p>If the password reset process is lengthy or difficult, customers will inevitably be frustrated which can lead to a number of customer service issues. </p>\n<p>For starters, the customer might not be able to get back into their account, and if this drags on for any length of time causes major inconveniences. If the frustration builds up with a poorly executed process for resetting a password and authenticating the user can lead to negative word-of-mouth advertising and even lost business.</p>\n<p>In addition, a <a href=\"https://www.loginradius.com/blog/identity/common-vulnerabilities-password-based-login/\">botched password reset</a> can also lead to customer data being compromised. This could potentially expose the customer to identity theft or fraud due to the sheer amount of accounts that the average user has. </p>\n<p>Finally, if the password reset process is too difficult or complicated, the customer might be less likely to try again in the future.</p>\n<p>All of these scenarios have a negative impact on the customer experience and ultimately damage the relationship with them. It's way easier for a customer to abandon ship at switch over to another business that handles onboarding and customer support excellently. </p>\n<p>There is simply no room for mistakes in a globally competitive market in order to both acquire and retain customers for the long haul.</p>\n<h2 id=\"how-to-make-a-password-reset-as-seamless-as-possible\" style=\"position:relative;\"><a href=\"#how-to-make-a-password-reset-as-seamless-as-possible\" aria-label=\"how to make a password reset as seamless as possible permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to Make a Password Reset as Seamless as Possible?</h2>\n<p>When it comes to password resets, enterprises need to be careful about how they go about it. If it's too complicated, customers will inevitably get frustrated. Here are a few tips for making a password reset as seamless as possible:</p>\n<h3 id=\"1-keep-the-process-short\" style=\"position:relative;\"><a href=\"#1-keep-the-process-short\" aria-label=\"1 keep the process short permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Keep the process short.</h3>\n<p>The key to keeping the process as painless as possible is to keep it short and simple. The last thing you want to do is force your customer to jump through hoops in order to reset their password. Make the process easy to follow, keep it under a minute, and don't require too much information. Entering an email address should be a good sweet spot. </p>\n<h3 id=\"2-make-sure-the-customer-has-all-the-necessary-information-before-starting\" style=\"position:relative;\"><a href=\"#2-make-sure-the-customer-has-all-the-necessary-information-before-starting\" aria-label=\"2 make sure the customer has all the necessary information before starting permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Make sure the customer has all the necessary information before starting.</h3>\n<p>Password resets can be a huge pain for customers, but with the right preparation, they can be as seamless as possible. Make sure the customer has all the necessary information before starting. The customer should also be aware of the reset process and what to expect. The last thing you want is for them to be confused during the process.</p>\n<h3 id=\"3-make-sure-the-information-is-secure\" style=\"position:relative;\"><a href=\"#3-make-sure-the-information-is-secure\" aria-label=\"3 make sure the information is secure permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Make sure the information is secure.</h3>\n<p>One of the most important aspects of a customer's experience is feeling safe and secure. When it comes to resetting passwords, enterprises need to take extra precautions to make sure customer data is secure as well. This means instituting safeguards against things like multiple failed logins and only sending information via secure channels. </p>\n<p>It's also important to make sure that the customer service representatives who are handling password resets are adequately trained in data security. </p>\n<p>By following these simple steps, companies can help ensure that their customers have a positive experience, even in the face of a password reset.</p>\n<h2 id=\"what-are-some-best-practices-for-resetting-passwords\" style=\"position:relative;\"><a href=\"#what-are-some-best-practices-for-resetting-passwords\" aria-label=\"what are some best practices for resetting passwords permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What are Some Best Practices for Resetting Passwords?</h2>\n<p>When resetting a customer's password, it's important to keep a few things in mind. Here are some best practices to ensure a positive customer experience:</p>\n<h3 id=\"1-reset-passwords-in-a-secure-environment\" style=\"position:relative;\"><a href=\"#1-reset-passwords-in-a-secure-environment\" aria-label=\"1 reset passwords in a secure environment permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Reset passwords in a secure environment.</h3>\n<p>When it comes to resetting passwords, enterprises have a delicate balance to strike between security and customer experience. </p>\n<p>The system needs to <a href=\"https://www.loginradius.com/blog/growth/best-practices-verification-emails-effective/\">verify the identity</a> of the user and this can be done through methods such as asking for personal information like SSN/date of birth or sending a reset link to an email address. </p>\n<p>If your system is compromised and user data is leaked, you could put your customers at risk. Make sure you use a reputable authentication vendor to help keep your system secure.</p>\n<h3 id=\"2-send-password-reset-emails-from-a-recognizable-address\" style=\"position:relative;\"><a href=\"#2-send-password-reset-emails-from-a-recognizable-address\" aria-label=\"2 send password reset emails from a recognizable address permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Send password reset emails from a recognizable address.</h3>\n<p>One way to ensure a good customer experience is to use recognizable email addresses for password reset communications. </p>\n<p>When a user receives an email from, say, support@company.com for a password reset, they are likely to experience less confusion and frustration than if the email is from an address they don't know. </p>\n<p>This small detail can make all the difference in the world when it comes to resetting passwords. </p>\n<h3 id=\"3-use-a-personalized-message-in-the-email\" style=\"position:relative;\"><a href=\"#3-use-a-personalized-message-in-the-email\" aria-label=\"3 use a personalized message in the email permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Use a personalized message in the email.</h3>\n<p>When a customer needs to reset their password, they generally expect a standardized email message from the company. </p>\n<p>However, you can make the experience more personal for your customer by <a href=\"https://chrisstarkhagen.com/blog/ai-writer-ai-content-generator\">writing personalized copy</a> in the email sequence. This small gesture can make the customer feel appreciated and more likely to continue using your service.</p>\n<h3 id=\"4-make-the-reset-process-easy-to-follow\" style=\"position:relative;\"><a href=\"#4-make-the-reset-process-easy-to-follow\" aria-label=\"4 make the reset process easy to follow permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Make the reset process easy to follow.</h3>\n<p>Instructions should be clear and concise, without any complicated steps. If possible, the reset process should not require the customer to call customer service or go through a long series of prompts. The easier the reset process is, the better.</p>\n<h2 id=\"wrap-up\" style=\"position:relative;\"><a href=\"#wrap-up\" aria-label=\"wrap up permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Wrap up</h2>\n<p>No company wants a disgruntled customer, but all too often password resets – a necessary evil – lead to just that. </p>\n<p>When done correctly, though, password resets can be easy and relatively painless for both the customer and the enterprise. By following these tips that we went through, enterprises can ensure that the customers have a positive experience when resetting their passwords.</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius\"\n        title=\"book-a-demo-loginradius\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"May 17, 2022","updated_date":null,"description":"When done correctly, password resets can be easy and relatively painless for both the customer and the enterprise. By following tips mentioned in this blog, enterprises can ensure that the customers have a positive experience when resetting their passwords.","title":"How a Simple Password Reset Can Ruin Your Customer's Experience","tags":["data security","consumer-experience","authentication","identity-verification"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.4705882352941178,"src":"/static/9e11e96e8a392b09bd5623f2e5369b9a/33aa5/paswd-reset.jpg","srcSet":"/static/9e11e96e8a392b09bd5623f2e5369b9a/f836f/paswd-reset.jpg 200w,\n/static/9e11e96e8a392b09bd5623f2e5369b9a/2244e/paswd-reset.jpg 400w,\n/static/9e11e96e8a392b09bd5623f2e5369b9a/33aa5/paswd-reset.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Chris Starkhagen","github":null,"avatar":null}}}},{"node":{"excerpt":"Web design and CSS have come a long way. And today, modern websites have everything you could wish for alongside stunning designs. Then why…","fields":{"slug":"/engineering/guest-post/modern-login-signup-form-tailwindcss-react/"},"html":"<p>Web design and CSS have come a long way. And today, modern websites have everything you could wish for alongside stunning designs. Then why should your website's login and signup forms look boring?</p>\n<p>The web ecosystem has tons of reliable third-party libraries and frameworks to help you build intuitive designs even if you're not a design wizard. Amidst the plethora of libraries comes a utility first CSS framework called <a href=\"https://tailwindcss.com/\">Tailwind CSS</a>.</p>\n<p>So in this post, you'll learn:</p>\n<ul>\n<li>what Tailwind CSS is;</li>\n<li>why it's awesome; and,</li>\n<li>how you can use it in a React app.</li>\n</ul>\n<p>I'll then walk you through step by step how to use it to create a modern login and signup form with routing in React.</p>\n<p>Finally, you'll see how to make these forms functional using <a href=\"https://www.loginradius.com/resource/whitepaper/loginradius-ciam-developers/\">LoginRadius Authentication APIs</a> docs/references/api/authentication).</p>\n<h2 id=\"what-is-tailwind-css\" style=\"position:relative;\"><a href=\"#what-is-tailwind-css\" aria-label=\"what is tailwind css permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is Tailwind CSS?</h2>\n<p>If you've heard of Materialize and Bootstrap, Tailwind CSS is much similar in what it offers. It's a CSS framework that helps developers build layouts, components, themes, and whatnot, without writing all the CSS themselves.</p>\n<p>However, unlike Bootstrap and Materialize, it doesn't give you built-in components out of the box. Instead, it gives you a wide range of fully customizable utility classes that you can use to style your pages.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.30769230769231%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACn0lEQVQoz22SW08TURSF+wNUFEpbC7RQRLFcCgaIMSi3couAQklsmemEUlpKKZCoie++++SrD8aQYOIf8DeYIMYgd1IKbaEzreCjT59npqgx8WHN3jlnztp77bVNsbo80do8jys/8tC5wpB9hRHHe8Zcq0yY14g4z1ls0lAseSTLEcMVqwza34m4gtf6lvGyT8iWLIq1IKBh0j9SWY42xwzDQyMM9I4z7PXR2+Olp+wNTz0/eR0tEK44x2dep7fzEf09o3i7Rum+P0h/6Qek8ixTlpQomMEUtKoo5XkCpUdMlGzju7yH79IuvpIdZFuWYLnGtF10aNNErjJZss/EFf1+l8mruwTMSdFhmkB5SiApOhQPZMcJ/o5DZgZSLPRliLcKkjsnBCtFMYsgsqhF4gqVBXeBxcYCCfcZMXcK2bnOlPWbID0yZJuCNhV/exJf6wGBvh2U8S3kkS0CTYdIpaIzXYFA0FLMZ12nxOpzhGuP8VeuEW9OkWhOo1RtIFu3BeH1HIo9x9ItYc7tU2Zb00QbT0g05IjeKHb2mzDsVJmrK54rrk1iLZu8eHDKQlOaRU8GybauE6pM1QuSrhSRxiyxWpVoS4b5BkFe/ZdQKtMIVanEbqpE6tJMudZ41pliqU3v8IRQzbaQvoHpyd0D/P3CgLFt5OFdgv17KO0pZp0aM46iXH2OEZeQW6MaRcICiiOJ5PzKvGefZfF/wPrFMMckVWeZrs6R6D5mzpskdu+YuDvHcusp87dzxm7pcufF3JZahDwxirjAYrNKwpMl4t4h7P5M0L5PyJ4vuqzLkq8JlOoxj2zWDIl6DBrzU43cwMW5bFaNXH8bcmRZ8uTF3AsXe6jDpv5x9B8Y7mr/uSuuU6hS43nHd15JP3g5csYvp6AG8t8jLJkAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"TailwindCSS vs. Bootstrap Comparison\"\n        title=\"TailwindCSS vs. Bootstrap Comparison\"\n        src=\"/static/53e88d5c504fe9fe3dc546ca8b0da336/e5715/tailwind-css-vs-bootstrap-comparison.png\"\n        srcset=\"/static/53e88d5c504fe9fe3dc546ca8b0da336/a6d36/tailwind-css-vs-bootstrap-comparison.png 650w,\n/static/53e88d5c504fe9fe3dc546ca8b0da336/e5715/tailwind-css-vs-bootstrap-comparison.png 768w,\n/static/53e88d5c504fe9fe3dc546ca8b0da336/7b67d/tailwind-css-vs-bootstrap-comparison.png 2240w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"why-tailwind-css-better-or-worse-than-the-others\" style=\"position:relative;\"><a href=\"#why-tailwind-css-better-or-worse-than-the-others\" aria-label=\"why tailwind css better or worse than the others permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why Tailwind CSS Better or Worse Than the Others?</h2>\n<p>The community loves Tailwind. For most developers, the key takeaway is that it gives you more freedom on how you want your components or elements to look. So in many cases, when developers use component-based CSS frameworks like Bootstrap, they have a hard time changing the way they want their website to look.</p>\n<p>Being utility first, it's the most customization-friendly CSS framework! </p>\n<p>Also, it's pretty easy to integrate with modern frontend frameworks like React, NextJS, VueJS, Angular, Svelte, etc. I'll also explore that shortly when we add Tailwind to our React app. </p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.30769230769231%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACLklEQVQoz2VTXWvTYBjtrbBN6ZI0W+0+pAVBhjLZwIvB0JuJm7DVfWRNmnSdWMQyZYyNguA2EUFEFHYr+C9kKqh3gleKovgxOl3bfEfw/vgkb5NavTh5wvs+73nPOU8SK2UsXElbUHtMKIKJfMKgamDpqIHtSRd3sx5uX3SD9zvTHu5JHpZS1MvryIsWFvkqFoV9qAmbzpqI+Q9GElYLcrdN1cb6GCPaPM9QGXdw85wDLUlEHFXOgCw0MM9/QU74STgICZtkvAlNrKGY+UG1CuVIHbMdBuY6dIKBhS5676ReroZS/1fMZhyoJEQW6pD4vQCRQh9S3MXOyiu8XtvC7sPneDD1FnOHXRSSOqkyoPXqmOd+YWfkGTYvPMbEqTqpDAVZAdoIZbK7evYdtsee4tbMZ5RP70HmKAI6JHVSDFRzhMrQJ5SH91FM0TlSqDRz9xGLFnxSWtBEF2rfb1LlYHmASHgriOD6xEdcPn4AOW5B6XVRSjso9psBSSs2GgojMttvogmyRgOXDpl4VNDxpLGL7I0XyHe5NF2dlJIjvp2MTZkGoVBGikibXGifbaoiWY3r2BjxUKq8waTyEmq3HUXk94RWI8tKDwV95huyUx8gD9YQXBA1M+Jin4mrgy7Kaa/5vbbIwou1JENMGqpiZvo9Fka/B0r/tp6PKhGLRnO9ZS/cWx4wsXLSxrUTFrOcO1aDnGqQZQtRpon/A/+XyK8FUrU6auN+zsMW/QR/AKmtFC5/kCD5AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"TailwindCSS Pros\"\n        title=\"TailwindCSS Pros\"\n        src=\"/static/4409d71c09a348492578a1acd7833fba/e5715/tailwind-css-pros.png\"\n        srcset=\"/static/4409d71c09a348492578a1acd7833fba/a6d36/tailwind-css-pros.png 650w,\n/static/4409d71c09a348492578a1acd7833fba/e5715/tailwind-css-pros.png 768w,\n/static/4409d71c09a348492578a1acd7833fba/7b67d/tailwind-css-pros.png 2240w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>On the downside, Tailwind might make your HTML bloated with loads of CSS classes for small and specific rules. However, you can control it with a framework like React by building smaller reusable components and using JSX bindings for long class names for more maintainability and readability. </p>\n<p>In fact, we'll take this optimal approach in building our Login form, so you'll understand some best practices you can use to avoid bloated HTML templates in your React app. </p>\n<h2 id=\"what-youll-build-today\" style=\"position:relative;\"><a href=\"#what-youll-build-today\" aria-label=\"what youll build today permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What You'll Build Today?</h2>\n<p>We'll create a simple yet modern looking login and signup form that looks like this:</p>\n<p><video controls width=\"700\" align=\"center\" src=\"/46886cf38c3148a337f29fc7cbf22acb/demo.mov\"> </video></p>\n<p>It will be interactive using React state, can route to different pages, and we'll also, in the end, talk about how we can make it functional from a backend standpoint. </p>\n<p>Sounds good? Let's start by understanding how we can add TailwindCSS to our React app. </p>\n<h2 id=\"project-setup\" style=\"position:relative;\"><a href=\"#project-setup\" aria-label=\"project setup permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Project Setup</h2>\n<p>Inside a directory of your choice, create a new React project by running:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"shell\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">npx create-react-app react-tailwind-app</span></code></pre>\n<p>Next, move inside the project and install react-router-dom by running:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"shell\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">cd create-react-app react-tailwind-app && npm i react-router-dom</span></code></pre>\n<h3 id=\"install-tailwind-css\" style=\"position:relative;\"><a href=\"#install-tailwind-css\" aria-label=\"install tailwind css permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Install Tailwind CSS</h3>\n<p>Now, <a href=\"https://tailwindcss.com/docs/guides/create-react-app\">add Tailwind to your React project by following the steps given here</a>. </p>\n<p>First, install Tailwind CSS and its related dependencies by running the following command in the root directory:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"shell\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">npm install -D tailwindcss postcss autoprefixer</span></code></pre>\n<p>Next, generate some configurational files by running the following command in the root directory:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"shell\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">npx tailwindcss init -p</span></code></pre>\n<p>That should generate a <code>tailwind.config.js</code> file and <code>postcss.config.js</code> file for you as shown:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 496px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 362.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAABJCAYAAAA9mQYkAAAACXBIWXMAABYlAAAWJQFJUiTwAAAHGElEQVRYw+1YSY8k1REuDpYsJGQJW6CBXqoq932tLWvrmuruqa7pZXqWbmbMaHxqIWEOIMtsEuCbhQBLRgjZV+4IBIN/hH+AjTTD8ks+IiIrs6tqesQMXPsQeplZWd/7IuKLePle5dq1a2i1Wtjc3EQYhlBVDaZpwfN8OI4L3w/EdN2Q3zRNX7DimWGYMlaOjo5w+/ZtnJycIE1T1OsKms18gsFgiOn0Mi5dmsC2nYcC8mQ8uQDevHkTd+7cATMNgkBeUBQVtVpdRr7nSdiKex7ZCsDiGY+Vvb09cslHFEVizGQ83sStW3/E9es3iOkW9vcPcOPGDRwdHePFF29jZ2eK4+NjXL68SxMrC4wrDNJoNNDpdASQHzJ9vg4opjZd5/cxeRDK6LqemGXZD4RBAIfDocQsjmOhziw910fWzjDoDRBHCbKsi35/gI2NDbTbndJNcVsjt5Xc9UqSJOj1epJpBueHnDHTsWFFLuxmCCf0H0jGfFLkP44FTdcZMCa5UPziRNzhHx3LIaAY9mSA4GADVpsmqlPQ5wDmXZVMhwEBGjOGnTZaoYMozLNsEaDn6GhH69BVRdzh2ed1l5smpqo6Aofe1VVUYgK5uH+E/snf4DV70BSFhE3gnopxZwWWWkO9RuyqM+ASVFsA9O0ZYCNwER+eIPjgv7CGB9Cra1AdH2pnDKPbgD/tw+kl8C9lMHxHXM9BFxmbFCLNmLkckTy8KJVRXqCk6ARqRiSNXpPiQ9fNCLptlSxPQXOGumvnSeHMcoYzimNI14qik2xUDIbruNhaweHoWUz7FxCRS/Va4eZi/NKwil66Qi7PZLO7uyvVUcqGfohdDV5gIIk1UgElyjWgWaa4dZqYHNAwSBn8OwubG8L29rY0BnZZoRccemHirlJMW/D2RrDHGbxJj+LYhdNvnMaRQdUclEMiMeTq4FrmUUpPpZdNKqm4DTN04W40YSU+rDQQW2Q4lxRK7kzYCbrdLkajkYCqXE6WCyUZwG6F8CfEatiEM2jAHbXkT2cC0qTCkBvDlStXMJlMZjGkH00V3dYqTGIkDKn8rFa0ALA8siJKhswuyzIBVKRSKBlpFQbN6hI7O4vFNNM8s8lyHM3Qy0uP3eTGGkWhANapUnw7xuX2LVhZBG87g021zO5ajTCv6blaLkaJbwE4Ho+lLRWy4ZbeiTKZVVymlzm7DMh/YqbLbnMVicsMyF17Z2cnd1mErVHve47cTBDsD+GRXDg54eEIwd4A4ZUNMWbPcWbW7EUpG+7W7Xa7TIpuUPcIVBieIwlhpmbsy8hMdOqVzFKf9UDxip9p+nwMo5KhZSnY6K+Jm8xMbIeEPe0h2B2IjBRaS+ZjyROXDKfTqciG12XJGLV/VbdEKnYnptgFEj9pDktZLtflQtgMyCva4eFhDkj1qdsBuetKjJiZO27DvdiGQR1FWa1Bpf6orNfLElwQNgNytzldU3R0WuuIMwv2qCNZZjCnl8LuJvC2OnLtbXYkEQVoUZaVooYL4x99X4GbUEKylNwOBZTBpD9SGNi4FPm+6I+lbLhSuNtsbW3lDDVmWEPSc+BsdeGRu5wMcXtmrEVlrbbgcpkUBmQNcmIKl31fpaXTgtmIJDZ5YkKRjtQ0C3tp0WKJlUlpNpvy9cDlx7IZ9lYRd3OGvJawy04/lViyhFjsPM7X9gJDBi37IbvgxcSM4jRsCDuuY64aDjxXBkukEHLJ0J+TDYPKYsWA9FBpjGC2msQiEzAutyK7fK/QkiqymRd2keWCYQHILrcaVVoFDVidJO+FXH5J3rGZKWdcXNTPEPYDgJSUZqMGv+nIOpKLuiXlJpokhhw/6d5zy8FDGXKl1Orkdl0Tt8Q9tppyej27n29fRZ88A1A/XXt1/aFfXcu1XH4fngV4Zps/4/lZ7z0W4KPYOeA54DngOeA54DngOeCvA1z4+vrVgMU39uzcRls6k3lswHyvdxGbfdpJBV65u/zFgGkSY/fwOry/fAa7P4Ver+Vb/6VTpEe1Ssrf2Fkfq3/6kL5QJyXg8ouP5TIfXqSugTjwYZj09U8f46aMp8YHbI9icirC+7ztyY4khc8K+4Mhjo9foOc7uE7btk3aw/CJp+yVf44hbyn4zOHgYF+kw2eHadqg/XKftr2ZnBvyeaHJR4DmqcmR4NIztkpCe5N8n0J7EdejvbKFJG3ikCa5ShvKq1ev4WB/H2vrNTkeLUxV8nPZKl2vV+syslV++8pXWHvzG6yTKW//BzUaq298jSdf/hxPvfIF/vDql/jNS5+j9tY3WPnr17hA9hzZk3/+Er9/7Susv3EX6tv0nzfvYuX1u6hU3vkfLnx0H89+cA/Opz/A+9ePUD7+HpV3v8Xv/n4Pz3x4H5X3vkX1n9/jeXrv+X98J+8/8d7/8fT79+Td6N8/ok6j/skP+Anhob5P4VXOpgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"tailwind config files\"\n        title=\"tailwind config files\"\n        src=\"/static/9ced8f7783ffd5b9ebd9abab98363db4/bb630/tailwind-config-files.png\"\n        srcset=\"/static/9ced8f7783ffd5b9ebd9abab98363db4/bb630/tailwind-config-files.png 496w\"\n        sizes=\"(max-width: 496px) 100vw, 496px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Awesome!</p>\n<h3 id=\"configuring-tailwind-css\" style=\"position:relative;\"><a href=\"#configuring-tailwind-css\" aria-label=\"configuring tailwind css permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Configuring Tailwind CSS</h3>\n<p>Now, go ahead and update the <code>tailwind.config.js</code> file to support templates for your React component files as shown:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk10\">module</span><span class=\"mtk1\">.</span><span class=\"mtk10\">exports</span><span class=\"mtk1\"> = {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk12\">content:</span><span class=\"mtk1\"> [</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&quot;./src/**/*.{js,jsx,ts,tsx}&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  ],</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk12\">theme:</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">extend:</span><span class=\"mtk1\"> {},</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk12\">plugins:</span><span class=\"mtk1\"> [],</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Almost there! We'll now add some necessary Tailwind directives to your <code>index.css</code> file present in the root directory:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"css\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">@tailwind</span><span class=\"mtk1\"> base;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">@tailwind</span><span class=\"mtk1\"> components;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">@tailwind</span><span class=\"mtk1\"> utilities;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">...</span></span></code></pre>\n<p>Each of the above directives represents a layer of Tailwind's utility classes that you can use in your project. Their declaration allows using these utility classes anywhere in your project. </p>\n<p>Finally, we'll kickstart your React project by spinning a local development server:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"shell\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">npm start</span></code></pre>\n<p>You're now ready to start using Tailwind CSS to create some awesome-looking UI for your React app!</p>\n<h2 id=\"frontend-architecture-and-boilerplate\" style=\"position:relative;\"><a href=\"#frontend-architecture-and-boilerplate\" aria-label=\"frontend architecture and boilerplate permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Frontend Architecture and Boilerplate</h2>\n<p>We'll break down the entire page into small, reusable components to ensure that your code is readable and maintainable and doesn't have bloated HTML templates. </p>\n<h3 id=\"component-architecture\" style=\"position:relative;\"><a href=\"#component-architecture\" aria-label=\"component architecture permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Component Architecture</h3>\n<p>For instance, you can have a <code>&#x3C;Header/></code> component that takes care of the page's heading and displays a link to navigate to another page. </p>\n<p>Similarly, you can have a reusable custom <code>&#x3C;Input/></code> component that can be used inside the form. All in all, here's what your frontend architecture would look like:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.30769230769231%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACPklEQVQoz4VTTWsTURTNT9BO3rxMMqlpqSCk4qLUhaYRbSk1laJtqGmaZCZJY0REFDeCUhB3ChVKoaBbV+JG8GPnQhFBqKKL4kLRYDWdzMR82KYu1OOdN0laRXFxuHPfO++8e89948rvtJDvsaApJpJyCZrHRGybgdnBNSxmgAXtO27kf2I++QMLM3VcOVIRPBspbiHOCojLH6HxMuUmXClub67+Bk2uYUx6grDnGobVRQyp8zjEbiIuFZFgm3xbwI4x9hbT8grhky1oIcMbhA2BlGwh51/HiHwHfTsSCPWcwsCuk+jnZ6Grn5FR1pvchqjQFk2Q6BR7T/gAl11uxP0AEXafcA/H+Ruc6P4C3VNFmn2D7m4QNui7gWxnGVHfU4xIdzHKHlKrhbaoEy24xjteIqhGsK83it7AIIY6biMtN+jWIpJ8tYmiyBNSGX3uc+gPHsZu/yjGtj8j76qiwqRsCF9djg9m02hTtGz76qw70T6UVirIdVuCk+k0aN1ALlBGVq1Bl+vQec0ZSutQC0leal/QyiekV5jyLiOtEsddQz7QEF5qSgmT3hc4Kj3HBFsiruEI/onN6ixMsxWE/bM46J2jli0My7cQUi/igHIVMfc7hJTLCHddwH7lEg2l4LT8N2wVHBCC18WTifIljKuPcEx5LLzTeZ3sqCPro9a95v8ETWF2lL3GJFsW7ev0RnW2RvFr0xIDM10lnNlj4nTQ+rfgVlGdhqLxCg3MEWiD9tM+E+f3ljGXqIq/6Bco8Pyp5un9kAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Login Page Architecture Hierarchy\"\n        title=\"Login Page Architecture Hierarchy\"\n        src=\"/static/04ff8abefb4aa8da5c5d0ab928cddd6b/e5715/login-page-architecture-hierarchy.png\"\n        srcset=\"/static/04ff8abefb4aa8da5c5d0ab928cddd6b/a6d36/login-page-architecture-hierarchy.png 650w,\n/static/04ff8abefb4aa8da5c5d0ab928cddd6b/e5715/login-page-architecture-hierarchy.png 768w,\n/static/04ff8abefb4aa8da5c5d0ab928cddd6b/7b67d/login-page-architecture-hierarchy.png 2240w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h3 id=\"directory-structure\" style=\"position:relative;\"><a href=\"#directory-structure\" aria-label=\"directory structure permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Directory Structure</h3>\n<p>So first, let's go ahead and create these files and folders. You'll develop corresponding files for the Signup page as well. Create the following files and folders inside your root directory:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"shell\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">.</span>\n<span class=\"grvsc-line\">├── components/</span>\n<span class=\"grvsc-line\">│   ├── FormAction.js</span>\n<span class=\"grvsc-line\">│   ├── FormExtra.js</span>\n<span class=\"grvsc-line\">│   ├── Header.js</span>\n<span class=\"grvsc-line\">│   ├── Input.js</span>\n<span class=\"grvsc-line\">│   ├── Login.js</span>\n<span class=\"grvsc-line\">│   └── Signup.js</span>\n<span class=\"grvsc-line\">├── constants/</span>\n<span class=\"grvsc-line\">│   └── formFields.js</span>\n<span class=\"grvsc-line\">└── pages/</span>\n<span class=\"grvsc-line\">    ├── Login.js</span>\n<span class=\"grvsc-line\">    └── Signup.js</span></code></pre>\n<p>For perspective, here's how we'll use those components to build your entire Login Page:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.30769230769231%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACh0lEQVQoz2WSS0hUURzGZ5c9JLKZO2oWIrZq4SJRCNpZgUaRmo/xNWP5iB7Sw9QgIhHbZLRwZYtKLF+gBJJSi1BBC11oiTUp5uhM3nnpjJPzdPx15zrJkBf+fOecy/873/c/n6L6uI2qZBvaOCslgoUSlYWuxj+M93kZfuthuNPNSKeH0R6vvP63nx6C5swg+QdsFMcaKVPbKVXbUJSqrURWsdLC/KSf/7+AwxWxCzI7N0Ft7iAZ0e/IE2YpFn5TJBhRyKrUIqWxZhmLVWZmhn1ym9+3hclkxri0wqJ+GaNRxGZz4HH7qK9r4EyajhRlOXmq72iERQpUCyhCUnUqD2VKN1qlhConMyOebR1BEEULS8tGTKKIYcHEqt0BW9s626qgMMpPRVyAcsEn2V5Dkav8SmrsTU4n1pJ+rJqMQ138+rLd4Fp34/OG7YdJQrglXTQw2I/mVBsXD06RldBFVnwvhYKksEA1T+bRN1xK7uVCUgdnY/r42LPAhneVTfxSf8j+ZmiK4dqUeTt72sk++Zxz0R9IT6wkNb6aHOV0pOUNtIe9ZMX103D7CeOfxzBMupkbceHUw/oc2L+BYTSIccqDx7fOE42B/P2rXI31oRO88kvvepQSpZ2f49vu9EN+Bp7padZ10XKtj6ayTtofjGMYC8j/W69skLtXpCxO6hNEOXZybEKLndhIOZyb8O0M7YdhgvrH12lqqaNOwvefuneG2VrplAjN6I5Y0YZrVw5D5E81Dl7dd9F2y8nrWi+9j6D7ITJ21Ad4UePk5T0Xd1LtaGIsVCRZqUmxc+NERLBl62Gl+dEW+ebL+yyypew9KzuVEyWGz80ymS7Byt00Oy1FDhrPr/EX7AF5kqCl0RYAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Login Page Architecture\"\n        title=\"Login Page Architecture\"\n        src=\"/static/4abf614464356d75a4c1bad1e319e7a5/e5715/login-page-architecture.png\"\n        srcset=\"/static/4abf614464356d75a4c1bad1e319e7a5/a6d36/login-page-architecture.png 650w,\n/static/4abf614464356d75a4c1bad1e319e7a5/e5715/login-page-architecture.png 768w,\n/static/4abf614464356d75a4c1bad1e319e7a5/7b67d/login-page-architecture.png 2240w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Makes sense? Great! </p>\n<h3 id=\"components-boilerplate-code\" style=\"position:relative;\"><a href=\"#components-boilerplate-code\" aria-label=\"components boilerplate code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Components Boilerplate Code</h3>\n<p>While we're at it, let's also create some component boilerplate for all these files except the <code>/src/constants/formFields.js</code>.</p>\n<p>For the Login.js files (<code>/src/pages/Login.js</code>), you can put down the following code:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"8\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">LoginPage</span><span class=\"mtk1\">(){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Similarly, you can create such boilerplates for the rest of the files. </p>\n<h3 id=\"form-fields-constants\" style=\"position:relative;\"><a href=\"#form-fields-constants\" aria-label=\"form fields constants permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Form Fields Constants</h3>\n<p>You've created a <code>formFields.js</code> file earlier. This file will hold all the input fields related constants like placeholder, value, name, field type, etc. Inside this file, add the following code:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"9\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">loginFields</span><span class=\"mtk1\">=[</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelText:</span><span class=\"mtk8\">&quot;Email address&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelFor:</span><span class=\"mtk8\">&quot;email-address&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">id:</span><span class=\"mtk8\">&quot;email-address&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">name:</span><span class=\"mtk8\">&quot;email&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">type:</span><span class=\"mtk8\">&quot;email&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">autoComplete:</span><span class=\"mtk8\">&quot;email&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">isRequired:</span><span class=\"mtk4\">true</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">placeholder:</span><span class=\"mtk8\">&quot;Email address&quot;</span><span class=\"mtk1\">   </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelText:</span><span class=\"mtk8\">&quot;Password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelFor:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">id:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">name:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">type:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">autoComplete:</span><span class=\"mtk8\">&quot;current-password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">isRequired:</span><span class=\"mtk4\">true</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">placeholder:</span><span class=\"mtk8\">&quot;Password&quot;</span><span class=\"mtk1\">   </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">]</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">signupFields</span><span class=\"mtk1\">=[</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelText:</span><span class=\"mtk8\">&quot;Username&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelFor:</span><span class=\"mtk8\">&quot;username&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">id:</span><span class=\"mtk8\">&quot;username&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">name:</span><span class=\"mtk8\">&quot;username&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">type:</span><span class=\"mtk8\">&quot;text&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">autoComplete:</span><span class=\"mtk8\">&quot;username&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">isRequired:</span><span class=\"mtk4\">true</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">placeholder:</span><span class=\"mtk8\">&quot;Username&quot;</span><span class=\"mtk1\">   </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelText:</span><span class=\"mtk8\">&quot;Email address&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelFor:</span><span class=\"mtk8\">&quot;email-address&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">id:</span><span class=\"mtk8\">&quot;email-address&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">name:</span><span class=\"mtk8\">&quot;email&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">type:</span><span class=\"mtk8\">&quot;email&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">autoComplete:</span><span class=\"mtk8\">&quot;email&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">isRequired:</span><span class=\"mtk4\">true</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">placeholder:</span><span class=\"mtk8\">&quot;Email address&quot;</span><span class=\"mtk1\">   </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelText:</span><span class=\"mtk8\">&quot;Password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelFor:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">id:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">name:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">type:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">autoComplete:</span><span class=\"mtk8\">&quot;current-password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">isRequired:</span><span class=\"mtk4\">true</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">placeholder:</span><span class=\"mtk8\">&quot;Password&quot;</span><span class=\"mtk1\">   </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelText:</span><span class=\"mtk8\">&quot;Confirm Password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">labelFor:</span><span class=\"mtk8\">&quot;confirm-password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">id:</span><span class=\"mtk8\">&quot;confirm-password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">name:</span><span class=\"mtk8\">&quot;confirm-password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">type:</span><span class=\"mtk8\">&quot;password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">autoComplete:</span><span class=\"mtk8\">&quot;confirm-password&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">isRequired:</span><span class=\"mtk4\">true</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">placeholder:</span><span class=\"mtk8\">&quot;Confirm Password&quot;</span><span class=\"mtk1\">   </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">]</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> {</span><span class=\"mtk12\">loginFields</span><span class=\"mtk1\">,</span><span class=\"mtk12\">signupFields</span><span class=\"mtk1\">}</span></span></code></pre>\n<p>The above file has two arrays: one each for your login form fields and signup form fields. Each array contains an object that contains attributes for the input fields.</p>\n<p>The field names should be self-explanatory as to what they represent. Here's a quick summary of that:</p>\n<ul>\n<li><code>labelText</code>: The label for an input field</li>\n<li><code>labelFor</code>: The value that associates a label to the input field via an id attribute on the input field</li>\n<li><code>id</code>, <code>name</code> , <code>type</code>, and <code>placeholder</code>: Respective attributes on the input field  </li>\n<li><code>isRequired</code>: If you want to make an input field mandatory, in this case, all our input fields for form submission will be mandatory</li>\n</ul>\n<p>Later, we'll use this array to cycle through each input field and render a custom <code>&#x3C;Input/></code> component that you'll create shortly.</p>\n<h2 id=\"set-up-routing\" style=\"position:relative;\"><a href=\"#set-up-routing\" aria-label=\"set up routing permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Set Up Routing</h2>\n<p>As you already have your components boilerplates in place, let's first set up routing for your app.</p>\n<p>By default, when a user opens the app, we'll direct them to a Login page. Then, if the route changes to <strong>/signup</strong>, we'll direct them to a Signup page. </p>\n<p>Head over to your <code>/src/App.js</code> file and add the following code:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"10\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;./App.css&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk12\">BrowserRouter</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk12\">Routes</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk12\">Route</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">} </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;react-router-dom&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">SignupPage</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;./pages/Signup&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">LoginPage</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;./pages/Login&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">App</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> (</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;min-h-full h-screen flex items-center justify-center py-12 px-4 sm:px-6 lg:px-8&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;max-w-md w-full space-y-8&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">BrowserRouter</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Routes</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Route</span><span class=\"mtk1\"> </span><span class=\"mtk12\">path</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;/&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">element</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">LoginPage</span><span class=\"mtk17\">/&gt;</span><span class=\"mtk4\">}</span><span class=\"mtk1\"> </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Route</span><span class=\"mtk1\"> </span><span class=\"mtk12\">path</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;/signup&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">element</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">SignupPage</span><span class=\"mtk17\">/&gt;</span><span class=\"mtk4\">}</span><span class=\"mtk1\"> </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk10\">Routes</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk10\">BrowserRouter</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  );</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk12\">App</span><span class=\"mtk1\">;</span></span></code></pre>\n<p>Notice that you have two containers wrapped around your <code>&#x3C;BrowserRouter/></code> with some long classnames. </p>\n<p>The first container gives a minimum height of 100% and sets a fixed height of the container to 100vh via the <code>min-h-full</code> and <code>h-screen</code> classes. Then, it centers everything via <code>flex</code>, <code>items-center</code> to vertically center all the flex child elements, and <code>justifty-center</code> to center them horizontally. </p>\n<p>Finally, we have some padding classes prefixed with <code>p</code>. For top and bottom padding, we use the prefix <code>py-</code> followed by some value. We also have some responsive padding on small and large screen devices prefixed with <code>sm:</code> and <code>lg:</code> respectively. You can learn more about these <a href=\"https://tailwindcss.com/docs/padding\">padding</a> and <a href=\"https://tailwindcss.com/docs/margin\">margin</a> properties to see other similar classes you can use. </p>\n<p>Similarly, the second container sets some width for its child elements and provides some spacing via the respective Tailwind classes.</p>\n<h2 id=\"the-header-component\" style=\"position:relative;\"><a href=\"#the-header-component\" aria-label=\"the header component permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The Header Component</h2>\n<p>Now, let's create the <code>&#x3C;Header/></code> component that you can render on both the login and signup pages for quick information and navigation.</p>\n<p>Head over to <code>/src/components/Header.js</code>, and add the following code:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"11\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> {</span><span class=\"mtk12\">Link</span><span class=\"mtk1\">} </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react-router-dom&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">Header</span><span class=\"mtk1\">({</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">heading</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">paragraph</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">linkName</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">linkUrl</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;#&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;mb-10&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;flex justify-center&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">img</span><span class=\"mtk1\"> </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                    </span><span class=\"mtk12\">alt</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                    </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;h-14 w-14&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                    </span><span class=\"mtk12\">src</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;https://ik.imagekit.io/pibjyepn7p9/Lilac_Navy_Simple_Line_Business_Logo_CGktk8RHK.png?ik-sdk-version=javascript-1.4.3</span><span class=\"mtk14\">&</span><span class=\"mtk8\">updatedAt=1649962071315&quot;</span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">h2</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;mt-6 text-center text-3xl font-extrabold text-gray-900&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk4\">{</span><span class=\"mtk12\">heading</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">h2</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">p</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;mt-2 text-center text-sm text-gray-600 mt-5&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk4\">{</span><span class=\"mtk12\">paragraph</span><span class=\"mtk4\">}</span><span class=\"mtk1\"> </span><span class=\"mtk4\">{</span><span class=\"mtk8\">&#39; &#39;</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Link</span><span class=\"mtk1\"> </span><span class=\"mtk12\">to</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">linkUrl</span><span class=\"mtk4\">}</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;font-medium text-purple-600 hover:text-purple-500&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk4\">{</span><span class=\"mtk12\">linkName</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk10\">Link</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">p</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Your <code>&#x3C;Header/></code> component takes four props:</p>\n<ul>\n<li>a dynamic <code>heading</code> that it displays on the top;</li>\n<li>then some additional text as <code>paragraph</code>;</li>\n<li>a <code>linkName</code> to display which page it will redirect the user to; and,</li>\n<li>its corresponding path as <code>linkUrl</code>.</li>\n</ul>\n<p>Using the ' justify-center ' class, we place all these elements inside a flexbox container and horizontally center them. There is also an outer container that simply gives the header some bottom margin using the <code>mb-10</code> class.</p>\n<p>Then, we give our header image some fixed height and width using the <code>h-14</code> and <code>w-14</code> classes, respectively. </p>\n<p>Finally, our text and links have some typography classes for font-size, font-colour, hover effect, and font-weight.</p>\n<p>Let's now go ahead and render the <code>&#x3C;Header/></code> component with all the props inside the Login page (<code>/src/pages/Login.js</code>):</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"12\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Header</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;../components/Header&quot;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">LoginPage</span><span class=\"mtk1\">(){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Header</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">heading</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Login to your account&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">paragraph</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Don&#39;t have an account yet? &quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">linkName</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Signup&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">linkUrl</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;/signup&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Here's what the login page should now look like:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 18.923076923076923%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAEABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAECBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAd+AsD//xAAWEAADAAAAAAAAAAAAAAAAAAAAARD/2gAIAQEAAQUCFP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAABD/2gAIAQEABj8Cf//EABYQAAMAAAAAAAAAAAAAAAAAAAAQcf/aAAgBAQABPyEpf//aAAwDAQACAAMAAAAQ8A//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAaEAEAAQUAAAAAAAAAAAAAAAABEQAQITFx/9oACAEBAAE/EHTmKCDKe2//2Q=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"login page header\"\n        title=\"login page header\"\n        src=\"/static/496d8822658d348bc2c55fffe8cac357/212bf/login-page-header.jpg\"\n        srcset=\"/static/496d8822658d348bc2c55fffe8cac357/6aca1/login-page-header.jpg 650w,\n/static/496d8822658d348bc2c55fffe8cac357/212bf/login-page-header.jpg 768w,\n/static/496d8822658d348bc2c55fffe8cac357/27b8c/login-page-header.jpg 2666w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Let's now start building the rest of the Login page form.</p>\n<h2 id=\"the-input-component\" style=\"position:relative;\"><a href=\"#the-input-component\" aria-label=\"the input component permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The Input Component</h2>\n<p>We'll now create our reusable and great looking <code>&#x3C;Input/></code> component that you'll use to build your Login form.</p>\n<p>Head over to the <code>/src/components/Input.js</code> file, and add the following code:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"13\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">fixedInputClass</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;rounded-md appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-purple-500 focus:border-purple-500 focus:z-10 sm:text-sm&quot;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">Input</span><span class=\"mtk1\">({</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">handleChange</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">value</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">labelText</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">labelFor</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">id</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">name</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">type</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">isRequired</span><span class=\"mtk1\">=</span><span class=\"mtk4\">false</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">placeholder</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">customClass</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;my-5&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">label</span><span class=\"mtk1\"> </span><span class=\"mtk12\">htmlFor</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">labelFor</span><span class=\"mtk4\">}</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;sr-only&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk4\">{</span><span class=\"mtk12\">labelText</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">label</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">input</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">onChange</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleChange</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">value</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">value</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">id</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">id</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">name</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">name</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">type</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">required</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">isRequired</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">fixedInputClass</span><span class=\"mtk1\">+</span><span class=\"mtk12\">customClass</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">placeholder</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">placeholder</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Remember all those fields' key-value pairs you set earlier in your <code>formFields.js</code> constants file?</p>\n<p>Those are all the props your <code>&#x3C;Input/></code> component will take. It will also take a <code>value</code> and a <code>handleChange</code> prop since we want this to be a controlled component linked to some state.</p>\n<p>Notice how the HTML markup of this component looks very clean. How is that possible? Are you not using any Tailwind classes here?</p>\n<p>As there are a lot of Tailwind classes for styling this input field, we have created a constant for it — called <code>fixedInputClass</code>. It contains all the essential styling classes for the input field.</p>\n<p>We also take a <code>customClass</code> prop that will append any custom Tailwind class you want to pass to the input field for customizations. How cool is that?!</p>\n<h2 id=\"the-login-component\" style=\"position:relative;\"><a href=\"#the-login-component\" aria-label=\"the login component permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The Login Component</h2>\n<p>Next, create the <code>&#x3C;Login/></code> component inside <code>/src/components/Login.js</code>, where the entire Login form will be rendered. This component will also be responsible for owning any state or event handlers passed down as props to other child components.</p>\n<p>Based on your <code>loginFields</code> from your <code>formFields</code> constants, we programmatically generate an initial value for your <code>loginState</code>.</p>\n<p>Then we have a <code>handleChange</code> event handler to update the state whenever an <code>onChange</code> event is fired from the nested <code>&#x3C;Input/></code> component. </p>\n<p>Then we simply loop through the <code>fields</code> array and render an <code>&#x3C;Input/></code> component that you've created in the previous section.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"14\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk12\">useState</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk12\">loginFields</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;../constants/formFields&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Input</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;./Input&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">fields</span><span class=\"mtk1\">=</span><span class=\"mtk12\">loginFields</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\"> = {};</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">fields</span><span class=\"mtk1\">.</span><span class=\"mtk11\">forEach</span><span class=\"mtk1\">(</span><span class=\"mtk12\">field</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\">[</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk1\">]=</span><span class=\"mtk8\">&#39;&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">Login</span><span class=\"mtk1\">(){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> [</span><span class=\"mtk12\">loginState</span><span class=\"mtk1\">,</span><span class=\"mtk12\">setLoginState</span><span class=\"mtk1\">]=</span><span class=\"mtk11\">useState</span><span class=\"mtk1\">(</span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">handleChange</span><span class=\"mtk1\">=(</span><span class=\"mtk12\">e</span><span class=\"mtk1\">)</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk11\">setLoginState</span><span class=\"mtk1\">({...</span><span class=\"mtk12\">loginState</span><span class=\"mtk1\">,</span><span class=\"mtk12\">[e.target.id]:e</span><span class=\"mtk1\">.</span><span class=\"mtk12\">target</span><span class=\"mtk1\">.</span><span class=\"mtk12\">value</span><span class=\"mtk1\">})</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">form</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;mt-8 space-y-6&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;-space-y-px&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk4\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">fields</span><span class=\"mtk1\">.</span><span class=\"mtk11\">map</span><span class=\"mtk1\">(</span><span class=\"mtk12\">field</span><span class=\"mtk4\">=&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Input</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">key</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">handleChange</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleChange</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">value</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">loginState</span><span class=\"mtk1\">[</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk1\">]</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">labelText</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">labelText</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">labelFor</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">labelFor</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">id</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">name</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">type</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">isRequired</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">isRequired</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">placeholder</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">placeholder</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                    </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">       </span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">form</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Before seeing how the login form looks, you need to render it inside your Login page.</p>\n<p>So render the above <code>&#x3C;Login/></code> component inside <code>/src/pages/Login.js</code> file as shown:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"15\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Header</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;../components/Header&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Login</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;../components/Login&quot;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">LoginPage</span><span class=\"mtk1\">(){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Header</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">heading</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Login to your account&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">paragraph</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Don&#39;t have an account yet? &quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">linkName</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Signup&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">linkUrl</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;/signup&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Login</span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Now, if you go back to your React app, you should see your Login page input fields appear as follows:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 25.538461538461537%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAFABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAECBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAd+AsD//xAAUEAEAAAAAAAAAAAAAAAAAAAAQ/9oACAEBAAEFAn//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAQ/9oACAEBAAY/An//xAAXEAEAAwAAAAAAAAAAAAAAAAABABBh/9oACAEBAAE/IYG1/9oADAMBAAIAAwAAABDwD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABoQAAICAwAAAAAAAAAAAAAAAAERABAhMVH/2gAIAQEAAT8QOoh5F9r/2Q=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"login page with input fiels\"\n        title=\"login page with input fiels\"\n        src=\"/static/cbb10ea9a4b8162c9e9e9501ff9b8fad/212bf/login-page-with-input-fields.jpg\"\n        srcset=\"/static/cbb10ea9a4b8162c9e9e9501ff9b8fad/6aca1/login-page-with-input-fields.jpg 650w,\n/static/cbb10ea9a4b8162c9e9e9501ff9b8fad/212bf/login-page-with-input-fields.jpg 768w,\n/static/cbb10ea9a4b8162c9e9e9501ff9b8fad/eec88/login-page-with-input-fields.jpg 2880w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Excellent, it looks like you're almost there!</p>\n<p>Now add the final pieces to the Login page by writing the <code>&#x3C;FormExtra></code> and <code>&#x3C;FormAction/></code> components.</p>\n<h2 id=\"wrapping-up-the-login-page\" style=\"position:relative;\"><a href=\"#wrapping-up-the-login-page\" aria-label=\"wrapping up the login page permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Wrapping Up the Login Page</h2>\n<p>The <code>&#x3C;FormExtra/></code> component holds the template and styles for a simple \"Remember me\" functionality. </p>\n<p>Inside <code>/src/components/FormExtra.js</code> file, add the following code:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"16\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">FormExtra</span><span class=\"mtk1\">(){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;flex items-center justify-between &quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;flex items-center&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">input</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk12\">id</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;remember-me&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk12\">name</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;remember-me&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;checkbox&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;h-4 w-4 text-purple-600 focus:ring-purple-500 border-gray-300 rounded&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">label</span><span class=\"mtk1\"> </span><span class=\"mtk12\">htmlFor</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;remember-me&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;ml-2 block text-sm text-gray-900&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            Remember me</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">label</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;text-sm&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">a</span><span class=\"mtk1\"> </span><span class=\"mtk12\">href</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;#&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;font-medium text-purple-600 hover:text-purple-500&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            Forgot your password?</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">a</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Again here we're using some Tailwind typography and flexbox classes to style and structure the layout of the UI. </p>\n<p>Let's go to the <code>/src/components/FormAction.js</code> file and create a submit button for the Login form. </p>\n<p>Add the following code inside this file:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"17\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">FormAction</span><span class=\"mtk1\">({</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">handleSubmit</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&#39;Button&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">action</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&#39;submit&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">text</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk4\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk12\">type</span><span class=\"mtk1\">===</span><span class=\"mtk8\">&#39;Button&#39;</span><span class=\"mtk1\"> ?</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">button</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">action</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-purple-600 hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 mt-10&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">onSubmit</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleSubmit</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk4\">{</span><span class=\"mtk12\">text</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">button</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            :</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;&gt;&lt;/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Notice that you also have loads of CSS classes inside our <code>&#x3C;button/></code> element to style it. It makes our HTML appear bloated and difficult to read. We can follow the same approach of using a constant and a prop against the <code>className</code> for the <code>&#x3C;button/></code> as we previously did to combat this. </p>\n<p>At last, we'll put everything together inside <code>/src/components/Login.js</code> file as follows:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"18\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk12\">useState</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk12\">loginFields</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;../constants/formFields&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">FormAction</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;./FormAction&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">FormExtra</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;./FormExtra&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Input</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;./Input&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">fields</span><span class=\"mtk1\">=</span><span class=\"mtk12\">loginFields</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\"> = {};</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">fields</span><span class=\"mtk1\">.</span><span class=\"mtk11\">forEach</span><span class=\"mtk1\">(</span><span class=\"mtk12\">field</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\">[</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk1\">]=</span><span class=\"mtk8\">&#39;&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">Login</span><span class=\"mtk1\">(){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> [</span><span class=\"mtk12\">loginState</span><span class=\"mtk1\">,</span><span class=\"mtk12\">setLoginState</span><span class=\"mtk1\">]=</span><span class=\"mtk11\">useState</span><span class=\"mtk1\">(</span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">handleChange</span><span class=\"mtk1\">=(</span><span class=\"mtk12\">e</span><span class=\"mtk1\">)</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk11\">setLoginState</span><span class=\"mtk1\">({...</span><span class=\"mtk12\">loginState</span><span class=\"mtk1\">,</span><span class=\"mtk12\">[e.target.id]:e</span><span class=\"mtk1\">.</span><span class=\"mtk12\">target</span><span class=\"mtk1\">.</span><span class=\"mtk12\">value</span><span class=\"mtk1\">})</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">handleSubmit</span><span class=\"mtk1\">=(</span><span class=\"mtk12\">e</span><span class=\"mtk1\">)</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">e</span><span class=\"mtk1\">.</span><span class=\"mtk11\">preventDefault</span><span class=\"mtk1\">();</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk11\">authenticateUser</span><span class=\"mtk1\">();</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk3\">//Handle Login API Integration here</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">authenticateUser</span><span class=\"mtk1\"> = () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">form</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;mt-8 space-y-6&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">onSubmit</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleSubmit</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;-space-y-px&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk4\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">fields</span><span class=\"mtk1\">.</span><span class=\"mtk11\">map</span><span class=\"mtk1\">(</span><span class=\"mtk12\">field</span><span class=\"mtk4\">=&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Input</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">key</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">handleChange</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleChange</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">value</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">loginState</span><span class=\"mtk1\">[</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk1\">]</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">labelText</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">labelText</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">labelFor</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">labelFor</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">id</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">name</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">type</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">isRequired</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">isRequired</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">placeholder</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">placeholder</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                    </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">FormExtra</span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">FormAction</span><span class=\"mtk1\"> </span><span class=\"mtk12\">handleSubmit</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleSubmit</span><span class=\"mtk4\">}</span><span class=\"mtk1\"> </span><span class=\"mtk12\">text</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Login&quot;</span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">form</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>And once we do that, we should have a stunning, modern looking login page appear right in front of us:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 62.46153846153847%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA90lEQVQoz62RTU7DMBCFff81ErCCQxQjxUncCiliAQeA8rOHRZUmrt3YMw87gRXUVSOe9EnjmfHT2COUUiiKIqIgpcRicfMLKW+R+sq6QqkKLOs71KsVylJBa4065rVeoqoqCPyzRAgBObz3CBQmwnEEMyNHUv/Rw3yaMT7WL3JGO2uxfn3H89Mb1pGXGNuYyxlnJyQiOLeHdQ7O7uEdgTFjwiQiRtcZDIMH02TOTCCmeYbpsrEGnnw6jQRPCMO3IU403G0CmssNmvMWj9cGD1c9mrMO9xd9rNHBfzxgyOOT3TbSMmxLI247kWrAyVv+4S/xvC3P4QsLC6JyPkfDCgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"login page\"\n        title=\"login page\"\n        src=\"/static/2bb44b070fe325150bbfc386d7bc3561/e5715/login-page.png\"\n        srcset=\"/static/2bb44b070fe325150bbfc386d7bc3561/a6d36/login-page.png 650w,\n/static/2bb44b070fe325150bbfc386d7bc3561/e5715/login-page.png 768w,\n/static/2bb44b070fe325150bbfc386d7bc3561/d9ed5/login-page.png 2880w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"the-signup-page\" style=\"position:relative;\"><a href=\"#the-signup-page\" aria-label=\"the signup page permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The Signup Page</h2>\n<p>You've created so many reusable components. Now, it's straightforward to use them to build the Signup page further.</p>\n<p>Feel free to take this as a challenge and build it yourself based on what you've learned. </p>\n<p>Here's a quick walkthrough of the steps and how you can use the same approach to build the Signup page in minutes. </p>\n<p>First, create a main <code>&#x3C;Singup/></code> component inside <code>/src/components/Signup.js</code> file similar to the <code>&#x3C;Login/></code> component you've completed in the previous section. It will render the signup form fields and attach state and event handlers to it.</p>\n<p>Here's how the entire code looks like:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"19\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk12\">useState</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> { </span><span class=\"mtk12\">signupFields</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;../constants/formFields&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">FormAction</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;./FormAction&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Input</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;./Input&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">fields</span><span class=\"mtk1\">=</span><span class=\"mtk12\">signupFields</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">let</span><span class=\"mtk1\"> </span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\">={};</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">fields</span><span class=\"mtk1\">.</span><span class=\"mtk11\">forEach</span><span class=\"mtk1\">(</span><span class=\"mtk12\">field</span><span class=\"mtk1\"> </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\">[</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk1\">]=</span><span class=\"mtk8\">&#39;&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">Signup</span><span class=\"mtk1\">(){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> [</span><span class=\"mtk12\">signupState</span><span class=\"mtk1\">,</span><span class=\"mtk12\">setSignupState</span><span class=\"mtk1\">]=</span><span class=\"mtk11\">useState</span><span class=\"mtk1\">(</span><span class=\"mtk12\">fieldsState</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">handleChange</span><span class=\"mtk1\">=(</span><span class=\"mtk12\">e</span><span class=\"mtk1\">)</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk11\">setSignupState</span><span class=\"mtk1\">({...</span><span class=\"mtk12\">signupState</span><span class=\"mtk1\">,</span><span class=\"mtk12\">[e.target.id]:e</span><span class=\"mtk1\">.</span><span class=\"mtk12\">target</span><span class=\"mtk1\">.</span><span class=\"mtk12\">value</span><span class=\"mtk1\">});</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">handleSubmit</span><span class=\"mtk1\">=(</span><span class=\"mtk12\">e</span><span class=\"mtk1\">)</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">e</span><span class=\"mtk1\">.</span><span class=\"mtk11\">preventDefault</span><span class=\"mtk1\">();</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk12\">signupState</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">createAccount</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk3\">//handle Signup API Integration here</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">createAccount</span><span class=\"mtk1\">=()</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">form</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;mt-8 space-y-6&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">onSubmit</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleSubmit</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk4\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk12\">fields</span><span class=\"mtk1\">.</span><span class=\"mtk11\">map</span><span class=\"mtk1\">(</span><span class=\"mtk12\">field</span><span class=\"mtk4\">=&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Input</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">key</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">handleChange</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleChange</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">value</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">signupState</span><span class=\"mtk1\">[</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk1\">]</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">labelText</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">labelText</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">labelFor</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">labelFor</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">id</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">id</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">name</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">name</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">type</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">isRequired</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">isRequired</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                            </span><span class=\"mtk12\">placeholder</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">field</span><span class=\"mtk1\">.</span><span class=\"mtk12\">placeholder</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                    </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">FormAction</span><span class=\"mtk1\"> </span><span class=\"mtk12\">handleSubmit</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">handleSubmit</span><span class=\"mtk4\">}</span><span class=\"mtk1\"> </span><span class=\"mtk12\">text</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Signup&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         </span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">form</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Then, render this component inside <code>/src/pages/Signup.js</code> alongside the <code>&#x3C;Header/></code> components with some modified props for the signup page. </p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"jsx\" data-index=\"20\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Header</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;../components/Header&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Signup</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;../components/Signup&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">SignupPage</span><span class=\"mtk1\">(){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">return</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Header</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">heading</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Signup to create an account&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">paragraph</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Already have an account? &quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">linkName</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Login&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">              </span><span class=\"mtk12\">linkUrl</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;/&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">            </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Signup</span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    )</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>And that's it! That's all there is to build a great looking signup page that looks as follows:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 62.46153846153847%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA8UlEQVQoz62R2QrCMBBF+///oSi+1q1p2oof4PKqoA+2bo0LaExt2muMKIq2uCUchmEmh2FiEEJgWZaCoNFowqxWYZp3qLxWq4Oouu1S2MSC57ThtFqwKYHrunAcCs/zQCmFgT8fQ0qJLK5HbASirbjleW+eJkzT9BbniyUWyxD+eIrJKEDIGBhbP/Q8TZgn1DJfyaYKf4ZZEGK1/kEYx/Llnr4W7nYcQkRqN4mWX/layKM9YhzP2QP66rYPhPKodjg8YD44YDWONWx0iefaxxOKbYJ+maNb5OhXLnQKe/RKXNfeFmY1vtuTu8M0ySDnU045+aKZ56aFlAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Signup page\"\n        title=\"Signup page\"\n        src=\"/static/fa1a6161f8a44b5d86827ad42aa7232a/e5715/signup-page.png\"\n        srcset=\"/static/fa1a6161f8a44b5d86827ad42aa7232a/a6d36/signup-page.png 650w,\n/static/fa1a6161f8a44b5d86827ad42aa7232a/e5715/signup-page.png 768w,\n/static/fa1a6161f8a44b5d86827ad42aa7232a/d9ed5/signup-page.png 2880w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Don't worry; if you got stuck somewhere, feel free to <a href=\"https://github.com/LoginRadius/engineering-blog-samples/tree/master/React/react-tailwind-app\">refer to the entire codebase for this tutorial here</a>. </p>\n<h2 id=\"use-loginradius-authentication-apis\" style=\"position:relative;\"><a href=\"#use-loginradius-authentication-apis\" aria-label=\"use loginradius authentication apis permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Use LoginRadius Authentication APIs</h2>\n<p>You can use <a href=\"https://www.loginradius.com/resource/whitepaper/loginradius-ciam-developers/\">LoginRadius</a> to quickly set up an authentication backend for your frontend application.</p>\n<p>First, <a href=\"https://accounts.loginradius.com/auth.aspx\">set up an account</a>, and get your API key from your Account Dashboard.</p>\n<p>Then, you can use their <a href=\"https://www.loginradius.com/docs/api/v2/single-sign-on/Machine-to-Machine/overview/\">login endpoint</a> to authenticate users. </p>\n<p>The endpoint takes an email and password as parameters and validates them against the correct credentials. If we were to integrate this endpoint in our previously built <code>&#x3C;Login/></code> component (<code>/scr/components/Login.js</code>), here's what the <code>authenticateUser</code> method would look like:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"21\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk3\">//Handle Login API Integration here</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">authenticateUser</span><span class=\"mtk1\"> = () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">       </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">endpoint</span><span class=\"mtk1\">=</span><span class=\"mtk8\">`https://api.loginradius.com/identity/v2/auth/login?apikey=</span><span class=\"mtk4\">${</span><span class=\"mtk12\">apiKey</span><span class=\"mtk4\">}</span><span class=\"mtk8\">`</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         </span><span class=\"mtk11\">fetch</span><span class=\"mtk1\">(</span><span class=\"mtk12\">endpoint</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             </span><span class=\"mtk12\">method:</span><span class=\"mtk8\">&#39;POST&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             </span><span class=\"mtk12\">headers:</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             </span><span class=\"mtk8\">&#39;Content-Type&#39;</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;application/json&#39;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             </span><span class=\"mtk12\">body:</span><span class=\"mtk10\">JSON</span><span class=\"mtk1\">.</span><span class=\"mtk11\">stringify</span><span class=\"mtk1\">(</span><span class=\"mtk12\">loginFields</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             }).</span><span class=\"mtk11\">then</span><span class=\"mtk1\">(</span><span class=\"mtk12\">response</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk12\">response</span><span class=\"mtk1\">.</span><span class=\"mtk11\">json</span><span class=\"mtk1\">())</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             .</span><span class=\"mtk11\">then</span><span class=\"mtk1\">(</span><span class=\"mtk12\">data</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">                </span><span class=\"mtk3\">//API Success from LoginRadius Login API</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             })</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">             .</span><span class=\"mtk11\">catch</span><span class=\"mtk1\">(</span><span class=\"mtk12\">error</span><span class=\"mtk4\">=&gt;</span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk12\">error</span><span class=\"mtk1\">))</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span></code></pre>\n<p>Similarly, you can use <a href=\"https://www.loginradius.com/resource/whitepaper/loginradius-ciam-developers/\">the Signup endpoint</a> to create users without managing a complete backend database yourself.</p>\n<p>Curious to learn more?</p>\n<p>I did a full-fledged <a href=\"https://www.loginradius.com/blog/engineering/guest-post/authenticating-svelte-apps/\">guide on authenticating Svelte apps with LoginRadius here</a>.</p>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h2>\n<p>In this tutorial, you have learned to create beautiful registration and authentication forms for your web app with Tailwind CSS. You also learned the advantages and disadvantages of Tailwind CSS and understood how Tailwind CSS works better with React.</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n  .dark-default-dark {\n    background-color: #1E1E1E;\n    color: #D4D4D4;\n  }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n  .dark-default-dark .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk12 { color: #9CDCFE; }\n  .dark-default-dark .mtk8 { color: #CE9178; }\n  .dark-default-dark .mtk15 { color: #C586C0; }\n  .dark-default-dark .mtk4 { color: #569CD6; }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk17 { color: #808080; }\n  .dark-default-dark .mtk14 { color: #F44747; }\n  .dark-default-dark .mtk3 { color: #6A9955; }\n</style>","frontmatter":{"date":"May 17, 2022","updated_date":null,"description":"In this article, you'll learn how to instantly build great-looking authentication forms for Login and Signup using Tailwind CSS in React. You'll also understand how to make these forms functional using the third-party Authentication service LoginRadius.","title":"Build a Modern Login/Signup Form with Tailwind CSS and React","tags":["Tailwind CSS","React","Authentication"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/a1c3066797f2394882941ee5e3297547/ee604/modern-login-and-signup-form-banner.png","srcSet":"/static/a1c3066797f2394882941ee5e3297547/69585/modern-login-and-signup-form-banner.png 200w,\n/static/a1c3066797f2394882941ee5e3297547/497c6/modern-login-and-signup-form-banner.png 400w,\n/static/a1c3066797f2394882941ee5e3297547/ee604/modern-login-and-signup-form-banner.png 800w,\n/static/a1c3066797f2394882941ee5e3297547/f3583/modern-login-and-signup-form-banner.png 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Siddhant Varma","github":"FuzzySid","avatar":null}}}},{"node":{"excerpt":"Introduction The modern digital landscape has offered plenty of opportunities to both government and the public sector to jump on the…","fields":{"slug":"/identity/govtech-shaping-future-gov-services/"},"html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p>The modern digital landscape has offered plenty of opportunities to both government and the public sector to jump on the <a href=\"https://www.loginradius.com/blog/identity/what-is-digital-transformation/\">digital transformation</a> bandwagon.</p>\n<p>Whether we talk about municipalities or government banking institutions, every organization can leverage the true potential of technology, data, and centralized identity to deliver unified and seamless digital experiences. </p>\n<p>Various technology organizations and government bodies work together as a part of GovTech to ensure the citizens can reap the maximum benefit through an interconnected network. </p>\n<p>GovTech refers to the efforts to digitally transform public administrations and various government and public sector organizations through innovative technological solutions. </p>\n<p>Let’s understand the aspects of GovTech and how it’s offering endless opportunities for the sake of citizens’ benefits. </p>\n<h2 id=\"what-is-govtech\" style=\"position:relative;\"><a href=\"#what-is-govtech\" aria-label=\"what is govtech permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is GovTech?</h2>\n<p>Every enterprise is putting every effort into getting maximum user engagement, and users already have up to snuff digital experiences from these enterprises; the public sector still lags. </p>\n<p>The private sector has taken a giant leap in digital transformation and user experience. However, the same is missing in the case of public sector and government organizations. </p>\n<p>To overcome the issues about standards that most leading organizations in the private sector have already set, GovTech was introduced to respond to the evident gap between the citizens and the public sector. </p>\n<p>GovTech, the word itself is made from two individual terms-Government and Technology. Considering all the private sector's transformations, GovTech emphasizes incorporating technological innovations to digitize the relationship between various administrations and citizens smartly. </p>\n<p>GovTech, in a nutshell, refers to the technological infrastructure that a government uses to modernize its public sector for better citizen engagement. </p>\n<p>Since we’ve gained enough knowledge about GovTech and its role, let’s understand its advantages for the public sector. </p>\n<h2 id=\"what-are-its-advantages\" style=\"position:relative;\"><a href=\"#what-are-its-advantages\" aria-label=\"what are its advantages permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What are its Advantages?</h2>\n<h3 id=\"1-centralizing-online-services\" style=\"position:relative;\"><a href=\"#1-centralizing-online-services\" aria-label=\"1 centralizing online services permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Centralizing online services.</h3>\n<p>Cities need one unified self-service portal so that their constituents have a seamless, efficient experience as they access the services they need. The GovTech infrastructure lets cities centralize their customer-facing digital applications into one portal.</p>\n<p> <br>\nThis single locus of access delivers a connected experience across multiple touchpoints and channels. This infrastructure supports account summary, customer profiles, permit applications, bill payments, etc. </p>\n<h3 id=\"2-helping-maintain-one-digital-identity-across-all-customer-service\" style=\"position:relative;\"><a href=\"#2-helping-maintain-one-digital-identity-across-all-customer-service\" aria-label=\"2 helping maintain one digital identity across all customer service permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Helping maintain one digital identity across all customer service.</h3>\n<p>What good is a centralized portal if citizens have to create multiple identities for individual web and mobile applications? Operating in this way creates identity silos that prevent a complete view of the customer’s journey and preferences, which means the customer experience can’t be optimized for each individual.</p>\n<p> <br>\nWithout a seamless user experience, engagement rates drop. But with GovTech incorporating <a href=\"https://www.loginradius.com/single-sign-on/\">Single Sign-On</a> (SSO),  cities and companies can allow customers to access all applications within their platform with a single set of unified credentials rather than register and log in to each service separately. </p>\n<p><a href=\"https://www.loginradius.com/resource/how-public-sector-companies-use-the-loginradius-identity-platform/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABjUlEQVQY002Py0tbURCHr1Wb5JoU8dUYcrX1GRNjq6b3hvgIxhsTo0TUhRgJYncVRDfdtOqmm/qXiCCFUvCBIOhG3Lhzo6BgKdVNaLSQ5efJ0YgHfpyZc37zzYxia+mlILW1jzJPv7xl/uwvL2tTCNUXoSo4TmXHILZ2E6snjK2558mjFArLO6LYfYOUNveheiNU60kc72K88g1gFQVSAljmj1I3MI3XnEI1JrD4hwQw9OSRwHxQq4/ijabwmNMyVoWxqGcGh9+UILuY3G2MoBkJXN0xnELuQBxNT1AfSlLeHnkAFsgN/ZP442nej8ziDiap0sfQJpeo7IpjEcAKsWJtYJiarhhacFTK9SGBU0Cd3XFeiwZq6+PKJQ1BNrf2+Ze95fzikqvff/h7fcPd3X/M1Dwv3ugork4+ffnO6dkFP7b3Wf+5y8avPQ6PT9g5OMLhDfOyMYSSpxa/NeRj/mQyGW6zWXK5nMxj6QUULUCpaGqMzTH/dY2ZxRVSC8tSHz9/I720ir0tjEVseg9YWt/xpmosTQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"public-sector-ds\"\n        title=\"public-sector-ds\"\n        src=\"/static/9bf345eb654ad0555d320005047c6c10/e5715/public-sector-ds.png\"\n        srcset=\"/static/9bf345eb654ad0555d320005047c6c10/a6d36/public-sector-ds.png 650w,\n/static/9bf345eb654ad0555d320005047c6c10/e5715/public-sector-ds.png 768w,\n/static/9bf345eb654ad0555d320005047c6c10/63ff0/public-sector-ds.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<h3 id=\"3-integrating-with-third-party-applications\" style=\"position:relative;\"><a href=\"#3-integrating-with-third-party-applications\" aria-label=\"3 integrating with third party applications permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Integrating with third-party applications.</h3>\n<p>Many public sector organizations have difficulty using customer data to improve the digital experience.  With GovTech offering third-party applications such as CRM, email marketing tools, online communities, payment systems and more, citizens can leverage the interconnected experience. They can quickly utilize any such integration for convenience in a single platform.  </p>\n<p> <br>\nMoreover, third-party integrations enable organizations to use that customer data to understand their customers better, offer more helpful information and deliver that information more directly.</p>\n<h3 id=\"4-risk-based-authentication-and-mfa-for-another-stringent-layer-of-security\" style=\"position:relative;\"><a href=\"#4-risk-based-authentication-and-mfa-for-another-stringent-layer-of-security\" aria-label=\"4 risk based authentication and mfa for another stringent layer of security permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Risk-based authentication and MFA for another stringent layer of security.</h3>\n<p>Authentication in the public sector is crucial, which eventually requires a robust mechanism to ensure that user identities remain secured.</p>\n<p>GovTech can leverage multi-factor authentication through SMS, automated phone calls, email, security questions, and authenticator apps, allowing them to customize the citizen experience. Depending on the diverse public sector needs, they can also opt to turn on Multi-Factor Authentication across all customer accounts.</p>\n<p>On the other hand, GovTech can leverage Risk-based authentication as a non-static authentication system that considers the profile (IP address, Browser, physical Location, and so on) of a citizen requesting access to the system to determine the risk profile associated with that action.</p>\n<p>The risk-based implementation allows diverse web applications to challenge the user for additional credentials only when the risk level is appropriate, <a href=\"https://www.loginradius.com/blog/identity/improving-customer-experience-public-sector/\">improving customer experience</a>. </p>\n<h2 id=\"the-bottom-line\" style=\"position:relative;\"><a href=\"#the-bottom-line\" aria-label=\"the bottom line permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The Bottom Line</h2>\n<p>The public sector is an integral part of any state’s overall development since much good work depends on these public sector organizations. </p>\n<p>Until now, most government bodies aren’t utilizing GovTech, but the trend is soon changing. Many public sector organizations and government bodies are already putting their best foot forward in adopting GovTech for digital transformation. </p>\n<p>Whether it’s authentication or delivering a consistent omnichannel experience, GovTech can help the public sector build a flawless citizen experience coupled with enhanced security that ensures the overall digital transformation of the public sector.</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius-banner\"\n        title=\"book-a-demo-loginradius-banner\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"May 13, 2022","updated_date":null,"description":"GovTech refers to the efforts to digitally transform public administrations and various government and public sector organizations through innovative technological solutions. This post will help you understand the aspects of GovTech and how it’s offering endless opportunities for the sake of citizens’ benefits.","title":"GovTech is On The Rise: How Can This Technology Improve Government Services?","tags":["govtech","digital-transformation","consumer-experience"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.6260162601626016,"src":"/static/16685f8fdc70502c2c3320918e4886a5/33aa5/govtech.jpg","srcSet":"/static/16685f8fdc70502c2c3320918e4886a5/f836f/govtech.jpg 200w,\n/static/16685f8fdc70502c2c3320918e4886a5/2244e/govtech.jpg 400w,\n/static/16685f8fdc70502c2c3320918e4886a5/33aa5/govtech.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"Introduction If you're serving your clients online, you must be aware that almost 80% of online shopping orders were abandoned, i.e., not…","fields":{"slug":"/growth/5-signs-ciam-over-traditional-iam/"},"html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p>If you're serving your clients online, you must be aware that almost <a href=\"https://www.statista.com/statistics/457078/category-cart-abandonment-rate-worldwide/\">80% of online shopping orders were abandoned</a>, i.e., not converted as per stats of March 2021. And this pattern isn’t new; it’s the new normal. </p>\n<p>Your customers are already interacting with brands like Amazon, Apple, Microsoft, and Google. They know what a great personalized user experience is. And if you’re not offering the same level of user experience on your online platform, you won’t be able to match their expectations! </p>\n<p>Users will land on your website/app, browse a little, find what they’re looking for, and then a single lousy experience will force them to switch—resulting in <a href=\"https://www.loginradius.com/blog/growth/shopping-cart-abandonment-reasons/\">cart abandonment</a>. </p>\n<p>But why do businesses face such issues? Are there any issues that are causing users to switch?</p>\n<p>Undoubtedly, yes! <a href=\"https://www.loginradius.com/blog/identity/poor-login-concurrency-impact-ott-platforms/\">Poor login</a> and authentication with or without traditional IAM (identity and access management) are the most common issues that force users to switch. </p>\n<p>Businesses are still relying on old-school login and authentication mechanisms, including organization-level IAM, which is why their business lags behind their competitors. </p>\n<p>And the catch is that they aren’t aware of consumer identity and access management (CIAM) platforms that can help them overcome the challenges of low conversions and lead generation. </p>\n<p>Let’s quickly understand the aspects of traditional IAM and why businesses need the true potential of CIAM. </p>\n<h2 id=\"traditional-iam-vs-ciam--whats-the-difference\" style=\"position:relative;\"><a href=\"#traditional-iam-vs-ciam--whats-the-difference\" aria-label=\"traditional iam vs ciam  whats the difference permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Traditional IAM vs. CIAM- What’s the Difference?</h2>\n<p>Traditional <a href=\"https://www.loginradius.com/blog/identity/what-is-iam/\">identity and access management</a> (IAM) solutions are traditionally used to streamline employee provisioning, manage access rights, assist in compliance reporting, automate approval workflows, fuel authentication, authorization, and numerous other security-relevant functions. </p>\n<p>But out of convenience, businesses try to adopt this technology to manage customer identities as well. Unfortunately, internal identity management systems don’t have the right capabilities to manage and secure the hundreds of millions of users on consumer-facing platforms.</p>\n<p>This is where customer IAM (CIAM) solutions come in. These solutions have been built to specifically handle the requirements for customer authentication, scalability, privacy and data regulations, user experience, and integration.</p>\n<p>In comparison to internal management, a customer identity and access management (CIAM) solution improves the customer experience, reduces security risks, shrinks costs, and increases the availability of applications.</p>\n<p>Since we’ve learned about the significant differences between a CIAM and conventional IAM, let’s closely look at some signs that depict that your business now needs a CIAM makeover. </p>\n<h2 id=\"why-should-you-make-the-switch-to-a-ciam-solution\" style=\"position:relative;\"><a href=\"#why-should-you-make-the-switch-to-a-ciam-solution\" aria-label=\"why should you make the switch to a ciam solution permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why Should You Make the Switch to a CIAM Solution?</h2>\n<h3 id=\"1-you-have-good-traffic-but-no-leads-or-conversions\" style=\"position:relative;\"><a href=\"#1-you-have-good-traffic-but-no-leads-or-conversions\" aria-label=\"1 you have good traffic but no leads or conversions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>#1. You have good traffic but no leads or conversions.</h3>\n<p>One of the most significant indicators of bad authentication and user management is that your website or mobile application has good traffic but isn’t converting. </p>\n<p>Most of the time, users face friction in authentication, remembering passwords, or going through multiple registration stages. This annoying experience forces them to switch to your competitors, offering seamless authentication, registration, and login experience. </p>\n<p>So, what’s the ideal solution for this dilemma? </p>\n<p>Well, a cutting-edge cloud-based CIAM solution like LoginRadius can help you increase your conversions and generate more leads. </p>\n<p>With features like Social Login, Single Sign-On (SSO), and Progressive Profiling, you can stay assured your users aren’t facing any hurdles from the moment they interact with your brand. </p>\n<p><a href=\"https://www.loginradius.com/resource/guide-to-modern-customer-identity/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABoElEQVQY0zWPyUtbURjFH9aa4QmWakBrGmmrGXyJxEaeUWNsBqOpAzhAMArWlm4cKkhdiGlF3KjgQgQFqYVStSmCqCClcWF1IXXVVTcu/Fd+3ncli8O9373nO4NidYV4+KKZhbk5rk6zHH3bYnd7gz+5E3Z3vuIMdlEo/q2uVszV4tRilAX7KK2LYfHGMbvbMNe0CISwOEMoqiAWPAuSGnrPxc8dzvY3Od1b5+D7F7JrC3ib2nkgBcWCWFSFiCMyhBZPYdX7MfkSWJ0tUswQVvIXrXmAd4PDLM/OsL40z+ToGIsfZ6iL9klDI2FFQxK7/pongQ7KA53YGwT0JJV6FyXaK0x5QZOo4gokSfa+oX9gjHhnGndtmPqXMcp9EUk0eAZs9Qnsjd08DXbjaOqRJqo7LEPJypIo3Kt8UWr97Xj8CZ5rEWwOndLKAI89baieMEqFn4nMKv9vbjn8dc6P499kT3JcXv8jd/mXR94oRSKYkneW1cWDpeYeqpiLhbNR1UBBlU6jaDA+v8Lw9CfSUxnSHzK8nV1iZPozxcLUaHIH2VzYTeppS8MAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"EB-GD-to-cons-id\"\n        title=\"EB-GD-to-cons-id\"\n        src=\"/static/e8ca49370e6ab28514cbd05ef77951af/e5715/EB-GD-to-cons-id.png\"\n        srcset=\"/static/e8ca49370e6ab28514cbd05ef77951af/a6d36/EB-GD-to-cons-id.png 650w,\n/static/e8ca49370e6ab28514cbd05ef77951af/e5715/EB-GD-to-cons-id.png 768w,\n/static/e8ca49370e6ab28514cbd05ef77951af/81501/EB-GD-to-cons-id.png 2886w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<h3 id=\"2-you-need-more-user-data-for-improving-sales--marketing-strategy-but-youre-clueless-about-where-to-get-it\" style=\"position:relative;\"><a href=\"#2-you-need-more-user-data-for-improving-sales--marketing-strategy-but-youre-clueless-about-where-to-get-it\" aria-label=\"2 you need more user data for improving sales  marketing strategy but youre clueless about where to get it permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>#2. You need more user data for improving sales &#x26; marketing strategy, but you’re clueless about where to get it.</h3>\n<p>Businesses collect consumer data, but it is often segregated among repositories and departments. The CIAM platform provides you with a wealth of information on your consumers’ identities and habits. </p>\n<p>Unlike traditional IAM, CIAM allows building a detailed profile of each consumer, including personal information, purchase histories, and usage and purchasing patterns.</p>\n<p>This data may be combined into a single consumer view, which may be pushed into other enterprise programs to improve sales forecasting, tailored marketing, and new product development.</p>\n<p>APIs are widely used in the latest generation of CIAM platforms to link identity data and analytics into complementary systems like content management, ERP, and consumer experience management.</p>\n<h3 id=\"3-youre-worried-about-sensitive-consumer-and-business-data\" style=\"position:relative;\"><a href=\"#3-youre-worried-about-sensitive-consumer-and-business-data\" aria-label=\"3 youre worried about sensitive consumer and business data permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>#3. You’re worried about sensitive consumer and business data.</h3>\n<p>Concerning the traditional IAM, authentication has been a simple decision based on the credentials supplied up until now. This was accomplished by using a username and password that were both relatively weak. </p>\n<p>Though the invention of two-factor authentication (2FA) employing a second step such as an SMS message has helped, it is still vulnerable to hacking.</p>\n<p>The CIAM, on the other hand, offers <a href=\"https://www.loginradius.com/multi-factor-authentication/\">multi-factor authentication</a> (MFA), which can include biometrics, geolocation, and user behavior, providing increased security. These features also enable the use of analytics to give additional capabilities like anomaly detection, which may be used to identify and address unexpected behavior swiftly. </p>\n<p>The LoginRadius CIAM platform provides security beyond the client, including employees, partners, applications, and interconnected devices, to develop a comprehensive end-to-end solution.</p>\n<h3 id=\"4-you-dont-know-how-to-meet-global-data-regulatory-and-privacy-compliances\" style=\"position:relative;\"><a href=\"#4-you-dont-know-how-to-meet-global-data-regulatory-and-privacy-compliances\" aria-label=\"4 you dont know how to meet global data regulatory and privacy compliances permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>#4. You don’t know how to meet global data regulatory and privacy compliances.</h3>\n<p>Data privacy is a critical component of any CIAM solution, especially when consumers are responsible for their data and profile management. </p>\n<p>Unlike the traditional IAM, the CIAM platform offers your consumers visibility and control over how and where their data is shared. So it includes both consent and preference management, which allows your consumers to choose how their data is collected and used. </p>\n<p><a href=\"https://www.loginradius.com/consent-management/\">Consent management</a>, for example, must allow your client to establish multi-level consent – where data can be used for one reason but not for another – that can be turned on and off at any moment, according to EU’s GDPR requirements. </p>\n<p>The CIAM platform necessitates significant self-service features so that your consumers may manage their consents and preferences through their profile, as well as robust tracking and auditing so that you can meet other global compliances, including California's CCPA. </p>\n<h3 id=\"5-youre-not-making-new-customers\" style=\"position:relative;\"><a href=\"#5-youre-not-making-new-customers\" aria-label=\"5 youre not making new customers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>#5. You’re not making new customers.</h3>\n<p>You can’t ignore the fact that new customer acquisition is as essential as retaining current customers. If you’re not making new customers, it’s high time you must incorporate a CIAM solution instead of the traditional IAM. </p>\n<p>Endless reasons, including a lengthy registration process, could lead to situations where you cannot convert new users and drop the overall growth rates. </p>\n<p>By incorporating a CIAM solution like <a href=\"https://www.loginradius.com/\">LoginRadius</a>, you can leverage the true potential of progressive profiling that enables your customers to share their details gradually and not immediately when they interact for the first time with your platform. </p>\n<p>Apart from this, creating personalized customer journeys by leveraging social media data and consumer behavior can also help increase engagement with your brand leading to more new conversions. </p>\n<h2 id=\"looking-forward\" style=\"position:relative;\"><a href=\"#looking-forward\" aria-label=\"looking forward permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Looking Forward</h2>\n<p>Modern customers know exactly what they want, and to ensure they don’t switch, organizations have to stay ahead of the competition by pleasing their users right from the beginning they interact with their brand. </p>\n<p>Also, the traditional IAM cannot meet the surging demands of today’s customers. Hence, it’s crucial to incorporate a reliable CIAM solution like LoginRadius that helps deliver a rich consumer experience and robust security and helps meet global compliance requirements. </p>\n<p>If you’re facing any of the challenges mentioned above, it’s high time to switch to a reliable CIAM solution. </p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius\"\n        title=\"book-a-demo-loginradius\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"May 10, 2022","updated_date":null,"description":"Businesses are still relying on old-school login and authentication mechanisms, including organization-level IAM, which is why their business lags behind their competitors. Let’s discuss why businesses need to replace their traditional IAM with new-age CIAM.","title":"5 Signs Your Traditional IAM System Needs a CIAM Makeover","tags":["ciam solution","login authentication","cx"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.4492753623188406,"src":"/static/d11938262e16b41241e77bdb52173f90/33aa5/traditional-iam.jpg","srcSet":"/static/d11938262e16b41241e77bdb52173f90/f836f/traditional-iam.jpg 200w,\n/static/d11938262e16b41241e77bdb52173f90/2244e/traditional-iam.jpg 400w,\n/static/d11938262e16b41241e77bdb52173f90/33aa5/traditional-iam.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"Introduction When you set up privacy policies for customers, you’re making a promise. You’re ensuring to people who trust you with their…","fields":{"slug":"/identity/5-access-management-best-practices-enterprises/"},"html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p>When you set up privacy policies for customers, you’re making a promise. You’re ensuring to people who trust you with their sensitive information that you’ll do everything in your power to protect it. </p>\n<p>But business data has never been in greater danger than it is today. Cybercriminals have become more advanced, digitally pillaging companies, endangering customers, and stealing billions in revenue. In 2021, businesses suffered <a rel=\"nofollow\" href=\"https://www.darkreading.com/attacks-breaches/corporate-networks-saw-50-more-attacks-per-week-in-2021-?utm_campaign=meetedgar&utm_medium=social&utm_source=meetedgar.com\"> 50% more cyber attacks per week </a> than in 2020. This was the same year that cybercriminals managed to steal $6.9 billion.</p>\n<p>But there is an effective way you can fight back against cybercriminals. Access management allows you to police your access points by increasing security around how users and employees alike access systems. </p>\n<p>So what are some of the ways in which you can create an airtight access management plan? What can you do to ensure that cybercriminals can’t worm their way into your system? </p>\n<p>That’s what we’re going to address in this article. We’ll walk you through five access management best practices to help you keep your systems reserved for valid users only.</p>\n<h2 id=\"when-do-you-need-access-management\" style=\"position:relative;\"><a href=\"#when-do-you-need-access-management\" aria-label=\"when do you need access management permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>When Do You Need Access Management?</h2>\n<p>Before we jump into our best practices, let’s talk about why some businesses and industries need to tighten digital security. </p>\n<h3 id=\"1-customer-access\" style=\"position:relative;\"><a href=\"#1-customer-access\" aria-label=\"1 customer access permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Customer access</h3>\n<p>Access management measures are essential for high-risk industries. They can help you protect your customers by limiting how they can access their accounts. </p>\n<p>Let’s say you’ve developed a personal finance software solution, and a customer calls in asking how to link their bank account to your budgeting app. </p>\n<p>You’re going to need to authenticate that user’s identity before giving them access to the account. Anyone can call in claiming to be anyone. But if you have access management measures in place, they won’t be able to break in. This could be something like <a href=\"https://www.loginradius.com/multi-factor-authentication/\">multi-factor authentication</a> or asking them to provide additional information before assisting them.</p>\n<h3 id=\"2-protect-company-secrets\" style=\"position:relative;\"><a href=\"#2-protect-company-secrets\" aria-label=\"2 protect company secrets permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Protect company secrets</h3>\n<p>If you use a CRM platform for <a href=\"https://www.loginradius.com/blog/growth/improve-customer-relation-brand-identity/\">managing customer relationships</a>, you’re going to be keeping a lot of confidential information online that’s vital to your organization. That’s why you have to make sure that the only people accessing your CRM are current team members. If you let a sales associate go and don’t have an access management protocol in place that immediately revokes their account, they could log in remotely and make off with a ton of company data. </p>\n<p>Central platforms like <a href=\"https://www.loginradius.com/\">LoginRadius</a> let companies access all of their tools from one platform — with just one login. But if you don’t have access management protocols in place for a centralizing system like this, a cybercriminal could gain access to every tool your organization uses with just one attack. </p>\n<h3 id=\"3-provide-a-secure-user-friendly-login-experience\" style=\"position:relative;\"><a href=\"#3-provide-a-secure-user-friendly-login-experience\" aria-label=\"3 provide a secure user friendly login experience permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Provide a secure, user-friendly login experience</h3>\n<p>Access management needs to be both effective and easy to manage for the people who need access to your systems. </p>\n<p>Take the grant systems that many institutions use as an example. They often have pristine access management protocols in place. If accessing this system were too easy in an unprotected environment, malicious actors could gain access to their systems and make off with precious information. But if that system wasn’t also user-friendly for authorized users, something as simple as asking “<a href=\"https://www.mos.com/blog/do-you-have-to-pay-back-grants/\">how do student grants work</a>” could be a nightmare time sucker.  </p>\n<h2 id=\"best-practices-for-access-management\" style=\"position:relative;\"><a href=\"#best-practices-for-access-management\" aria-label=\"best practices for access management permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Best Practices for Access Management</h2>\n<p>The following best practices will help you improve your access management, enabling maximum protection against cybercrime and creating a more secure business environment. </p>\n<h3 id=\"1-implement-a-zero-trust-policy\" style=\"position:relative;\"><a href=\"#1-implement-a-zero-trust-policy\" aria-label=\"1 implement a zero trust policy permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Implement a zero-trust policy</h3>\n<p>One of the best ways to protect your company’s digital assets is to implement a zero-trust policy. </p>\n<p><a href=\"https://www.loginradius.com/blog/identity/beginners-guide-zero-trust-security/\">Zero trust</a> is exactly what it sounds like. Every member of your organization is forced to authenticate their identities before being able to access any resources. This includes employees who are already active inside a company network. </p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 512px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 82.2265625%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVQoz11SSW/TUBB2FXaBaJvEW1IlcWI7juMktuP92U5iZ3OjVEkTCIWytPRSJDgirkggIXFCgDghcaxUxBEkxAlx4cRPYpJWtEX69PSW+Wa+b+ZhZNGmWSPFGSRnFaqN9mBL84Zed+oEm1Yw9jqwGRv+RhDNULiZ5q0Ua6YgfgGMKCFCalAld7WIUiVXcwdCPaxZkWL0TLOP0EA2e6LW0f2hbPUJziIERJZcsuxTnIlBZUJ0yYIuGV3FWYdVMnplvVvVOxW5Va42OcljJS8vuoyIRDWAlWLqlIAo3sYo3iIhGaOV1ACEtaKZG07CzsRtjVE48TtT2VmvWX0oK6qhpLUzgk0zGiU4QFyQS4jOa1Reywo2OEnntRWlHRe9JFOP5/VUXqdz9bWinRMRAMLmwUdkkA0aaAaeLejK9u6TqH/jwrPX8d7tTIJLrFX3eHRb9KLZXnewpdgRZD8hg3TYpRaViZya5qCZJm5Gq6MHl199uPzyHYuGJUYjeZtk6smsQhf002QLdnCGW8hKzd90stqMHXzFfv4BxD4e4gtfqUXA/2Sy6KRZYw2yQArOJNPVlc2HsU9fLr54C4h9/o43xzRv02BwIRCyHJPhiuCtQtkN+rM7O49Nf/iYkgtaBzv4uvTtF/bj97mPh7TeJ7xJDQ227j2a3d2vGd0kZ0KnjmVTuTpYLalhRnBczmKyarw9jb18f/75G8KK5nLkMMOZRSWAia5xJi76iUrrxDO4xbMqDDy+sIRTotm7JXsbeEqieQvGAYKTOTXJaDjvrCrtZbVzpmFHmDemYJB5/f6jp6PtfTynzvsEvWQNomgnRH+l0rxmRFeswdGo0Bkya+BZxWhsjG7ujm7sCEoLRgg/GRdQouwvy8E1tXPFHp5zRxgFf11qzP/6WdCim5EDACl6RKWRkMMVrXcdCjrDC94o1pwsNSfYv4KnAf6zrFnOG1JOSxfRaqW5LIdXtd4lcz3mDDF/jLWmWPvWX+G8v3H6FbWiAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"zero-trust\"\n        title=\"zero-trust\"\n        src=\"/static/40e2fdcfd96b84e074d3f3f0f6b0a35a/01e7c/zero-trust.png\"\n        srcset=\"/static/40e2fdcfd96b84e074d3f3f0f6b0a35a/01e7c/zero-trust.png 512w\"\n        sizes=\"(max-width: 512px) 100vw, 512px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>(<a href=\"https://www.infusedinnovations.com/blog/secure-intelligent-workplace/pros-and-cons-of-the-zero-trust-model\">Image Source</a>)</p>\n<p>This methodology means that every person and every device is treated as though it’s a potential threat. When working under zero trust, the system will be able to identify any abnormal behaviors while tracking both activities and risk levels. </p>\n<h3 id=\"2-adopt-the-principle-of-least-privilege\" style=\"position:relative;\"><a href=\"#2-adopt-the-principle-of-least-privilege\" aria-label=\"2 adopt the principle of least privilege permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Adopt the principle of least privilege</h3>\n<p>When assigning privileges to accounts, it’s best to err on the side of caution. That’s where the Principle of Least Privilege comes into play. Also sometimes known as the Principle of Least Authority, it’s when you provide the minimum level of access to all users. This includes permissions granted to consumers. </p>\n<p>You’re basically giving everyone the bare minimum level of access they need to accomplish what they need to while using your system. Obviously, some roles within your organization will need more access than others — an accountant requires different access than a sales agent, so they would have completely different access levels. </p>\n<p>When you restrict users from any non-essential access, you effectively cut off opportunities for cybercriminals to access your entire system. </p>\n<h3 id=\"3-utilize-multi-factor-authentication\" style=\"position:relative;\"><a href=\"#3-utilize-multi-factor-authentication\" aria-label=\"3 utilize multi factor authentication permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Utilize multi-factor authentication</h3>\n<p>A lot of people believe that a strong password is all they really need to have a secure online experience. However, password misuse often leads to cybercrime breaches and data attacks. It all boils down to the actual security behind the password — the person and their habits. If a staff member opens malware and gets a keylogger, it doesn’t matter if you mandate 12 characters, symbols, and numbers. Your business information is still ripe for the picking. </p>\n<p>That’s why multi-factor authentication has become an essential access management practice. It adds an additional security layer to the login process. </p>\n<p>When you use MFA, anyone logging in will be asked to provide an additional method of verification once they enter their password. This could be entering a code sent to their email or via text message. It could also be a biometric scan on a mobile device like a fingerprint or facial recognition. </p>\n<p><a href=\"https://www.loginradius.com/resource/ebook/buyers-guide-to-multi-factor-authentication/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABkklEQVQY0zWQyy9jYRjGTwQ9vYlQpTrViJ7T0lZIpeq0TqN1mWSmBAuKxCVCIqQrEqEiqUjM7GYjwcaKjQUWkxmJhZmNlZ2NZP6V33znHBZPvuR7n/e5vJJdzeBS01SVT4me/eViYpfVVp363ApSewG3msMu5gZPDmk4onk8qUkau/PYY8PIkSyykkY25gKSQXQoGt6dH/gq9ywnF0koWRKfUsj+EdzhvCBqlqDgOeMjBIZmiQ7P4EhOYYuPiv13Q/FKspLBKRLUrVWQisdIsRmkYJ6GwCS1vgKukG65C7IzohPo/4K/7zNNvaP4E2MEU19pEGnld1FT0Kji3fpO1/4lkaUT/EMlGmNFatwaro5B7OGMSa7t0MzltoECASFkoEWIm5U/BK3KabxrRyjb56jFQ5rT63jC0zg9WepEfVenjuTrYbP8jde3f9z8fOTq9hfXd795en7h4c8z9fGcaWgJGpXEcatVnepQBptIbQsZ/4M4whaqgkn6x5fY2DthvlRmbmvfxMp2hYXSgWlqE8H+AywzymSbMN5UAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"EB-GD-to-MFA\"\n        title=\"EB-GD-to-MFA\"\n        src=\"/static/5093fa5ddf26d3a3ec38a96c3e0387e6/e5715/EB-GD-to-MFA.png\"\n        srcset=\"/static/5093fa5ddf26d3a3ec38a96c3e0387e6/a6d36/EB-GD-to-MFA.png 650w,\n/static/5093fa5ddf26d3a3ec38a96c3e0387e6/e5715/EB-GD-to-MFA.png 768w,\n/static/5093fa5ddf26d3a3ec38a96c3e0387e6/81501/EB-GD-to-MFA.png 2886w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<h3 id=\"4-get-rid-of-high-risk-systems\" style=\"position:relative;\"><a href=\"#4-get-rid-of-high-risk-systems\" aria-label=\"4 get rid of high risk systems permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Get rid of high-risk systems</h3>\n<p>If your business hasn’t yet upgraded its systems to the cloud, then you have a glaring access management vulnerability. </p>\n<p>Many believed for a long time that in-house servers were safer than cloud-based systems, but cloud platforms encrypt all data while providing enhanced security features like patch management, integrations, and segmentation, to name a few. Plus, your on-site servers are vulnerable to physical access from unauthorized users who could break into your facility.  </p>\n<p>Anyone looking to protect on-site servers from hackers will have to make a great investment in both time and money. </p>\n<h3 id=\"5-remove-orphaned-accounts\" style=\"position:relative;\"><a href=\"#5-remove-orphaned-accounts\" aria-label=\"5 remove orphaned accounts permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. Remove orphaned accounts</h3>\n<p>Personnel changes represent a huge vulnerability from an access management standpoint. Offboarding needs to be done right away when a member of your team quits or is let go. </p>\n<p>Failure to revoke access to your systems in a timely manner could leave you open to attack. Say your sales director is moving to a new position with a rival company. If they still have access to customer data, they could take it with them, delete it entirely off your platform, or try to steal your leads. </p>\n<p>You also never want to leave orphaned accounts in play. These are accounts that have no assigned user but still contain all of the information and permissions associated with your former team member. </p>\n<p>Hackers love orphaned accounts because they’re relatively easy to gain access to. A hacker could then easily crack the credentials of your former employee and weasel their way into that account. </p>\n<p>Once inside, they have access to everything that specific team member could once see and do. If they had access to customer information, then you officially have a data breach on your hands. </p>\n<p>That’s why it’s a good idea to automate the onboarding and offboarding processes. This will save your IT department time and ensure that new team members and vendors get the right permissions right away and have them taken away the moment they’re no longer with you. </p>\n<h2 id=\"wrap-up\" style=\"position:relative;\"><a href=\"#wrap-up\" aria-label=\"wrap up permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Wrap Up</h2>\n<p>You need to implement access management protocols within your organization. It’s the only way to protect yourself from the ongoing threat represented by cybercriminals. </p>\n<p>These cyber-threats are not going away anytime soon, and they’re not going to become any easier to fight off. Malicious actors are constantly looking for new ways to break into your systems and take off with your sensitive and valuable data. They’re also always on the cutting edge of technology, creating new and inventive ways to get past your security and gain access. </p>\n<p>This list isn’t a “pick one, and you’re done” guide. You can create an airtight access management plan by implementing all five of these tips. That means adopting a zero-trust policy, using the Principle of Least Privilege, having everyone use MFA, getting rid of high-risk systems, and removing orphaned accounts to <a href=\"https://www.loginradius.com/blog/identity/corporate-account-takeover-attacks/\">prevent hackers from gaining access</a>. </p>\n<p>Use these best practices to manage access to your systems and ensure that all data within your organization is safe from malicious cybercriminals.</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY002RO0/CUBzFG6PtbZWHCAmRmBB5P8vDII9SSC0omog4oAEGjZMO6OKEuLjoJ2Fx0cSBwUQnXZxcHPwux38LJA7nNvfec8+5v1tOCCiwpbbhye2BxbYgBMtgIRVioDRRsARGXxZUzLlEHmehBaesQ4rrEMPViYf2DR9nDGKkChbVICVqsMt1WJI1sHCFwhUsUIFohJH49TxECvRUjhDW2mAbB5iP6hB8hUkhiRPN5KIZYJdrsEYrcCSpmQqMm6/m9ylUhSulY7N5ivROB3L9GOlGF3Ktbc4zuz341UPw/uIk0ESbBjoSGlYIx8BfzjSwVmyCEYEUUmCPa3Bnd+hwC75yC95S05SxbolU/iEbOCFCpDexEfIioTNCNd6Tp6IlMnNuGeeDe3z//OLx5RWj5zFGT2O8fXxh/P4Ja6w6vSEFCnTIlW2YiDzhzX7ATFKojDlvjpBPcDF4QPdyiG5/iE7/BmfXd+hd3VKpCoG8fzxWw2+c+yTpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius-banner\"\n        title=\"book-a-demo-loginradius-banner\"\n        src=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png\"\n        srcset=\"/static/fcc4c4b5dc38cc4528f99d09480f4eb2/a6d36/book-a-demo-loginradius.png 650w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/e5715/book-a-demo-loginradius.png 768w,\n/static/fcc4c4b5dc38cc4528f99d09480f4eb2/63ff0/book-a-demo-loginradius.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"May 10, 2022","updated_date":null,"description":"Access management is essential for modern businesses. This blog will walk you through the five access management best practices to help you keep your systems reserved for valid users only.","title":" 5 Access Management Best Practices and Benefits For Businesses","tags":["zero trust","mfa","enterprise security","access control"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":2.150537634408602,"src":"/static/6e964ca6f64c9f8e04d43c18e2237b7c/33aa5/access-mangmt.jpg","srcSet":"/static/6e964ca6f64c9f8e04d43c18e2237b7c/f836f/access-mangmt.jpg 200w,\n/static/6e964ca6f64c9f8e04d43c18e2237b7c/2244e/access-mangmt.jpg 400w,\n/static/6e964ca6f64c9f8e04d43c18e2237b7c/33aa5/access-mangmt.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Vikas Kalwani","github":null,"avatar":null}}}}]},"markdownRemark":{"excerpt":"Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards…","fields":{"slug":"/identity/developer-first-identity-provider-loginradius/"},"html":"<p>Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards and refining approaches to building secure, seamless experiences.</p>\n<p>We’re here to support developers on that journey. We know how important simplicity, efficiency, and well-structured documentation are when working with identity and access management solutions. That’s why we’ve redesigned the <a href=\"https://www.loginradius.com/\">LoginRadius website</a>—to be faster, more intuitive, and developer-first in every way.</p>\n<p>The goal? Having them spend less time searching and more time building.</p>\n<h2 id=\"whats-new-and-improved-on-the-loginradius-website\" style=\"position:relative;\"><a href=\"#whats-new-and-improved-on-the-loginradius-website\" aria-label=\"whats new and improved on the loginradius website permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What’s New and Improved on the LoginRadius Website?</h2>\n<p>LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve spent the last few months redesigning our interface— making navigation more intuitive and reassuring that essential resources are easily accessible.</p>\n<p>Here’s a closer look at what’s new and why it’s important:</p>\n<h3 id=\"a-developer-friendly-dark-theme\" style=\"position:relative;\"><a href=\"#a-developer-friendly-dark-theme\" aria-label=\"a developer friendly dark theme permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A Developer-Friendly Dark Theme</h3>\n<p><img src=\"/f46881583c7518a93bb24e94c32320de/a-developer-friendly-dark-theme.webp\" alt=\"This image shows how LoginRadius offers several authentication methods like traditional login, social login, passwordless login, passkeys and more in a dark mode.\">    </p>\n<p>Developers spend long hours working in dark-themed IDEs and terminals, so we’ve designed the LoginRadius experience to be developer-friendly and align with that preference.</p>\n<p>The new dark mode reduces eye strain, enhances readability, and provides a seamless transition between a coding environment and our platform. Our new design features a clean, modern aesthetic with a consistent color scheme and Barlow typography, ensuring better readability. High-quality graphics and icons are thoughtfully placed to enhance the content without adding visual clutter.</p>\n<p>So, whether you’re navigating our API docs or configuring authentication into your system, our improved interface will make those extended development hours more comfortable and efficient.</p>\n<h3 id=\"clear-categorization-for-loginradius-capabilities\" style=\"position:relative;\"><a href=\"#clear-categorization-for-loginradius-capabilities\" aria-label=\"clear categorization for loginradius capabilities permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Clear Categorization for LoginRadius Capabilities</h3>\n<p><img src=\"/e5358b82be414940f3fb146013845933/capabilities.webp\" alt=\"This image shows a breakdown of all the LoginRadius CIAM capabilities, including authentication, security, UX, scalability and multi-brand management.\"></p>\n<p>We’ve restructured our website to provide a straightforward breakdown of our customer identity and access management platform capabilities, helping you quickly find what you need:</p>\n<ul>\n<li>Authentication: Easily understand <a href=\"https://www.loginradius.com/blog/identity/authentication-option-for-your-product/\">how to choose the right login method</a>, from traditional passwords and OTPs to social login, federated SSO, and passkeys with few lines of code.</li>\n<li>Security: Implement no-code security features like bot detection, IP throttling, breached password alerts, DDoS protection, and adaptive MFA to safeguard user accounts.</li>\n<li>User Experience: Leverage AI builder, hosted pages, and drag-and-drop workflows to create smooth, branded sign-up and login experiences.</li>\n<li>High Performance &#x26; Scalability: Confidently scale with sub-100ms API response times, 100% uptime, 240K+ RPS, and 28+ global data center regions.</li>\n<li>Multi-Brand Management: Efficiently manage multiple identity apps, choosing isolated or shared data stores based on your brand’s unique needs.</li>\n</ul>\n<p>This structured layout ensures you can quickly understand each capability and how it integrates into your identity ecosystem.</p>\n<h3 id=\"developer-first-navigation\" style=\"position:relative;\"><a href=\"#developer-first-navigation\" aria-label=\"developer first navigation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Developer-First Navigation</h3>\n<p><img src=\"/a8c155c2b6faf3d5f4b4de4e2b14d763/developers-menu.webp\" alt=\"This image shows the LoginRadius menu bar, highlighting the developer dropdown.\">   </p>\n<p>We’ve been analyzing developer workflows to identify how you access key resources. That’s why we redesigned our navigation with one goal in mind: to reduce clicks and make essential resources readily available.</p>\n<p>The new LoginRadius structure puts APIs, SDKs, and integration guides right at the menu bar under the Developers dropdown so you can get started faster. Our Products, Solutions, and Customer Services are also clearly categorized, helping development teams quickly find the right tools and make informed decisions.</p>\n<h3 id=\"quick-understanding-of-integration-benefits\" style=\"position:relative;\"><a href=\"#quick-understanding-of-integration-benefits\" aria-label=\"quick understanding of integration benefits permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Quick Understanding of Integration Benefits</h3>\n<p><img src=\"/b2f9a964a2da0ea83e2f8596b833bba7/we-support-your-tech-stack.webp\" alt=\"This image shows a list of popular programming languages and frameworks offered by LoginRadius.\"></p>\n<p>Developers now have a clear view of the tech stack available with LoginRadius, designed to support diverse business needs.</p>\n<p>Our platform offers pre-built SDKs for Node.js, Python, Java, and more, making CIAM integration seamless across popular programming languages and frameworks.</p>\n<h2 id=\"over-to-you-now\" style=\"position:relative;\"><a href=\"#over-to-you-now\" aria-label=\"over to you now permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Over to You Now!</h2>\n<p>Check out our <a href=\"https://www.loginradius.com/\">revamped LoginRadius website</a> and see how the improved experience makes it easier to build, scale, and secure your applications.</p>\n<p>Do not forget to explore the improved navigation and API documentation, and get started with our free trial today. We’re excited to see what you’ll build with LoginRadius!</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"February 21, 2025","updated_date":null,"description":"LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve redesigned our website interface, making navigation more intuitive and reassuring that essential resources are easily accessible.","title":"Revamped & Ready: Introducing the New Developer-First LoginRadius Website","tags":["Developer tools","API","Identity Management","User Authentication"],"pinned":true,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7857142857142858,"src":"/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp","srcSet":"/static/80b4e4fbe176a10a327d273504607f32/61e93/hero-section.webp 200w,\n/static/80b4e4fbe176a10a327d273504607f32/1f5c5/hero-section.webp 400w,\n/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp 800w,\n/static/80b4e4fbe176a10a327d273504607f32/99238/hero-section.webp 1200w,\n/static/80b4e4fbe176a10a327d273504607f32/7c22d/hero-section.webp 1600w,\n/static/80b4e4fbe176a10a327d273504607f32/1258b/hero-section.webp 2732w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},"pageContext":{"limit":6,"skip":258,"currentPage":44,"type":"///","numPages":161,"pinned":"ee8a4479-3471-53b1-bf62-d0d8dc3faaeb"}},"staticQueryHashes":["1171199041","1384082988","2100481360","23180105","528864852"]}