{"componentChunkName":"component---src-templates-blog-list-template-js","path":"/55","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Introduction A token plays a crucial role in enhancing the overall security mechanism of an organization that helps to deliver flawless and…","fields":{"slug":"/identity/token-management-api-product-jwt/"},"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>A token plays a crucial role in enhancing the overall security mechanism of an organization that helps to deliver flawless and secure authentication and authorization on their website or application. </p>\n<p>However, there’s much confusion regarding relying on access tokens. Businesses find it challenging to choose between <a href=\"https://www.loginradius.com/blog/identity/what-is-openid-connect/\">OpenID Connect</a> and OAuth 2.0. </p>\n<p>As a result, many organizations deploy insecure web applications that compromise their consumers’ identities and crucial business information. </p>\n<p>It’s always better to learn about the aspects of tokens and leverage the best token management mechanism that offers robust security. </p>\n<p>This post will help you better understand what a token is, what is a JWT, and its pros that will help you decide why you need to invoke the potential of JWT for your API product. </p>\n<h2 id=\"what-is-a-token\" style=\"position:relative;\"><a href=\"#what-is-a-token\" aria-label=\"what is a token 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 a Token?</h2>\n<p>A token is a digitally encoded signature used to authenticate and authorize a user to access specific resources on a network.</p>\n<p>A token is always generated in the form of an OTP (One-Time Password), which depicts that it could only be used once and is generated randomly for every transaction.</p>\n<p>The token-based authentication allows users to verify their unique identity, and in return, they receive a unique token that provides access to specific resources for a particular time frame.</p>\n<p>Users can easily access the website or network for which the token is issued and need not enter the credentials again and again until the permit expires.</p>\n<p>Tokens are widely used for regular online transactions for enhancing overall security and accuracy.</p>\n<p><a href=\"https://www.loginradius.com/resource/passwordless-login-magic-link-otp-datasheet\"><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,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABvElEQVQY00WQz0uTcRzHH3u2Z1tNnc/ceMYen63tebalc4oun2zVoUSCDh5EaqeiiBj2i6BT0CEo6NAhyH4e6hDmwXSVGUpO02DUpVtB9BdEyHKU0sFXXx+CPvA6vC8v3u+P5LMK+Mx+/OkCTZl9NKb6abT2CGz85m68sS4UvVPQgVtLo4gcyB6gOd6Juy2LrFnIwRiuoIGs6kjbUwWURB/nr4/xeGaFB1MLPCovOozPLtMzOIIUsvDoWZRIBl+ih2jfIGn7EJ5d+3EZOdytxn+hz9qLJ2lz4cZ9xiYXuD0xx73pJSbefqD66TP2kSJS0ESJtuOP5win87Sa3ajJLrRUNyEzRyDejkttQ26JInnFXI9oOHrtDreeznLzyQvuTlZ4+LJCeblK/vAxp6FXTHZpKeSwhSqEeoeNlsnjDu9kW4vutHOEW/+TY72U55bY3ITvP1ZZra3xc+0Xvzf+cHD4hCOUmgxKl6/y5es3pl7PM/78Fc+mZ1ipfmS+8o4dkSRSs/ZPaPTyZvE9W1er1ajX62ysrzt5YEQI1QQNIZP8wBBnLl2hePocR0+dFYxyvHSR4skSSihGQyDCX1CA7hWsLTQZAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"DS-pass-magic-link\"\n        title=\"DS-pass-magic-link\"\n        src=\"/static/080d729534ed7c510139db40ae1aefa4/e5715/DS-pass-magic-link.png\"\n        srcset=\"/static/080d729534ed7c510139db40ae1aefa4/a6d36/DS-pass-magic-link.png 650w,\n/static/080d729534ed7c510139db40ae1aefa4/e5715/DS-pass-magic-link.png 768w,\n/static/080d729534ed7c510139db40ae1aefa4/81501/DS-pass-magic-link.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=\"what-is-jwt-what-is-oauth-20\" style=\"position:relative;\"><a href=\"#what-is-jwt-what-is-oauth-20\" aria-label=\"what is jwt what is oauth 20 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 JWT? What is OAuth 2.0?</h2>\n<p>JWT (JSON Web Token) is a token format. It is digitally signed, self-contained, and compact. It provides a convenient mechanism for transferring data. </p>\n<p>JWT is not inherently secure, but the use of JWT can ensure the authenticity of the message so long as the signature is verified and the integrity of the payload can be guaranteed. JWT is often used for stateless authentication in simple use cases involving non-complex systems. </p>\n<p>On the other hand, <a href=\"/blog/identity/oauth2-0-guide/\">OAuth 2.0</a> is an authorization protocol that builds upon the original OAuth protocol created in 2006, arising out of a need for authorization flows serving different applications from the web and mobile apps to IoT.</p>\n<p>OAuth 2.0 specifies the flows and standards under which authorization token exchanges should occur. OAuth 2.0 does not encompass authentication, only authorization. </p>\n<h2 id=\"jwt-use-cases\" style=\"position:relative;\"><a href=\"#jwt-use-cases\" aria-label=\"jwt use cases 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>JWT Use Cases</h2>\n<ul>\n<li><strong>Information Exchange</strong> - JWT can be used between two parties to exchange information. JWT is digitally signed and can be used in a secure public/private key pair. Data is verified using the public key on the other end.</li>\n<li><strong>Authentication</strong>- JWT can contain user information in the payload and be used in the session to authenticate the user. Once authenticated, users can access protected applications using the JWT included in the request. So, every request will be authenticated by verifying the JWT.</li>\n</ul>\n<h2 id=\"advantages-of-using-jwt-for-your-api-product\" style=\"position:relative;\"><a href=\"#advantages-of-using-jwt-for-your-api-product\" aria-label=\"advantages of using jwt for your api product 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>Advantages of Using JWT for Your API Product</h2>\n<h3 id=\"1-jwt-offers-robust-security\" style=\"position:relative;\"><a href=\"#1-jwt-offers-robust-security\" aria-label=\"1 jwt offers robust 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>1. JWT offers robust security</h3>\n<p>Since tokens like JWT are stateless, only a secret key can validate it when received at a server-side application, which was used to create it. Hence they’re considered the best and the most secure way of offering authentication.</p>\n<p>Tokens act as a storage for the user’s credentials, and when the token travels between the server or the web browser, the stored credentials are never compromised.</p>\n<h3 id=\"2--jwt-based-authentication-is-more-scalable-and-efficient\" style=\"position:relative;\"><a href=\"#2--jwt-based-authentication-is-more-scalable-and-efficient\" aria-label=\"2  jwt based authentication is more scalable and efficient 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.  JWT-based authentication is more scalable and efficient</h3>\n<p>As we know that tokens must be stored on the user’s end, they offer a scalable solution.</p>\n<p>Moreover, the server just needs to create and verify the tokens and the information, which means that maintaining more users on a website or application at once is possible without any hassle.</p>\n<h3 id=\"3--jwt-offers-flexibility-and-performance\" style=\"position:relative;\"><a href=\"#3--jwt-offers-flexibility-and-performance\" aria-label=\"3  jwt offers flexibility and performance 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.  JWT offers flexibility and performance</h3>\n<p>Flexibility and enhanced overall performance are other vital aspects of <a href=\"https://www.loginradius.com/blog/engineering/guest-post/jwt-authentication-best-practices-and-when-to-use/\">JWT-based authentication</a>. They can be used across multiple servers and can offer authentication for various websites and applications at once.</p>\n<p>This helps in encouraging more collaboration opportunities between enterprises and platforms for a flawless experience.</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 security of consumer identity is becoming a significant challenge for online platforms collecting consumer information.  </p>\n<p>JWT can be a game-changer when it comes to performing secure authentication. </p>\n<p>The precise use of secure token management through a robust <a href=\"https://www.loginradius.com/\">consumer identity and access management</a> (CIAM) solution can help businesses secure consumer information without hampering the overall user experience. </p>\n<p>JWT can be the right option in most scenarios if implemented correctly and securely by following the proper security measures. </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":"January 04, 2022","updated_date":null,"description":"A token plays a crucial role in enhancing the overall security mechanism of an organization. This post will help you better understand what a token is, what is a JWT, and its pros that will help you decide why you need to invoke the potential of JWT for your API product.","title":"Are You Thinking of Token Management for Your API Product? Think about JWT!","tags":["security"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7241379310344827,"src":"/static/72f18d6005ea105c39c7326447f82250/33aa5/token-managmt.jpg","srcSet":"/static/72f18d6005ea105c39c7326447f82250/f836f/token-managmt.jpg 200w,\n/static/72f18d6005ea105c39c7326447f82250/2244e/token-managmt.jpg 400w,\n/static/72f18d6005ea105c39c7326447f82250/33aa5/token-managmt.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"2021 was a remarkable year since businesses began overcoming challenges and uncertainties worldwide amid the global pandemic.  Regardless of…","fields":{"slug":"/identity/loginradius-top-performing-blogs-2021/"},"html":"<p>2021 was a remarkable year since businesses began overcoming challenges and uncertainties worldwide amid the global pandemic. </p>\n<p>Regardless of the industry, almost every organization bounced back and made every effort to stay up and running in the most unpredictable times. </p>\n<p>As far as the consumer identity and access management (CIAM) industry is concerned, LoginRadius was one of the top performers in securing billions of identities and educating the global audience regarding the diverse aspects of CIAM and security. </p>\n<p>Our insightful blogs helped millions of people globally understand, implement, and enhance their platform experience by leveraging cutting-edge technology in the CIAM landscape. </p>\n<p>In this post, we’ve narrowed down the list of our Top 10 Performing Blogs in 2021 that people across the globe found insightful as they helped them cut corners during the unpredicted times. </p>\n<p>We hope you’ll find a topic you’re excited about and will get the most accurate and in-depth information about the same. Let’s get started. </p>\n<h3 id=\"10-how-to-set-up-two-factor-authentication-on-all-your-online-accounts\" style=\"position:relative;\"><a href=\"#10-how-to-set-up-two-factor-authentication-on-all-your-online-accounts\" aria-label=\"10 how to set up two factor authentication on all your online 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>#10. How to Set Up Two-factor Authentication on All Your Online Accounts?</h3>\n<p>Two-factor authentication is one of the best security methods that use two layers to verify a consumer's identity. </p>\n<p>This means, rather than simply entering the password to log into an account, two-factor authentication requires a code sent via text message to the consumer's phone number or generated through an app.</p>\n<p>Read this blog to learn everything about two-factor authentication, <a href=\"https://www.loginradius.com/blog/identity/how-to-setup-2fa-in-online-accounts/\">how to set up two-factor authentication</a> on your social accounts, and its importance. </p>\n<h3 id=\"9-what-is-a-salt-and-how-does-it-boost-security\" style=\"position:relative;\"><a href=\"#9-what-is-a-salt-and-how-does-it-boost-security\" aria-label=\"9 what is a salt and how does it boost 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>#9. What Is a Salt and How Does It Boost Security?</h3>\n<p>Salting hashes sounds like something that comes out of a recipe book. However, Salt plays a significant role in preventing a data breach in cryptography. </p>\n<p>While data leaks can sometimes happen, hash salting generators only come to mind when there is a significant invasion of privacy that affects the majority of the consumers’ applications.</p>\n<p>Read this blog to know more about <a href=\"https://www.loginradius.com/blog/identity/what-is-salt/\">Salt</a>, utilizing hashing using Salt, and its importance in enhancing overall password security. </p>\n<h3 id=\"8-identity-management-in-cloud-computing\" style=\"position:relative;\"><a href=\"#8-identity-management-in-cloud-computing\" aria-label=\"8 identity management in cloud computing 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>#8. Identity Management in Cloud Computing</h3>\n<p><a href=\"https://www.loginradius.com/blog/identity/identity-management-in-cloud-computing/\">Identity management in cloud computing</a> is the subsequent identity and access management (IAM) solution. </p>\n<p>However, it is a lot more than merely a straightforward web app single sign-on (SSO) solution. This next generation of IAM solution is a holistic move of the identity provider right to the cloud.</p>\n<p>This blog covers all the aspects of cloud IAM, its significance, and businesses must incline towards a modern cloud identity management solution. </p>\n<h3 id=\"7-a-detailed-guide-on-how-uxui-affects-registration\" style=\"position:relative;\"><a href=\"#7-a-detailed-guide-on-how-uxui-affects-registration\" aria-label=\"7 a detailed guide on how uxui affects registration 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>#7. A Detailed Guide on How UX/UI Affects Registration</h3>\n<p>Login is a big deal that decides the entire UX your website will deliver. Businesses should try to put as little resistance as possible into their registration process. </p>\n<p>As with it comes customer identities—the most accurate first-party data beneficial for conversions and customer retention.</p>\n<p><a href=\"https://www.loginradius.com/blog/identity/how-ui-ux-affects-registration/\">This blog</a> covers all the aspects associated with UI/UX along with the numerous benefits of using social login for your online platforms. </p>\n<h3 id=\"6-what-is-broken-authentication-and-how-to-prevent-your-company-from-it\" style=\"position:relative;\"><a href=\"#6-what-is-broken-authentication-and-how-to-prevent-your-company-from-it\" aria-label=\"6 what is broken authentication and how to prevent your company from 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>#6. What Is Broken Authentication and How to Prevent Your Company From It</h3>\n<p>When the hacker gains access into the system admin's account by using the online platform's vulnerabilities, particularly in two areas: credential management and session management, it's referred to as broken authentication.</p>\n<p>Poor credential management and poor session management always lead to broken authentication. Read on this blog to know everything about <a href=\"https://www.loginradius.com/blog/identity/what-is-broken-authentication/\">broken authentication</a>, its consequences, and how to prevent it. </p>\n<h3 id=\"5-refresh-tokens-when-to-use-them-and-how-they-interact-with-jwts\" style=\"position:relative;\"><a href=\"#5-refresh-tokens-when-to-use-them-and-how-they-interact-with-jwts\" aria-label=\"5 refresh tokens when to use them and how they interact with jwts 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. Refresh Tokens: When to Use Them and How They Interact with JWTs</h3>\n<p>A token plays a crucial role in enhancing the overall security mechanism of an organization that helps to deliver flawless and secure authentication and authorization on their website or application. </p>\n<p>With token security, users have to re-authenticate themselves for obvious security reasons by offering credentials to sign in if the access token is expired. </p>\n<p>However, this can be tedious and hampers user experience. To overcome this, the concept of refresh tokens was introduced.</p>\n<p>This blog provides an overview of using <a href=\"https://www.loginradius.com/blog/identity/refresh-tokens-jwt-interaction/\">refresh tokens</a> and helps securely authenticate users without hampering their overall experience. </p>\n<h3 id=\"4-the-rise-of-byoi-bring-your-own-identity\" style=\"position:relative;\"><a href=\"#4-the-rise-of-byoi-bring-your-own-identity\" aria-label=\"4 the rise of byoi bring your own identity 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. The Rise of BYOI (Bring your own Identity)</h3>\n<p>Consumers demand a more innovative experience today. They don't like to create a new ID whenever they want to utilize a service. Instead, they are open to leveraging their existing digital identity securely and efficiently, with the opportunity to reuse it in multiple domains.</p>\n<p>And as a response to this demand, businesses have come up with a concept called Bring Your Own Identity (BYOI).</p>\n<p>Read on this blog to learn every aspect of <a href=\"https://www.loginradius.com/blog/identity/bring-your-own-identity/\">BYOI</a>. </p>\n<h3 id=\"3-what-is-a-token-what-are-its-pros-and-cons\" style=\"position:relative;\"><a href=\"#3-what-is-a-token-what-are-its-pros-and-cons\" aria-label=\"3 what is a token what are its pros and cons 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. What is a Token? What are its Pros and Cons?</h3>\n<p>Tokens are widely used to provide authorization and authentication to users when accessing a website or a mobile application. This post covers detailed information about tokens' use and their advantages and disadvantages.</p>\n<p><a href=\"https://www.loginradius.com/blog/identity/pros-cons-token-authentication/\">This blog</a> will help you better understand what a token is, what are its pros and cons and will help you decide whether you need to invoke the potential of tokens for your business or not.</p>\n<h3 id=\"2-how-nist-is-changing-password-creation-in-2021\" style=\"position:relative;\"><a href=\"#2-how-nist-is-changing-password-creation-in-2021\" aria-label=\"2 how nist is changing password creation in 2021 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. How NIST is Changing Password Creation in 2021?</h3>\n<p>To cope with the increasing number of cyber frauds and data thefts, the National Institute of Standards and Technology (NIST) has issued specific requirements and controls for digital user identities.</p>\n<p>The NIST has dispensed several guidelines that ensure security to the user and eventually help enterprises secure their crucial business information.</p>\n<p>These guidelines offer recommendations for users for creating strong passwords and suggestions for vendors/verifiers handling passwords.</p>\n<p><a href=\"https://www.loginradius.com/blog/identity/nist-password-guidelines-2021/\">This blog</a> provides detailed information about NIST password guidelines and offers valuable insights into how businesses can ensure maximum security in 2021 and beyond.</p>\n<h3 id=\"1-the-future-of-authentication-is-passwordless-with-magic-links\" style=\"position:relative;\"><a href=\"#1-the-future-of-authentication-is-passwordless-with-magic-links\" aria-label=\"1 the future of authentication is passwordless with magic links 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. The Future of Authentication is Passwordless With Magic links</h3>\n<p>This is perhaps the most popular blog that depicts the importance of passwordless in the modern digital world. </p>\n<p>A passwordless magic link allows you to log in directly with the help of a link that is received through an email. This process is similar to receiving a one-time password (OTP) though you might have to physically enter the OTP once you are redirected to the page or application. </p>\n<p>In the case of passwordless magic links, all you have to do is click on the link sent through an email, allowing you to log in directly.</p>\n<p><a href=\"https://www.loginradius.com/blog/identity/passwordless-magic-links/\">Read on this insightful blog</a> that covers all the aspects of passwordless login, challenges, and how organizations can use magic links for going passwordless. </p>\n<h2 id=\"bottom-line\" style=\"position:relative;\"><a href=\"#bottom-line\" aria-label=\"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>Bottom Line</h2>\n<p>The blogs mentioned above can help you understand the CIAM landscape and the crucial role of incorporating a cutting-edge consumer identity and access management solution. </p>\n<p>LoginRadius helps businesses deliver a flawless user experience backed by robust security through a world-class consumer identity and access management solution. </p>\n<p>Reach us to know more about LoginRadius CIAM and how it can help scale your business growth even in the most unpredictable times. </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":"December 29, 2021","updated_date":null,"description":"Our insightful blogs helped millions of people globally understand, implement, and enhance their platform experience by leveraging cutting-edge technology in the CIAM landscape in 2021. Here we’ve compiled a list of our top-performing blogs of 2021 that can help you quickly find the most admired and insightful posts to solve your purpose.","title":"Top 10 Performing Identity Blogs in 2021","tags":["LoginRadius"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7391304347826086,"src":"/static/95e05aa57ea67e9bd0c598471a15cce4/33aa5/performing-blogs.jpg","srcSet":"/static/95e05aa57ea67e9bd0c598471a15cce4/f836f/performing-blogs.jpg 200w,\n/static/95e05aa57ea67e9bd0c598471a15cce4/2244e/performing-blogs.jpg 400w,\n/static/95e05aa57ea67e9bd0c598471a15cce4/33aa5/performing-blogs.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Navanita Devi","github":null,"avatar":null}}}},{"node":{"excerpt":"All React developers love to leverage the benefits React caters to in developing web applications. But developers need to keep in mind the…","fields":{"slug":"/engineering/react-security-vulnerabilities/"},"html":"<p>All React developers love to leverage the benefits React caters to in developing web applications. But developers need to keep in mind the security postures while creating React web apps. React applications face a vast attack surface and are prone to different vulnerabilities. This article is a checklist of React security best practices that every developer should know before diving into PWA (progressive web application) development.\nIf you are new to progressive web applications and React, let's get familiar with these terminologies first.</p>\n<h2 id=\"what-are-progressive-web-applications-pwa\" style=\"position:relative;\"><a href=\"#what-are-progressive-web-applications-pwa\" aria-label=\"what are progressive web applications pwa 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 Progressive Web Applications (PWA)?</h2>\n<p>Progressive Web Apps (PWA) are apps built using web technologies like HTML, CSS, and JavaScript (JS). But these apps deliver the experience, feel, and functionality of a native app. PWA combines new technologies and integrations to build a reliable, engaging, accessible, and secure application. Developers mostly use React on top of HTML and JavaScript to build a progressive web app.</p>\n<h2 id=\"what-is-react\" style=\"position:relative;\"><a href=\"#what-is-react\" aria-label=\"what is react 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 React?</h2>\n<p>React is popular among progressive web app developers. This open-source, robust JavaScript library helps in building user interfaces based on UI components. React gains popularity in the software development industry because it allows developers to create lightweight apps with additional facilities: security, push notification, app-like look and feel, etc. Some popular companies that have become the early adopters of React are Instagram, Netflix, Airbnb, Uber Eats, Discord, the New York Times, etc. </p>\n<h2 id=\"security-vulnerabilities-in-react-and-how-to-prevent-them\" style=\"position:relative;\"><a href=\"#security-vulnerabilities-in-react-and-how-to-prevent-them\" aria-label=\"security vulnerabilities in react and how to prevent them 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>Security Vulnerabilities in React and How to Prevent Them</h2>\n<p>React helps developers build a reliable, robust, and secure progressive web app, but these apps face certain security pitfalls also. Developers need to give prior attention to security vulnerabilities, which are often ignored due to faster app development cycles or more focus on product features.\nWith the arrival of each new update in React having more features, the security flaws are getting unnoticed. Such unnoticed actions are increasing security concerns. Here is a list of top React security vulnerabilities that every React developer must address before delivering or deploying their apps.</p>\n<h2 id=\"sql-injection\" style=\"position:relative;\"><a href=\"#sql-injection\" aria-label=\"sql injection 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>SQL Injection</h2>\n<p>SQL Injection (SQLi) is a widely known web application attack. The cybercriminal intends to perform database manipulation logically to access sensitive information that is not supposed to be displayed. Attackers try to sneak into that sensitive information to collect phone numbers, payment details, addresses, passwords, and other credentials.\nThis technique allows the attackers to manage access to the server, pull the data, and manipulate the values in the database. Apart from data modification, hackers can also delete the data.\nLet us take an example. Let us take an example where the code will search for the current user-ID and the login matching the employee name, where the owner is the current user-ID.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">string query = &quot;SELECT * FROM logondata WHERE owner = &quot;&#39;&quot;</span>\n<span class=\"grvsc-line\">+ empID + &quot;&#39; AND empName = &#39;&quot;</span>\n<span class=\"grvsc-line\">+ EmpName.Text + &quot;&#39;&quot;;</span></code></pre>\n<p>Combining both the employee ID and employee name, the following query gets generated.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">SELECT * FROM logondata</span>\n<span class=\"grvsc-line\">WHERE owner =</span>\n<span class=\"grvsc-line\">AND empName = ;</span></code></pre>\n<p>The problem that pops here is that the main code leverages the concept of concatenation that helps in combining those data. The attacker can use a string like <code> 'empName' OR 'x'='x' </code> as the employee name. <code> 'x' = 'x' </code> is such a condition, which will always evaluates to True. Therefore, the statement returns True for all values within the table. So, the following query becomes:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">SELECT * FROM logondata</span>\n<span class=\"grvsc-line\">WHERE owner = &#39;karlos&#39;</span>\n<span class=\"grvsc-line\">AND empName = &#39;name&#39; OR &#39;x&#39; = &#39;x&#39;;</span></code></pre>\n<p>There are three major categories of SQL injection based on how attackers gain access to the backend data.</p>\n<ul>\n<li>\n<p><strong>In-band SQL Injection:</strong> Here the persuader will instigate the attack and gather sensitive credentials via one single channel. Such SQL attacks are simple, and hence, it is one of the most commonly performed SQLi attacks on React apps. It comes with two sub-categories –</p>\n<ul>\n<li><strong>Error-based SQLi:</strong> The attacker performs a fake mimicking of the admin's credentials. Such an action provokes the database to generate an error. This error message reflects how the database schema and its structure got designed.</li>\n<li><strong>Union-based SQLi:</strong> The attacker uses the UNION operator of SQL to perform this attack. Using UNION, the attacker fuses multiple SELECT statements and triggers them from the web app for an HTTP response. Attackers can conduct a successful attack if the data response fetches some sensitive data residing in the database. It proves that UNION-based SQLi is possible.</li>\n</ul>\n</li>\n<li>\n<p><strong>Inferential/Blind SQL Injection:</strong> The attacker pushes payloads targeting the server. Then they observe the behavior and keep track of the server response to know more about the database structure. Here, the attacker cannot witness the data reverting through the attack in-band, hence the name \"Blind.\" There are two sub-categories of blind SQLi.</p>\n<ul>\n<li><strong>Boolean:</strong> The persuader sends an adversary query to the target database initiating the app to respond back. Depending on the True or False response value, the cybercriminal can prepare another SQL query that can extract data from that target database. The result of the query is either True or False and hence the name.</li>\n<li><strong>Time-based:</strong> Here, the attacker sends a SQL query through the web app and waits for the response. The attacker records the time required by the database in responding back and checks the server response as well (True or False). Based on these two response parameters, the attacker re-launches another query. If the message sent through the SQL query successfully slows down the response, SQL injection is possible on that application.</li>\n</ul>\n</li>\n<li><strong>Out-of-Band SQL Injection:</strong> Such attacks are more likely when the attacker senses some particular feature enabled in the server used by the React web application. This attack happens when the attacker cannot use the same channel to launch the attack and fetch data. They use such attack vectors when the server is unstable or unable to respond promptly.</li>\n</ul>\n<h3 id=\"checklist-to-fix-sqli-vulnerability-in-react-apps\" style=\"position:relative;\"><a href=\"#checklist-to-fix-sqli-vulnerability-in-react-apps\" aria-label=\"checklist to fix sqli vulnerability in react apps 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>Checklist to Fix SQLi Vulnerability in React Apps</h3>\n<ul>\n<li>A developer must follow the principle of rendering the least privilege to all accounts that will connect through a SQL query to the database.</li>\n<li>It is always necessary to filter all sorts of user input by following a strict whitelist. Even when an internal user provides any SQL query as input, the React app should filter those incoming SQL queries.</li>\n<li>A progressive web app becomes a victim of SQLi when a developer gives its database connection access to privileges like INSERT, UPDATE, or DELETE. So, developers should follow the best practice by assigning accurate database roles to separate account types.</li>\n<li>There could be some external factors (such as an external library, API, or software) that might drag your React application to a vulnerable position. To protect your React app from such vulnerability, the development team should scan the app periodically through any vulnerability scanner like Nessus or Acunetix.</li>\n<li>APIs connected to the React app can pose a threat to a significant level. Thus, a robust approach to avoid SQLi on React apps is to verify all API functions associated with their API schemas.</li>\n<li>Developers can place a REST API between the front-end (React code) and the back-end (database). It will create an extra layer of security that will not allow the front-end users to execute any SQL query directly. It prevents the React app from SQL injection attacks.</li>\n</ul>\n<h2 id=\"cross-site-scripting-xss-vulnerabilities\" style=\"position:relative;\"><a href=\"#cross-site-scripting-xss-vulnerabilities\" aria-label=\"cross site scripting xss 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>Cross-Site Scripting (XSS) Vulnerabilities</h2>\n<p>The comprehensive rendering feature of React makes it a preferable choice over other JavaScript libraries and frameworks. But this rendering feature also drags React-based apps to the most widely exploited vulnerability, cross-site scripting (XSS). Cross-site scripting leverages malicious client-side scripts by injecting them into web applications. When the users trigger those scripts, the attackers gain control over the app and steal sensitive information from the web application. </p>\n<p>Injecting malicious scripts into the react app will make the app release some internal app data. Therefore, React developers should prevent the application from running the script. Here is a typical example of cross-site scripting where the attacker can place and execute a malicious script within the application like this:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">&lt;input type=&quot;search&quot; value=&quot;PWA&quot;/&gt;</span></code></pre>\n<p>Now, executing malicious script will make the search look like:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">&lt;input type=&quot;search&quot; value=&quot;Attacker &quot;/&gt; &lt;script&gt; StealCredentials() &lt;/script&gt;&quot;&gt; ;</span></code></pre>\n<p>Here, StealCredentials() is a function that contains malicious scripts to steal user information.\nLet us now take a look at the types of XSS.</p>\n<ul>\n<li><strong>Reflected (Non-persistent) XSS:</strong> In this common type of XSS invasion, the attacker pushes phishing emails, malicious links or uses different hacking techniques to outwit victims to send malicious requests to the server. So, if the application is not leveraging a decent escaping method to user-provided data, the reflected XSS payload gets executed to the user's browser.</li>\n<li><strong>Stored (Persistent) XSS:</strong> It is the most damaging XSS attack form that stores the payload somewhere on the server-side. The attacker uses that payload or malicious script (mostly a JavaScript code) into the target React application. If the application does not render any input validation, the malicious code gets stored permanently (persistent) within the database. Popular web application areas where attackers try this attack are in the blog comment box or a forum post.</li>\n<li><strong>DOM-based XSS:</strong> Attackers can implement such XSS invasion when the web application follows the Document Object Model (DOM) structure. A progressive web app leveraging the principle of DOM stores the data on the client-side. The browser has to read and display the output from that stored data. In DOM-based XSS, the attacker injects the malicious code or payload in the DOM and hence the name. The attack mechanism executes the injected payload when users read the data back from the DOM.</li>\n</ul>\n<h3 id=\"checklist-to-fix-xss-vulnerability-in-react-apps\" style=\"position:relative;\"><a href=\"#checklist-to-fix-xss-vulnerability-in-react-apps\" aria-label=\"checklist to fix xss vulnerability in react apps 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>Checklist to Fix XSS Vulnerability in React Apps</h3>\n<p>This attack gains popularity, not simply because of its potential to harm the target users through the application but because such attacks need more creative and intellectual hackers. But, to prevent such attacks, developers need to become even more creative.</p>\n<ul>\n<li>The easiest way of securing any React app from multiple XSS attacks is to employ WAF (Web Application Firewall) with the code. WAF leverages a concept called signature-based filtering to restrict cross-site scripting attacks. React developers can incorporate a web application firewall into their code for protecting the app from running any adversary script.</li>\n<li>Developers can also disable the markups through which attackers can perform external code execution on React app. Some well-known HTML elements that allow running scripts are: &#x3C;script>, &#x3C;link>, &#x3C;object>, and &#x3C;embed>.</li>\n<li>Various programming languages offer libraries that can enable parsing HTML formatted text. These libraries can help sanitize HTML markup easily to prevent React apps from XSS. OWASP also has a range of libraries such as HtmlSanitizer, Java HTML Sanitizer, etc.</li>\n<li>Developers can also protect React apps from XSS by performing blacklist validation in conjunction with URL parsing.</li>\n<li>Modern and updated browsers (like Google Chrome) come with XSS detection and will not allow attackers to run any malicious script that is not coming from the original server or source.</li>\n<li>React developers can also prevent XSS by adding one security check by leveraging <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\">Cross-Origin Resource Sharing (CORS)</a>. They have to use it in the code header and assign it 'True'. It uses the browser's same-origin policy and blocks reading a resource originating from a different origin. Using CORS, developers can stop a malicious site from reading another site's data.</li>\n<li>\n<p>You can also use content security policies as the last line of defense against XSS. If all other XSS prevention fails, CSP allows developers to control various things, such as loading external scripts and executing inline scripts. To deploy CSP, developers need to include an HTTP response header called Content-Security-Policy with a value carrying the policy.\nAn example for including CSP is as follows:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">default-src &#39;self&#39;; script-src &#39;self&#39;; object-src &#39;none&#39;; frame-src &#39;none&#39;; base-uri &#39;none&#39;;</span></code></pre>\n</li>\n</ul>\n<h2 id=\"broken-authentication\" style=\"position:relative;\"><a href=\"#broken-authentication\" aria-label=\"broken 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>Broken Authentication</h2>\n<p>Broken authentication is a weakness through which attackers can capture one or multiple accounts when authentication or session management is poorly implemented in progressive web apps. This vulnerability helps the attacker take over multiple user accounts, letting the attacker possess the same privileges and access control as the target user. </p>\n<p>Attackers usually exploit such a React security vulnerability by detecting the authentication solution or bypassing them. The security team labels the authentication as broken when the cybercriminal can compromise users' passwords, session tokens, digital identities, or account information from the React app. Examples of some common reasons for this attack are:</p>\n<ul>\n<li>Unencrypted network sending session IDs, passwords, and other credentials</li>\n<li>Unprotected authentication credentials</li>\n<li>Session values without a specific time-out</li>\n<li>Predictable login credentials</li>\n<li>Improper hashing and salting of passwords</li>\n</ul>\n<p>Let us take a situation where the attacker could detect the hashes for the following names.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">Sue    4420d1918bbcf7686defdf9560bb5087d20076de5f77b7cb4c3b40bf46ec428s</span>\n<span class=\"grvsc-line\">Karlos    4420d1918bbcf7686defdf9560bb5087d20076de5f77b7cb4c3b40bf46ec624g</span>\n<span class=\"grvsc-line\">Dee    77b177de23f81d37b5b4495046b227befa4546db63cfe6fe541fc4c3cd216egk</span></code></pre>\n<p>The hash function will store the password in a hashed form rather than plain text. But then, humans can easily read the hash. Now, if two different users enter the same password, then these passwords will generate the same hash. Hackers can perform a dictionary attack, and if they crack one password, they can use the same password to gain access to other accounts that use the same hash.</p>\n<h3 id=\"checklist-to-fix-react-pwas-from-broken-authentication-vulnerability\" style=\"position:relative;\"><a href=\"#checklist-to-fix-react-pwas-from-broken-authentication-vulnerability\" aria-label=\"checklist to fix react pwas from broken authentication vulnerability 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>Checklist to Fix React PWAs from Broken Authentication Vulnerability</h3>\n<ul>\n<li>The React applications should enforce password checks, whether the password is strong or weak. Also, adding criteria like eight characters (minimum) having uppercase, lowercase, numbers, and symbols can prevent users from such attacks.</li>\n<li>Employing multi-factor authentication (MFA) can prevent users from compromised credential reuse and credential stuffing.</li>\n<li>Another common React security best practice is to generate the message or notification email, keeping the email format or template the same. Such a practice prevents React app users from account enumeration attacks.</li>\n<li>Not exposing the session ID in the URL also comes under the best practice.</li>\n<li>For every React app, the session ID time-out is a must. Developers can secure progressive web apps by implementing a server-side session manager. It will produce a new session every time the user tries to log in.</li>\n<li>Proper hashing and salting of passwords are mandatory to prevent broken authentication attacks.</li>\n</ul>\n<h2 id=\"xml-external-entities-xxe\" style=\"position:relative;\"><a href=\"#xml-external-entities-xxe\" aria-label=\"xml external entities xxe 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>XML External Entities (XXE)</h2>\n<p>Attackers can perform XML External Entities attacks on React web applications that parse XML input. Here the outdated XML parsers of your React app become vulnerable. Such vulnerability can lead an attacker to perform denial of service, port scanning, server-side request forgery, etc. Such attacks occur when an XML input gets referred to an external entity but has a weakly configured XML parser. Here are some examples where attackers are attempting XEE on React web applications that parse XML input.</p>\n<ul>\n<li>\n<p>The attacker might attempt to extract data from the server.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt; &lt;!DOCTYPE sample [</span>\n<span class=\"grvsc-line\">&lt;!ELEMENT sample POO &gt;</span>\n<span class=\"grvsc-line\">&lt;!ENTITY xmlxxe SYSTEM &quot;file:///etc/passwd&quot; &gt;]&gt; &lt;sample&gt; &xmlxxe; &lt;/sample&gt;</span></code></pre>\n</li>\n<li>\n<p>Another code snippet where the attacker explores the private network of the server by tweaking the code:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"8\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">&lt;!ENTITY xmlxxe SYSTEM &quot;https://186.141.2.1/privnw&quot; &gt;]&gt;</span></code></pre>\n</li>\n<li>\n<p>It is another code snippet where the attacker tries for a Denial of Service (DoS) attack by comprising a potentially perpetual file:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"9\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">&lt;!ENTITY xmlxxe SYSTEM &quot;file:///gkr/rand&quot; &gt;]&gt;</span></code></pre>\n</li>\n</ul>\n<h3 id=\"checklist-to-fix-xxe-vulnerability-in-react-apps\" style=\"position:relative;\"><a href=\"#checklist-to-fix-xxe-vulnerability-in-react-apps\" aria-label=\"checklist to fix xxe vulnerability in react apps 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>Checklist to Fix XXE Vulnerability in React Apps</h3>\n<ul>\n<li>Developers need to keep all the XML libraries and processors fully updated or patched.</li>\n<li>It is a good practice to disable all XML external entities and DTD processing.</li>\n<li>React developers should adopt simpler data formats like JSON instead of XML. It will help avoid the serialization of sensitive data.</li>\n<li>Various Static Application Security Testing (SAST) tools help identify malicious XXE in the code.</li>\n<li>Developers should also perform filtering and server-side input validation to limit injecting unfriendly data input in XML documents or headers. Modern and updated browsers do not allow attackers to run malicious XML scripts as they come with built-in input validation.</li>\n</ul>\n<h2 id=\"zip-slip\" style=\"position:relative;\"><a href=\"#zip-slip\" aria-label=\"zip slip 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>Zip Slip</h2>\n<p>It is another popular React app vulnerability where the malicious actor exploits the app by submitting zip files having malicious or arbitrary code within them. React developers enable adding zip files to decrease the file size while they get uploaded. When the app unzips the archive, its malicious file(s) can overwrite other files or perform arbitrary code execution. Attackers can either harm the files existing in the target system or gain remote access to the system.</p>\n<p>Here is a Zip slip code example demonstrating a ZipEntry path merges to a destination directory without validating that path. Researchers and security professionals have found similar codes in different repositories across many apps.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"10\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">Enumeration&lt;ZipEntry&gt; entry = zip.getEntries();</span>\n<span class=\"grvsc-line\"> while (entry.hasMoreElements()) {</span>\n<span class=\"grvsc-line\">ZipEntry ez = entry.nextElement();</span>\n<span class=\"grvsc-line\">File fil = new File(destinationDir, ez.getName());</span>\n<span class=\"grvsc-line\">InputStream input = zip.getInputStream(ez);</span>\n<span class=\"grvsc-line\">IOUtils.copy(input, write(fil));</span>\n<span class=\"grvsc-line\"> }</span></code></pre>\n<p>Here is a <a href=\"https://github.com/snyk/zip-slip-vulnerability\">link</a> to the repository containing libraries and APIs infected by zip slip.</p>\n<h3 id=\"checklist-to-fix-zip-slip-vulnerability-in-react-apps\" style=\"position:relative;\"><a href=\"#checklist-to-fix-zip-slip-vulnerability-in-react-apps\" aria-label=\"checklist to fix zip slip vulnerability in react apps 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>Checklist to Fix Zip Slip Vulnerability in React Apps</h3>\n<ul>\n<li>React developers can search through the project for vulnerable codes. Developers can integrate validation code to the original application's code to check for directory traversal.</li>\n<li>Another way to prevent Zip Slip attacks in React apps is to include the Zip Slip Security Testing solution in the build pipeline of the app.</li>\n<li>Do not allow uploading files having special characters.</li>\n<li>Renaming all the zip files is another best practice to prevent zip slip attacks. Developers should generate new file names for each file before the application leverages them.</li>\n<li>Node.js uses npm libraries as the dependency. React internally uses node.js, and hence any vulnerable library can pose a threat to the React app. It is a good practice to create your own dependencies and libraries rather than using 3rd-party libraries.</li>\n</ul>\n<h2 id=\"cross-site-request-forgery-csrf-or-xsrf\" style=\"position:relative;\"><a href=\"#cross-site-request-forgery-csrf-or-xsrf\" aria-label=\"cross site request forgery csrf or xsrf 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>Cross-site Request Forgery (CSRF or XSRF)</h2>\n<p>CSRF is another React web application vulnerability allowing attackers to persuade users to perform unintentional actions without their direct consent. It does not steal the identity of the legitimate user but acts against their will. For rendering such attacks, the attacker sends an email or a web link convincing the victim to achieve a state-changing request in the application.</p>\n<p>Before going through the checklist on fixing CSRF vulnerabilities, here is a quick example of how the CSRF GET request will be once the attacker tweaks it.\nA standard GET request for a $250 transfer from person1 to person2 might look like this:</p>\n<p>When the attacker induces the user to perform some unintended action or runs a malicious script, the $250 gets transferred to the attacker's account. This malicious request might look something like this:</p>\n<p>Some attackers can also put innocent-looking hyperlinks embedding the request.</p>\n<h3 id=\"checklist-to-fix-react-pwas-from-csrf-vulnerability\" style=\"position:relative;\"><a href=\"#checklist-to-fix-react-pwas-from-csrf-vulnerability\" aria-label=\"checklist to fix react pwas from csrf vulnerability 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>Checklist to Fix React PWAs from CSRF Vulnerability</h3>\n<ul>\n<li>The progressive React web app should not deliver CSRF tokens using Cookies.</li>\n<li>An alternate defense mechanism against CSRF is to leverage a double submit cookie technique.</li>\n<li>Another robust way of preventing an application from a CSRF attack is to add a relevant CSRF token tied to user sessions and strictly validate every case before executing any appropriate action.</li>\n<li>It is always a good choice to shift from HTTP/1.1 to HTTP/2 or HTTP/3. HTTP/2 and 3 are fast, more secure than HTTP/1.1, and almost all modern browsers support them.</li>\n</ul>\n<h2 id=\"vulnerability-in-packages-and-dependencies\" style=\"position:relative;\"><a href=\"#vulnerability-in-packages-and-dependencies\" aria-label=\"vulnerability in packages and dependencies 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>Vulnerability in Packages and Dependencies</h2>\n<p>It might happen that you have pushed a React app's code to GitHub. Now an email/notification is popping up saying, \"One of your dependencies has a security vulnerability.\" That is another method where attackers seek the help of malicious packages to gain access to your React applications. Such malicious packages collect valuable app details and user information and send it to a third party. </p>\n<p>These packages can also execute malicious code during the package installation phase. These attackers use the concept of typosquatting to make their attacks seamless. Typosquatting is a method of naming the packages based on their original counterparts. It outwits the developers into downloading these malicious packages that can wreak havoc on the React app.</p>\n<h3 id=\"checklist-to-fix-malicious-package-vulnerability-in-react-apps\" style=\"position:relative;\"><a href=\"#checklist-to-fix-malicious-package-vulnerability-in-react-apps\" aria-label=\"checklist to fix malicious package vulnerability in react apps 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>Checklist to Fix Malicious Package Vulnerability in React Apps</h3>\n<ul>\n<li>One way to detect and remove this vulnerability is to recognize the vulnerable package and find an alternative React package. It is a good practice to analyze your app against malicious package vulnerability.</li>\n<li>Developers can also use SAST tools to detect exploitable code in a React application. SAST tools can scan and inspect all the application's source code, byte code, dependencies, packages, and binaries to uncover security vulnerabilities.</li>\n<li>Since Node uses npm libraries and dependencies and React uses Node, developers should make a checklist of vulnerable libraries like <a href=\"https://github.com/ZJONSSON/node-unzipper\">unzipper</a>, <a href=\"https://github.com/cthackers/adm-zip\">adm-zip</a>, and <a href=\"https://snyk.io/vuln/npm:npm\">other vulnerability release lists</a> for better precaution while developing React applications. </li>\n</ul>\n<h2 id=\"wrapping-up\" style=\"position:relative;\"><a href=\"#wrapping-up\" aria-label=\"wrapping 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>Wrapping Up</h2>\n<p>Hope this comprehension has given a crisp idea of the top React vulnerabilities and the different checklists developers can use to fix those security flaws. Developers should know how crucial application security is for both the business and its users. As the React features are increasing, there is an equal delay in the number of days taken by the React community to fix any React security issues. </p>\n<p>In this article, we discussed the most well-known vulnerabilities like SQLi, XSS, Broken Authentication, XXE, Zip Slip, CSRF, and Package &#x26; dependency vulnerabilities, plus how to prevent React apps from such attacks. So, developers and product managers should cautiously handle all security-related aspects of a React project by following the checklist given in this article.</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</style>","frontmatter":{"date":"December 24, 2021","updated_date":null,"description":"React security vulnerabilities are hard to detect. However, this article talks about the top 7 vulnerabilities and how to fix them to enjoy all the benefits React caters to in developing Progressive Web Applications.","title":"React Security Vulnerabilities and How to Fix/Prevent Them","tags":["React","Vulnerability"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.2820512820512822,"src":"/static/7d6e838c39ee3573adb83d3237a82ee6/ee604/react-security.png","srcSet":"/static/7d6e838c39ee3573adb83d3237a82ee6/69585/react-security.png 200w,\n/static/7d6e838c39ee3573adb83d3237a82ee6/497c6/react-security.png 400w,\n/static/7d6e838c39ee3573adb83d3237a82ee6/ee604/react-security.png 800w,\n/static/7d6e838c39ee3573adb83d3237a82ee6/f3583/react-security.png 1200w,\n/static/7d6e838c39ee3573adb83d3237a82ee6/5707d/react-security.png 1600w,\n/static/7d6e838c39ee3573adb83d3237a82ee6/b6c0e/react-security.png 1926w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Gaurav Kumar Roy","github":"GauravRoy6","avatar":null}}}},{"node":{"excerpt":"Security has become a fundamental aspect to consider while developing an application. As people become more aware and hackers more notorious…","fields":{"slug":"/engineering/guest-post/securing-php-api-with-jwt/"},"html":"<p>Security has become a fundamental aspect to consider while developing an application. As people become more aware and hackers more notorious, you need to employ systems that strengthen your application's data security.</p>\n<p>Previously, it was common to use session storage to secure applications. In recent times, sessions have proved inefficient, which pushed to migrate to authentication with APIs. Even though this was a superb and robust way to secure web applications, it became obsolete as hackers tried to figure out how to crack this authentication.</p>\n<p>As the web evolves to accept more and more users, the research for secure authentication techniques speeds up. In 2010, the world was introduced to a new and secure authentication standard -- JWT. Let's know more about JWT.</p>\n<h2 id=\"what-is-jwt\" style=\"position:relative;\"><a href=\"#what-is-jwt\" aria-label=\"what is jwt 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 JWT?</h2>\n<p>JSON Web Token (JWT) is a safe way to authenticate users on a web app. Using JWT, you can securely transfer encrypted data and information between a client computer and a server.</p>\n<blockquote>\n<p>Learn more about the <a href=\"https://www.loginradius.com/blog/engineering/guest-post/jwt-vs-sessions/\">differences between sessions and JWTs here</a>.</p>\n</blockquote>\n<p>JWT offers many benefits. Here are some of them.</p>\n<h2 id=\"benefits-of-using-jwt\" style=\"position:relative;\"><a href=\"#benefits-of-using-jwt\" aria-label=\"benefits of using jwt 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>Benefits of Using JWT</h2>\n<ul>\n<li>Compatible with OAuth 2, meaning your applications will be easy to work with the latest security standards.</li>\n<li>JWTs can expire after some time so that no one has uninterrupted access to the website. This is important to protect a website from attacks.</li>\n<li>JSON is used to transmit data, so you can work with any language of your choice and handle the JSON data.</li>\n<li>JWTs are feature-rich and encompass complete information about any authorization request with different aspects.</li>\n</ul>\n<p>Now that you've learned about the advantages, it's time to go deeper into the JWT.</p>\n<h2 id=\"the-structure-of-jwt\" style=\"position:relative;\"><a href=\"#the-structure-of-jwt\" aria-label=\"the structure of jwt 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 Structure of JWT</h2>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"json\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">eyJ</span><span class=\"mtk7\">0</span><span class=\"mtk1\">eXAiOiJKV</span><span class=\"mtk7\">1</span><span class=\"mtk1\">QiLCJhbGciOiJIUzI</span><span class=\"mtk7\">1</span><span class=\"mtk1\">NiJ</span><span class=\"mtk7\">9</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  .eyJpc</span><span class=\"mtk7\">3</span><span class=\"mtk1\">MiOiJodHRwczpcL</span><span class=\"mtk7\">1</span><span class=\"mtk1\">wvcWEtYXBpLndlbGx</span><span class=\"mtk7\">2</span><span class=\"mtk1\">aWJlLmNvbVwvYXBpXC</span><span class=\"mtk7\">9</span><span class=\"mtk1\">hdXRoXC</span><span class=\"mtk7\">9</span><span class=\"mtk1\">sb</span><span class=\"mtk7\">2</span><span class=\"mtk1\">dpbiIsImlhdCI</span><span class=\"mtk7\">6</span><span class=\"mtk1\">MTYzMDQ</span><span class=\"mtk7\">3</span><span class=\"mtk1\">OTA</span><span class=\"mtk7\">5</span><span class=\"mtk1\">NSwiZXhwIjoxNjMwNDgyNjk</span><span class=\"mtk7\">1</span><span class=\"mtk1\">LCJuYmYiOjE</span><span class=\"mtk7\">2</span><span class=\"mtk1\">MzA</span><span class=\"mtk7\">0</span><span class=\"mtk1\">NzkwOTUsImp</span><span class=\"mtk7\">0</span><span class=\"mtk1\">aSI</span><span class=\"mtk7\">6</span><span class=\"mtk1\">Imtsa</span><span class=\"mtk7\">3</span><span class=\"mtk1\">hHUGpMOVlNTzRSdUsiLCJzdWIiOjc</span><span class=\"mtk7\">3</span><span class=\"mtk1\">ODE</span><span class=\"mtk7\">4</span><span class=\"mtk1\">LCJwcnYiOiIyM</span><span class=\"mtk7\">2</span><span class=\"mtk1\">JkNWM</span><span class=\"mtk7\">4</span><span class=\"mtk1\">OTQ</span><span class=\"mtk7\">5</span><span class=\"mtk1\">ZjYwMGFkYjM</span><span class=\"mtk7\">5</span><span class=\"mtk1\">ZTcwMWM</span><span class=\"mtk7\">0</span><span class=\"mtk1\">MDA</span><span class=\"mtk7\">4</span><span class=\"mtk1\">NzJkYjdhNTk</span><span class=\"mtk7\">3</span><span class=\"mtk1\">NmY</span><span class=\"mtk7\">3</span><span class=\"mtk1\">IiwidXNlcnNfaWQiOjc</span><span class=\"mtk7\">3</span><span class=\"mtk1\">ODE</span><span class=\"mtk7\">4</span><span class=\"mtk1\">LCJtZW</span><span class=\"mtk7\">1</span><span class=\"mtk1\">iZXJzX</span><span class=\"mtk7\">2</span><span class=\"mtk1\">lkIjo</span><span class=\"mtk7\">3</span><span class=\"mtk1\">Nzg</span><span class=\"mtk7\">4</span><span class=\"mtk1\">MzMsInByb</span><span class=\"mtk7\">3</span><span class=\"mtk1\">h</span><span class=\"mtk7\">5</span><span class=\"mtk1\">X</span><span class=\"mtk7\">3</span><span class=\"mtk1\">VzZXJfbWVtYmVyc</span><span class=\"mtk7\">19</span><span class=\"mtk1\">pZCI</span><span class=\"mtk7\">6</span><span class=\"mtk1\">bnVsbH</span><span class=\"mtk7\">0</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  .TxXwLLu</span><span class=\"mtk7\">1</span><span class=\"mtk1\">zWBe</span><span class=\"mtk7\">7</span><span class=\"mtk1\">cLLYdFYy</span><span class=\"mtk7\">3</span><span class=\"mtk1\">P</span><span class=\"mtk7\">2</span><span class=\"mtk1\">HX</span><span class=\"mtk7\">4</span><span class=\"mtk1\">AaLgc</span><span class=\"mtk7\">7</span><span class=\"mtk1\">WfSRtTgeiI</span></span></code></pre>\n<p>The above string is an example of a JWT authentication string. At first glance, it may appear to be a randomly produced string. But don't underestimate; this string is made up of three separate components that are essential in a JWT.</p>\n<h3 id=\"jwt-header\" style=\"position:relative;\"><a href=\"#jwt-header\" aria-label=\"jwt header 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>JWT Header</h3>\n<p>The header of a JWT is the initial section of the string before the first dot. This header is produced by acquiring plain text and performing cryptographic operations on it. Moreover, the header uses a very efficient Base64 encoding procedure.</p>\n<p>You can quickly obtain the JWT's headers using symmetric or asymmetric encryption techniques.</p>\n<h3 id=\"jwt-payload\" style=\"position:relative;\"><a href=\"#jwt-payload\" aria-label=\"jwt payload 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>JWT Payload</h3>\n<p>The string's central component is the JWT's payload part. This string includes all of the important information about a received request and the user or client computer who created the request. There are predefined key-value pair fields in the payload that can be used to offer extra information about the received request. Here is an explanation of common payload fields.</p>\n<ul>\n<li><strong>Sub</strong> - The sub field contains the subject of a JWT payload. It contains unique information about the user and client device that has created this authentication request.</li>\n<li><strong>Iss</strong> - This field contains data about the server that has issued the token. Iss is short for Issuer, which refers to the server.</li>\n<li><strong>Exp</strong> - Unlike other authentication techniques, JWT has an expiration time. This field's name is a short form for the expiration date. It contains data about when the token was issued and the expiration date and time of the issued token.</li>\n</ul>\n<h3 id=\"jwt-signature\" style=\"position:relative;\"><a href=\"#jwt-signature\" aria-label=\"jwt signature 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>JWT Signature</h3>\n<p>A cryptographic operation is performed on the JWT data to obtain this signature. It takes in the payload, secret key, and header value of a JWT. The signature is then generated by applying a function to these obtained values.</p>\n<p>The server and user can verify this signature to know about the data's security and integrity. If this signature matches at both ends, then the data is considered secure, and all other transactions can occur.</p>\n<h2 id=\"using-jwts-to-secure-php-api\" style=\"position:relative;\"><a href=\"#using-jwts-to-secure-php-api\" aria-label=\"using jwts to secure php api 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>Using JWTs to Secure PHP API</h2>\n<p>As you've understood everything about JWT, let's secure your PHP API using JWT. Follow the code along, and, in the end, you'll create a tamper-proof PHP API.</p>\n<p>This article creates a simple login page and authenticates it using JWT. This will help you get started with JWT and PHP.</p>\n<p>To follow along, you'll need to have PHP and composer installed on your computer.</p>\n<p>If you haven't already installed composer on your computer, you can <a href=\"https://getcomposer.org/doc/00-intro.md\">learn how to install composer here</a>. Once you've installed composer, run the tool from your project folder. Composer will assist you in installing Firebase PHP-JWT, a third-party library for working with JWTs and Apache.</p>\n<p>Once the library is installed, you'll need to set up a login code in <code>authenticate.php</code>. While you do this, put a code piece that checks and gets the autoloader from the composer tool. The below code helps you achieve this.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"php\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">&lt;?php</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">declare</span><span class=\"mtk1\">(strict_types=</span><span class=\"mtk7\">1</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">use</span><span class=\"mtk1\"> Firebase\\JWT\\</span><span class=\"mtk10\">JWT</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk11\">require_once</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;../vendor/autoload.php&#39;</span><span class=\"mtk1\">);</span></span></code></pre>\n<p>When the form gets submitted, you need to check the entered data with a data source or database. For our purpose, let's create a <code>hasValidCredentials</code> variable and set it to true. Setting this variable to true means that the data is checked and valid.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"php\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">&lt;?php</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk3\">// extract credentials from the request</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">$hasValidCredentials</span><span class=\"mtk1\">) {</span></span></code></pre>\n<p>Any further coding will be wrapped in this block itself. The value of the <code>hasValidCredentials</code> variable governs all code related to the production and validation of the required JWT. If its value is true, the JWT shall be created; otherwise, an error will be shown.</p>\n<h3 id=\"creating-jwt\" style=\"position:relative;\"><a href=\"#creating-jwt\" aria-label=\"creating jwt 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>Creating JWT</h3>\n<p>Let's start creating the JWT. First, you need to generate some more variables to aid in this process. As you saw in the payload section, you must create:</p>\n<ul>\n<li>a variable that will hold the secret key, which may be retrieved from the environment files;</li>\n<li>another variable to hold information about when the JWT was created;</li>\n<li>a variable that will hold the JWT's expiration date and time;</li>\n<li>a username field to identify the client making the authorization request; and,</li>\n<li>a server name variable to register the server name.</li>\n</ul>\n<p>JWT's can be easily inspected and checked at client-side browsers. So it is better to hide your secret key and other important information in some environment file, which the user cannot access through client-side requests.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"php\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk12\">$secret_Key</span><span class=\"mtk1\">  = </span><span class=\"mtk8\">&#39;68V0zWFrS72GbpPreidkQFLfj4v9m3Ti+DXc8OB0gcM=&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">$date</span><span class=\"mtk1\">   = </span><span class=\"mtk4\">new</span><span class=\"mtk1\"> </span><span class=\"mtk10\">DateTimeImmutable</span><span class=\"mtk1\">();</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">$expire_at</span><span class=\"mtk1\">     = </span><span class=\"mtk12\">$date</span><span class=\"mtk1\">-&gt;</span><span class=\"mtk11\">modify</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;+6 minutes&#39;</span><span class=\"mtk1\">)-&gt;</span><span class=\"mtk11\">getTimestamp</span><span class=\"mtk1\">();      </span><span class=\"mtk3\">// Add 60 seconds</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">$domainName</span><span class=\"mtk1\"> = </span><span class=\"mtk8\">&quot;your.domain.name&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">$username</span><span class=\"mtk1\">   = </span><span class=\"mtk8\">&quot;username&quot;</span><span class=\"mtk1\">;                                           </span><span class=\"mtk3\">// Retrieved from filtered POST data</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">$request_data</span><span class=\"mtk1\"> = [</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&#39;iat&#39;</span><span class=\"mtk1\">  =&gt; </span><span class=\"mtk12\">$date</span><span class=\"mtk1\">-&gt;</span><span class=\"mtk11\">getTimestamp</span><span class=\"mtk1\">(),         </span><span class=\"mtk3\">// Issued at: time when the token was generated</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&#39;iss&#39;</span><span class=\"mtk1\">  =&gt; </span><span class=\"mtk12\">$domainName</span><span class=\"mtk1\">,                       </span><span class=\"mtk3\">// Issuer</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&#39;nbf&#39;</span><span class=\"mtk1\">  =&gt; </span><span class=\"mtk12\">$date</span><span class=\"mtk1\">-&gt;</span><span class=\"mtk11\">getTimestamp</span><span class=\"mtk1\">(),         </span><span class=\"mtk3\">// Not before</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&#39;exp&#39;</span><span class=\"mtk1\">  =&gt; </span><span class=\"mtk12\">$expire_at</span><span class=\"mtk1\">,                           </span><span class=\"mtk3\">// Expire</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&#39;userName&#39;</span><span class=\"mtk1\"> =&gt; </span><span class=\"mtk12\">$username</span><span class=\"mtk1\">,                     </span><span class=\"mtk3\">// User name</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">];</span></span></code></pre>\n<p>Now you have all the required data in hand; you can easily create a JWT. Here, you'll use the PHP-JWT package's <code>encode()</code> method. This method helps transform your data array into a JSON object.</p>\n<p>Following the conversion to a JSON object, the encode function produces JWT headers and signs the received payload with a cryptographic combination of all the information and the given secret key.</p>\n<p>It is essential to supply three arguments to the <code>encode()</code> method to utilize it correctly. The first argument should be the payload information, which is the data array in this instance. Secondly, you must supply the secret key as an argument; and finally, you must define the cryptographic technique that the function should use to sign the JWT.</p>\n<p>To obtain and return the JWT, you'll have to use the echo method above the encode method, as shown below.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"php\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">&lt;?php</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk3\">// Encode the array to a JWT string.</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">echo</span><span class=\"mtk1\"> </span><span class=\"mtk10\">JWT</span><span class=\"mtk1\">::</span><span class=\"mtk11\">encode</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">$request_data</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk12\">$secret_Key</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk8\">&#39;HS512&#39;</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 that you have obtained the JWT token, you can transfer it to the client-side and save it using any web programming language of your choice. Let's start with a short JS demonstration of the route ahead.</p>\n<p>First, when a successful form submission takes place, save the created and received JWT in client-side memory. To display some output about the JWT's success, remove the login form and merely display a button that retrieves and displays the JWT's timestamp to the user when it is clicked.</p>\n<p>Here is some sample code for the process mentioned above.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">storeJWT</span><span class=\"mtk1\"> = {}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">loginBtn</span><span class=\"mtk1\"> = </span><span class=\"mtk12\">document</span><span class=\"mtk1\">.</span><span class=\"mtk11\">querySelector</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;#frmLogin&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">btnResource</span><span class=\"mtk1\"> = </span><span class=\"mtk12\">document</span><span class=\"mtk1\">.</span><span class=\"mtk11\">querySelector</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;#btnGetResource&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">formData</span><span class=\"mtk1\"> = </span><span class=\"mtk12\">document</span><span class=\"mtk1\">.</span><span class=\"mtk12\">forms</span><span class=\"mtk1\">[</span><span class=\"mtk7\">0</span><span class=\"mtk1\">]</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk3\">// Inserts the jwt to the store object</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">storeJWT</span><span class=\"mtk1\">.</span><span class=\"mtk11\">setJWT</span><span class=\"mtk1\"> = </span><span class=\"mtk4\">function</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">data</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">this</span><span class=\"mtk1\">.</span><span class=\"mtk12\">JWT</span><span class=\"mtk1\"> = </span><span class=\"mtk12\">data</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=\"mtk12\">loginBtn</span><span class=\"mtk1\">.</span><span class=\"mtk11\">addEventListener</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;submit&quot;</span><span class=\"mtk1\">, </span><span class=\"mtk4\">async</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>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">response</span><span class=\"mtk1\"> = </span><span class=\"mtk15\">await</span><span class=\"mtk1\"> </span><span class=\"mtk11\">fetch</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;/authenticate.php&quot;</span><span class=\"mtk1\">, {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">method:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;POST&quot;</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\">&quot;Content-type&quot;</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;application/x-www-form-urlencoded; charset=UTF-8&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\">body:</span><span class=\"mtk1\"> </span><span class=\"mtk10\">JSON</span><span class=\"mtk1\">.</span><span class=\"mtk11\">stringify</span><span class=\"mtk1\">({</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk12\">username:</span><span class=\"mtk1\"> </span><span class=\"mtk12\">formData</span><span class=\"mtk1\">.</span><span class=\"mtk12\">inputEmail</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 class=\"mtk12\">password:</span><span class=\"mtk1\"> </span><span class=\"mtk12\">formData</span><span class=\"mtk1\">.</span><span class=\"mtk12\">inputPassword</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 class=\"mtk1\">  })</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">response</span><span class=\"mtk1\">.</span><span class=\"mtk12\">status</span><span class=\"mtk1\"> &gt;= </span><span class=\"mtk7\">200</span><span class=\"mtk1\"> && </span><span class=\"mtk12\">response</span><span class=\"mtk1\">.</span><span class=\"mtk12\">status</span><span class=\"mtk1\"> &lt;= </span><span class=\"mtk7\">299</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\">jwt</span><span class=\"mtk1\"> = </span><span class=\"mtk15\">await</span><span class=\"mtk1\"> </span><span class=\"mtk12\">response</span><span class=\"mtk1\">.</span><span class=\"mtk11\">text</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">storeJWT</span><span class=\"mtk1\">.</span><span class=\"mtk11\">setJWT</span><span class=\"mtk1\">(</span><span class=\"mtk12\">jwt</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">frmLogin</span><span class=\"mtk1\">.</span><span class=\"mtk12\">style</span><span class=\"mtk1\">.</span><span class=\"mtk12\">display</span><span class=\"mtk1\"> = </span><span class=\"mtk8\">&quot;none&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">btnResource</span><span class=\"mtk1\">.</span><span class=\"mtk12\">style</span><span class=\"mtk1\">.</span><span class=\"mtk12\">display</span><span class=\"mtk1\"> = </span><span class=\"mtk8\">&quot;block&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  } </span><span class=\"mtk15\">else</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk3\">// Handle errors</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\">response</span><span class=\"mtk1\">.</span><span class=\"mtk12\">status</span><span class=\"mtk1\">, </span><span class=\"mtk12\">response</span><span class=\"mtk1\">.</span><span class=\"mtk12\">statusText</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>You've already produced and submitted the JWT to the user. So now it's time to put the JWT to use on the user side.</p>\n<h3 id=\"using-jwt\" style=\"position:relative;\"><a href=\"#using-jwt\" aria-label=\"using jwt 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>Using JWT</h3>\n<p>As previously stated, if the form submission is successful, you'll display a button to obtain a timestamp. This button will invoke the GET method on the <code>resource.php</code> script. The <code>resource.php</code> script will then set the JWT received after successful authentication in the authentication header.</p>\n<p>The following code will help you achieve this feat.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk12\">btnResource</span><span class=\"mtk1\">.</span><span class=\"mtk11\">addEventListener</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;click&quot;</span><span class=\"mtk1\">, </span><span class=\"mtk4\">async</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=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">result</span><span class=\"mtk1\"> = </span><span class=\"mtk15\">await</span><span class=\"mtk1\"> </span><span class=\"mtk11\">fetch</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;/resource.php&quot;</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=\"mtk12\">Authorization:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">`Bearer </span><span class=\"mtk4\">${</span><span class=\"mtk12\">storeJWT</span><span class=\"mtk1\">.</span><span class=\"mtk12\">JWT</span><span class=\"mtk4\">}</span><span class=\"mtk8\">`</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\">timeStamp</span><span class=\"mtk1\"> = </span><span class=\"mtk15\">await</span><span class=\"mtk1\"> </span><span class=\"mtk12\">result</span><span class=\"mtk1\">.</span><span class=\"mtk11\">text</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\">timeStamp</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">})</span></span></code></pre>\n<p>Once you've written this code, run the program and enter your credentials into the form fields. A GET request will be sent when you click the submit button. Here is a sample GET request to assist you in making the correct identification.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"php\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">GET /resource.php HTTP/</span><span class=\"mtk7\">1.1</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">Host: yourhost.com</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">Connection: keep-alive</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">Accept: *</span><span class=\"mtk3\">/*</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk3\">X-Requested-With: XMLHttpRequest</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk3\">Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvcWEtYXBpLndlbGx2aWJlLmNvbVwvYXBpXC9hdXRoXC9sb2dpbiIsImlhdCI6MTYzMDQ3OTA5NSwiZXhwIjoxNjMwNDgyNjk1LCJuYmYiOjE2MzA0NzkwOTUsImp0aSI6Imtsa3hHUGpMOVlNTzRSdUsiLCJzdWIiOjc3ODE4LCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3IiwidXNlcnNfaWQiOjc3ODE4LCJtZW1iZXJzX2lkIjo3Nzg4MzMsInByb3h5X3VzZXJfbWVtYmVyc19pZCI6bnVsbH0.TxXwLLu1zWBe7cLLYdFYy3P2HX4AaLgc7WfSRtTgeiI</span></span></code></pre>\n<h3 id=\"validating-jwt\" style=\"position:relative;\"><a href=\"#validating-jwt\" aria-label=\"validating jwt 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>Validating JWT</h3>\n<p>If you've followed along until here, everything should be working fine. Now, let's begin with validating the JWT.</p>\n<p>To get help with this operation, you've previously added the composer's autoloader function. You'll now use the <code>preg match</code> function to extract the token from the Bearer header. For this extraction, you'll use the <code>preg match</code> function and supply a regular expression.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"php\" data-index=\"8\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">if</span><span class=\"mtk1\"> (! </span><span class=\"mtk11\">preg_match</span><span class=\"mtk1\">(</span><span class=\"mtk5\">&#39;/Bearer</span><span class=\"mtk6\">\\s</span><span class=\"mtk5\">(</span><span class=\"mtk6\">\\S</span><span class=\"mtk1\">+</span><span class=\"mtk5\">)/&#39;</span><span class=\"mtk1\">, </span><span class=\"mtk12\">$_SERVER</span><span class=\"mtk1\">[</span><span class=\"mtk8\">&#39;HTTP_AUTHORIZATION&#39;</span><span class=\"mtk1\">], </span><span class=\"mtk12\">$matches</span><span class=\"mtk1\">)) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">header</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;HTTP/1.0 400 Bad Request&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">echo</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;Token not found in request&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">exit</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>The code above attempts to extract the token from the Bearer header. In this case, error handling is utilized. Thus if the token is not discovered, an HTTP 404 error is displayed to the user.</p>\n<p>To validate the JWT, you must first compare it to the previously created JWT.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"php\" data-index=\"9\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk12\">$jwt</span><span class=\"mtk1\"> = </span><span class=\"mtk12\">$matches</span><span class=\"mtk1\">[</span><span class=\"mtk7\">1</span><span class=\"mtk1\">];</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">if</span><span class=\"mtk1\"> (! </span><span class=\"mtk12\">$jwt</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk3\">// No token was able to be extracted from the authorization header</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">header</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;HTTP/1.0 400 Bad Request&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">exit</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>The extracted JWT is saved at the first index of the matches array. If the matching array is empty, it means no JWT was extracted. If the preceding code runs successfully, it implies that the JWT has been extracted, and you may now proceed.</p>\n<p>Decoding the received data is required for verifying a JWT. Only the secret key may be used to decode the received data. Once you've obtained the secret key, you may use the static decode function of the PHP-JWT module.</p>\n<p>The decode method requires three arguments, which are as follows.</p>\n<ul>\n<li>The JWT itself</li>\n<li>The secret key</li>\n<li>The algorithm to be used to decode the JWT</li>\n</ul>\n<p>If the decode method succeeds, you may proceed to validate the JWT. The code below will assist you in decoding and validating a JWT.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"php\" data-index=\"10\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk12\">$secret_Key</span><span class=\"mtk1\">  = </span><span class=\"mtk8\">&#39;68V0zWFrS72GbpPreidkQFLfj4v9m3Ti+DXc8OB0gcM=&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">$token</span><span class=\"mtk1\"> = </span><span class=\"mtk10\">JWT</span><span class=\"mtk1\">::</span><span class=\"mtk11\">decode</span><span class=\"mtk1\">(</span><span class=\"mtk12\">$jwt</span><span class=\"mtk1\">, </span><span class=\"mtk12\">$secret_Key</span><span class=\"mtk1\">, [</span><span class=\"mtk8\">&#39;HS512&#39;</span><span class=\"mtk1\">]);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">$now</span><span class=\"mtk1\"> = </span><span class=\"mtk4\">new</span><span class=\"mtk1\"> </span><span class=\"mtk10\">DateTimeImmutable</span><span class=\"mtk1\">();</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">$serverName</span><span class=\"mtk1\"> = </span><span class=\"mtk8\">&quot;your.domain.name&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">$token</span><span class=\"mtk1\">-&gt;</span><span class=\"mtk12\">iss</span><span class=\"mtk1\"> !== </span><span class=\"mtk12\">$serverName</span><span class=\"mtk1\"> ||</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">$token</span><span class=\"mtk1\">-&gt;</span><span class=\"mtk12\">nbf</span><span class=\"mtk1\"> &gt; </span><span class=\"mtk12\">$now</span><span class=\"mtk1\">-&gt;</span><span class=\"mtk11\">getTimestamp</span><span class=\"mtk1\">() ||</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk12\">$token</span><span class=\"mtk1\">-&gt;</span><span class=\"mtk12\">exp</span><span class=\"mtk1\"> &lt; </span><span class=\"mtk12\">$now</span><span class=\"mtk1\">-&gt;</span><span class=\"mtk11\">getTimestamp</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=\"mtk11\">header</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;HTTP/1.1 401 Unauthorized&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk15\">exit</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>This code will provide all the necessary parameters to the decode function and save the method's result. Then, to prevent unauthorized access, error handling is employed. If any of the fields in the JWT are unavailable, an HTTP 401 error indicating unauthorized access will be issued to the user.</p>\n<h2 id=\"loginradius-authentication-for-php-apps\" style=\"position:relative;\"><a href=\"#loginradius-authentication-for-php-apps\" aria-label=\"loginradius authentication for php apps 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>LoginRadius Authentication for PHP Apps</h2>\n<p>Instead of using the process discussed above, you can use <a href=\"https://accounts.loginradius.com/auth.aspx?plan=developer\">LoginRadius Identity Platform</a> to authenticate your PHP APIs quickly. You can start by referring to <a href=\"https://www.loginradius.com/developers/\">LoginRadius PHP documentation</a>.</p>\n<p>In addition, you can use <a href=\"https://www.loginradius.com/developers/\">LoginRadius PHP SDK</a>, which, in turn, simplifies signup and login for your users by eliminating the need for remembering an extra set of credentials for your app.</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've learned about JWT. Then created a PHP web application and secured it with JWT authentication.</p>\n<p>You understood how easy and important it is to secure a web application.</p>\n<p>You can <a href=\"https://github.com/LoginRadius/engineering-blog-samples/tree/master/php\">find the complete code used in this tutorial here</a>.</p>\n<p>Don't forget to try this out for your more significant projects.</p>\n<p>Finally, if you face any problems following this tutorial or have questions, please feel free to comment below. We'll respond as soon as we can to clarify your questions.</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 .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk7 { color: #B5CEA8; }\n  .dark-default-dark .mtk15 { color: #C586C0; }\n  .dark-default-dark .mtk4 { color: #569CD6; }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk8 { color: #CE9178; }\n  .dark-default-dark .mtk3 { color: #6A9955; }\n  .dark-default-dark .mtk12 { color: #9CDCFE; }\n  .dark-default-dark .mtk5 { color: #D16969; }\n  .dark-default-dark .mtk6 { color: #D7BA7D; }\n</style>","frontmatter":{"date":"December 24, 2021","updated_date":null,"description":"This tutorial helps you understand why you should secure your PHP API. Then, it helps you learn how to use JWT with Apache to secure your PHP API.","title":"How to Secure a PHP API Using JWT","tags":["PHP","JWT","Authentication"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/0d1302ecbb6ca63f354aabd22a131331/ee604/jwt.png","srcSet":"/static/0d1302ecbb6ca63f354aabd22a131331/69585/jwt.png 200w,\n/static/0d1302ecbb6ca63f354aabd22a131331/497c6/jwt.png 400w,\n/static/0d1302ecbb6ca63f354aabd22a131331/ee604/jwt.png 800w,\n/static/0d1302ecbb6ca63f354aabd22a131331/f3583/jwt.png 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Harikrishna Kundariya","github":"espark-biz","avatar":null}}}},{"node":{"excerpt":"Introduction Identity management is swiftly becoming the need of the hour in a digitally advanced world where data breaches aren’t uncommon…","fields":{"slug":"/growth/questions-to-ask-your-identity-provider-2022/"},"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>Identity management is swiftly becoming the need of the hour in a digitally advanced world where data breaches aren’t uncommon, and cyber criminals continuously explore new ways to exploit sensitive consumer information. </p>\n<p>Yes, gone are the days when online businesses collecting user information considered <a href=\"https://www.loginradius.com/blog/identity/what-is-iam/\">identity management</a> a luxury; it’s the absolute necessity of every enterprise seeking a competitive edge with the highest level of security. </p>\n<p>So, does it mean that every business on the verge of digital transformation can’t navigate their digital business success without a reliable consumer identity and access management (CIAM) solution? </p>\n<p>Unfortunately, yes!</p>\n<p>CIAM is the backbone of every mobile application or website that collects user information, providers sign-in/sign-up, and maintains user data. </p>\n<p>So, if you’re thinking about getting a CIAM solution, here are some questions that you need to ask your identity provider in 2022. </p>\n<h3 id=\"1-what-authentication-methods-does-your-ciam-offer\" style=\"position:relative;\"><a href=\"#1-what-authentication-methods-does-your-ciam-offer\" aria-label=\"1 what authentication methods does your ciam offer 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. What authentication methods does your CIAM offer?</h3>\n<p>It’s crucial to know about the number of ways a user can authenticate themselves using a CIAM solution. The more the number of authentication methods, the better and user-friendly the CIAM is. </p>\n<h3 id=\"2-do-you-have-a-passwordless-login-option\" style=\"position:relative;\"><a href=\"#2-do-you-have-a-passwordless-login-option\" aria-label=\"2 do you have a passwordless login option 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. Do you have a passwordless login option?</h3>\n<p>Enterprises are inching towards <a href=\"https://www.loginradius.com/passwordless-login/\">passwordless login</a> capabilities to enhance the user experience for their consumers. You must ensure your CIAM offers cutting-edge technology with passwordless login capabilities just like LoginRadius. </p>\n<h3 id=\"3-can-i-get-single-sign-on-sso-capabilities-in-your-ciam\" style=\"position:relative;\"><a href=\"#3-can-i-get-single-sign-on-sso-capabilities-in-your-ciam\" aria-label=\"3 can i get single sign on sso capabilities in your ciam 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. Can I get single sign-on (SSO) capabilities in your CIAM?</h3>\n<p>Single Sign-On (SSO) is the most advanced way of creating a frictionless experience for clients when they switch from one application to another within a single platform. Ensure your CIAM offers SSO capabilities at no extra cost. </p>\n<h3 id=\"4-does-your-sso-provide-seamless-access-between-mobile-app-and-website\" style=\"position:relative;\"><a href=\"#4-does-your-sso-provide-seamless-access-between-mobile-app-and-website\" aria-label=\"4 does your sso provide seamless access between mobile app and 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>4. Does your SSO provide seamless access between mobile app and website?</h3>\n<p>It’s essential to ensure seamless access through SSO when a user switches from website to mobile app without the hassle of re authentication since users find it pretty annoying to authenticate themselves again and again.</p>\n<h3 id=\"5-is-your-ciam-gdpr-and-ccpa-compliant\" style=\"position:relative;\"><a href=\"#5-is-your-ciam-gdpr-and-ccpa-compliant\" aria-label=\"5 is your ciam gdpr and ccpa compliant 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. Is your CIAM GDPR and CCPA compliant?</h3>\n<p>One of the essential aspects to consider while choosing a CIAM is to ensure whether the product offers GDPR, CCPA, and other data regularization compliances or not. Using a CIAM in certain states without complying with their local <a href=\"https://www.loginradius.com/gdpr-and-privacy/\">data privacy regulations</a> could entail the enterprise for hefty fines.</p>\n<h3 id=\"6-does-your-ciam-support-third-party-integrations\" style=\"position:relative;\"><a href=\"#6-does-your-ciam-support-third-party-integrations\" aria-label=\"6 does your ciam support third party integrations 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>6. Does your CIAM support third-party integrations?</h3>\n<p>CIAM that supports third-party integration always offers a competitive advantage to an organization. Businesses can get valuable insights into user behavior and past purchase history to create better marketing strategies.  </p>\n<h3 id=\"7-what-authentication-and-authorization-security-features-your-ciam-offers\" style=\"position:relative;\"><a href=\"#7-what-authentication-and-authorization-security-features-your-ciam-offers\" aria-label=\"7 what authentication and authorization security features your ciam offers 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>7. What authentication and authorization security features your CIAM offers?</h3>\n<p>Before making a purchase, make sure you precisely examine the authentication and authorization security mechanism of your CIAM.</p>\n<h3 id=\"8-does-it-have-risk-based-authentication-rba-adaptive-authentication\" style=\"position:relative;\"><a href=\"#8-does-it-have-risk-based-authentication-rba-adaptive-authentication\" aria-label=\"8 does it have risk based authentication rba adaptive 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>8. Does it have risk-based authentication (RBA)/ adaptive authentication?</h3>\n<p>LoginRadius supports <a href=\"https://www.loginradius.com/blog/identity/risk-based-authentication/\">risk-based authentication</a> for the highest level of security. RBA, aka adaptive authentication, is a security mechanism for high-risk scenarios. Businesses collecting sensitive information regarding clients should always prefer risk-based authentication in addition to multi-factor authentication.</p>\n<h3 id=\"9-what-are-the-authentication-methods-apart-from-the-standard-password-login\" style=\"position:relative;\"><a href=\"#9-what-are-the-authentication-methods-apart-from-the-standard-password-login\" aria-label=\"9 what are the authentication methods apart from the standard password 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>9. What are the authentication methods apart from the standard password login?</h3>\n<p>Make sure your CIAM vendor offers <a href=\"https://www.loginradius.com/social-login/\">social login authentication</a>, email login authentication, and phone/email authentication for maximum convenience and security. </p>\n<h3 id=\"10-can-i-move-data-from-my-previous-identity-provider\" style=\"position:relative;\"><a href=\"#10-can-i-move-data-from-my-previous-identity-provider\" aria-label=\"10 can i move data from my previous identity provider 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>10. Can I move data from my previous identity provider?</h3>\n<p>Some CIAM vendors like LoginRadius offer data export from a previous CIAM vendor. This helps in a flawless transition from a conventional vendor to a cutting-edge new-age CIAM.</p>\n<h3 id=\"11-how-can-your-ciam-help-increase-my-companys-sales-marketing-lead-generation-and-conversions\" style=\"position:relative;\"><a href=\"#11-how-can-your-ciam-help-increase-my-companys-sales-marketing-lead-generation-and-conversions\" aria-label=\"11 how can your ciam help increase my companys sales marketing lead generation and 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>11. How can your CIAM help increase my company’s sales, marketing, lead generation, and conversions?</h3>\n<p>It’s important to learn about the features of the CIAM from a marketing and sales perspective. Your CIAM shouldn’t just provide a seamless login experience, but help improve conversion rates.  </p>\n<h3 id=\"12-do-i-need-to-purchase-different-features-separately-apart-from-the-subscription\" style=\"position:relative;\"><a href=\"#12-do-i-need-to-purchase-different-features-separately-apart-from-the-subscription\" aria-label=\"12 do i need to purchase different features separately apart from the subscription 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>12. Do I need to purchase different features separately apart from the subscription?</h3>\n<p>Ensure that you get every vital feature as a part of the standard subscription plan. </p>\n<h3 id=\"13-can-i-have-a-free-personalized-demo-of-the-product\" style=\"position:relative;\"><a href=\"#13-can-i-have-a-free-personalized-demo-of-the-product\" aria-label=\"13 can i have a free personalized demo of the product 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>13. Can I have a free personalized demo of the product?</h3>\n<p>It’s always a great idea to <a href=\"https://www.loginradius.com/book-a-demo/\">book a free personalized demo</a> before making a purchase. A customized demo helps you understand how the product works for your business since you get hands-on experience with every feature tailored for your organization. </p>\n<h3 id=\"14-what-if-i-need-to-import-previous-consumer-data-in-the-new-ciam\" style=\"position:relative;\"><a href=\"#14-what-if-i-need-to-import-previous-consumer-data-in-the-new-ciam\" aria-label=\"14 what if i need to import previous consumer data in the new ciam 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>14. What if I need to import previous consumer data in the new CIAM?</h3>\n<p>Leading CIAM vendors like LoginRadius provide you an option to import your previous consumer data like a breeze. Ensure your new CIAM vendor supports the same. </p>\n<h3 id=\"15-how-can-my-developers-benefit-from-your-ciam\" style=\"position:relative;\"><a href=\"#15-how-can-my-developers-benefit-from-your-ciam\" aria-label=\"15 how can my developers benefit from your ciam 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>15. How can my developers benefit from your CIAM?</h3>\n<p>Developers’ satisfaction regarding the product shouldn’t be ignored since they’re the backbone of the website/ application. Always choose a vendor offering transparency and total control to developers. </p>\n<h3 id=\"16-do-you-offer-multi-tenant-and-single-tenant-deployment\" style=\"position:relative;\"><a href=\"#16-do-you-offer-multi-tenant-and-single-tenant-deployment\" aria-label=\"16 do you offer multi tenant and single tenant deployment 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>16. Do you offer multi-tenant and single-tenant deployment?</h3>\n<p>Based on your cloud deployment requirement, always enquire about multi-tenant and <a href=\"https://www.loginradius.com/private-cloud/\">single-tenant cloud deployment</a> well in advance. </p>\n<h3 id=\"17-which-industries-benefit-the-most-from-your-ciam\" style=\"position:relative;\"><a href=\"#17-which-industries-benefit-the-most-from-your-ciam\" aria-label=\"17 which industries benefit the most from your ciam 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>17. Which industries benefit the most from your CIAM?</h3>\n<p>You need to ensure that your business niche market players trust the CIAM you consider. This will help you make a more intelligent choice. </p>\n<h3 id=\"18-what-is-the-up-time-of-your-data-servers\" style=\"position:relative;\"><a href=\"#18-what-is-the-up-time-of-your-data-servers\" aria-label=\"18 what is the up time of your data servers 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>18. What is the up-time of your data servers?</h3>\n<p>Don’t forget to inquire about the up-time of the servers since consumer experience is everything you need to focus on while choosing a CIAM. LoginRadius identity management solution offers <a href=\"https://www.loginradius.com/scalability/\">100% uptime</a>. </p>\n<h3 id=\"19-where-are-your-data-centers-physically-located\" style=\"position:relative;\"><a href=\"#19-where-are-your-data-centers-physically-located\" aria-label=\"19 where are your data centers physically located 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>19. Where are your data centers physically located?</h3>\n<p>It’s essential to know about the physical location of the data centers to ensure data is securely collected, managed, and saved. </p>\n<h3 id=\"20-do-you-comply-with-data-localization-for-the-different-states\" style=\"position:relative;\"><a href=\"#20-do-you-comply-with-data-localization-for-the-different-states\" aria-label=\"20 do you comply with data localization for the different states 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>20. Do you comply with data localization for the different states?</h3>\n<p>You shouldn’t miss data localization compliance in your next CIAM since data privacy and security regularizations are becoming increasingly stringent globally. </p>\n<h3 id=\"21-what-is-the-peak-load-capacity-of-your-ciam\" style=\"position:relative;\"><a href=\"#21-what-is-the-peak-load-capacity-of-your-ciam\" aria-label=\"21 what is the peak load capacity of your ciam 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>21. What is the peak load capacity of your CIAM?</h3>\n<p>The peak load capacity of the CIAM defines how good and reliable a CIAM is handling a massive number of users at once. Always choose the one offering higher peak load capacities like LoginRadius CIAM offering 180K logins/second. </p>\n<h3 id=\"22-how-many-identities-have-you-secured-till-date\" style=\"position:relative;\"><a href=\"#22-how-many-identities-have-you-secured-till-date\" aria-label=\"22 how many identities have you secured till date 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>22. How many identities have you secured till date?</h3>\n<p>Last but not least, you need to ask your vendor regarding the total number of identities that they have secured till data. Choosing the one with a higher number of secured identities could be the game-changer for your business, just like LoginRadius that has secured over 1.17 Billion identities to date. </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>Choosing a reliable CIAM isn’t a piece of cake, and organizations should strictly examine the aspects mentioned above in the form of questions that they need to ask <a href=\"https://www.loginradius.com/\">CIAM vendors</a>. </p>\n<p>However, LoginRadius offers endless possibilities and provides all the features, compliances, and capabilities mentioned above. </p>\n<p>You can choose LoginRadius as your CIAM to witness substantial business growth. Reach us for a free personalized demo today.</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":"December 21, 2021","updated_date":null,"description":"CIAM is the backbone of every mobile application or website that collects user information. So, if you’re thinking about getting a CIAM solution, here are some questions that you need to ask your identity provider in 2022.","title":"What Should You Ask Your Identity Provider in 2022","tags":null,"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.4492753623188406,"src":"/static/ae4dd8293a822f8fc63799b8bc6c184b/33aa5/id-provider.jpg","srcSet":"/static/ae4dd8293a822f8fc63799b8bc6c184b/f836f/id-provider.jpg 200w,\n/static/ae4dd8293a822f8fc63799b8bc6c184b/2244e/id-provider.jpg 400w,\n/static/ae4dd8293a822f8fc63799b8bc6c184b/33aa5/id-provider.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Yash Rathi","github":"yashrathi29","avatar":null}}}},{"node":{"excerpt":"In a modern, digitally advanced environment, business systems undergo complex interactions and communicate autonomously to execute business…","fields":{"slug":"/identity/loginradius-m2m-authorization-data-access/"},"html":"<p>In a modern, digitally advanced environment, business systems undergo complex interactions and communicate autonomously to execute business functions. </p>\n<p>Every day, millions of devices constantly gather and report data, especially concerning the Internet of Things (IoT) ecosystem, which doesn’t even require human intervention. </p>\n<p>Hence, business systems need to efficiently and securely share this data during transit to the suitable systems and issue operational instructions without room for tampering.</p>\n<p>Here’s where LoginRadius’ Machine to Machine (M2M) authorization comes into play. </p>\n<p>Machine-to-machine (M2M) authorization ensures that business systems communicate autonomously without human intervention and access the needed information through granular-level access.</p>\n<p>M2M Authorization is exclusively used for scenarios in which a business system authenticates and authorizes a service rather than a user. </p>\n<p>Let’s dig deeper into this and understand the role of M2M authorization and how it helps diverse businesses. </p>\n<h2 id=\"intent-behind-the-launch\" style=\"position:relative;\"><a href=\"#intent-behind-the-launch\" aria-label=\"intent behind the launch 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>Intent Behind the Launch</h2>\n<p>M2M Authorization is the process of providing remote systems with secure access to information. Using M2M Authorization, business systems can communicate autonomously and execute business functions based on predefined authorization.</p>\n<p>M2M apps use the Client Credentials Flow (defined in OAuth 2.0 RFC 6749), in which they pass along secure credentials to authenticate themselves and receive an <a href=\"https://www.loginradius.com/blog/identity/pros-cons-token-authentication/\">authorization token</a>.</p>\n<p>LoginRadius understands the risks associated with data transfers, especially in cases where millions of interconnected applications and devices contact each other to gain access to specific resources or devices. This access requires a robust authorization mechanism. </p>\n<p>Machine-to-machine authorization from LoginRadius acts as a game-changer for the business that requires frequent autonomous interactions. </p>\n<h2 id=\"how-does-it-work\" style=\"position:relative;\"><a href=\"#how-does-it-work\" aria-label=\"how does it work 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 does it Work?</h2>\n<p>Services require authorization while saving and reading the data to and from the storage as a part of standard process and security measures. Businesses can use LoginRadius for autonomous authorization by creating two dedicated M2M apps with write and read permissions.</p>\n<p>For each M2M application, LoginRadius issues secure credentials, and services automatically get the authorization token from LoginRadius using these <a href=\"https://www.loginradius.com/blog/identity/login-security/\">secure credentials</a> to perform read or write operations. </p>\n<p><a href=\"https://www.loginradius.com/resource/m-to-m-authorization-\"><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,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABn0lEQVQY01XOzWoTURjG8amT+WobJ5lkmpnJdJImmYyZNpqYD1uL7aLqWimldKNIEdooQhFX4u3oSl1YwYIgXYhegCDUTxBcWCKhvYC/J8nKA8/ivLzvj0cyqssY4WX08iWMUpfJcgdjri3Swig00IILqLN1VH8exY3QxCxVX8Es1lHEXHZCEtkCiUyAbPlIQ2wYy484a86gTabRDZMpM0cqVyIZLKD4C6j5GMURYLGJ171OtLiGVruCHJwfYf+BemWJbL6CM+NhZz1UNUWitIZSW8cImgIU7bwY3Y9x4i65qEU2bOJWG7jRRaZFmTNpfwzqlcVxQ7eMmbTI5AqYfpPMcg9rZY9ktCra1QRYw5idx446uAL14g7OuRZ22GA6Xx1hcjo/bLhEotjm2cvX9I+POfrylW/ff/Lj12/+/D1h9eYtJDtEMgN2Hz3h0+cjnu8f8PTFK3Gzz+H7j7x5+44pryx2nDEoBy0ODj8wfP1+n8FgwOnpyeh/beMOklViwq7QvnqDnYeP2br7gM3t+yL3uN3bY2u7h2YXmEi5/AObCM5rWlEs6wAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"DS-M2M\"\n        title=\"DS-M2M\"\n        src=\"/static/5333b92e3e9f12f1f05e1a63df46799f/e5715/DS-M2M.png\"\n        srcset=\"/static/5333b92e3e9f12f1f05e1a63df46799f/a6d36/DS-M2M.png 650w,\n/static/5333b92e3e9f12f1f05e1a63df46799f/e5715/DS-M2M.png 768w,\n/static/5333b92e3e9f12f1f05e1a63df46799f/81501/DS-M2M.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<p>In a nutshell, LoginRadius acts as an authorization server. </p>\n<p>Benefits of LoginRadius’ M2M Authorization</p>\n<p>M2M Authorization offers secure access to improve business efficiency and ultimately enhances customer experience. M2M provides several business benefits, including, but not limited to: </p>\n<ul>\n<li>Secure data access across multiple business systems</li>\n<li>Granular data access with predefined scopes</li>\n<li>Efficient authentication and data exchange </li>\n<li>Grant, limit, or block access permissions at any time</li>\n</ul>\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>Businesses these days require a robust <a href=\"https://www.loginradius.com/blog/identity/authentication-vs-authorization-infographic/\">authorization and authentication</a> mechanism that can carry data access requests like a breeze without hampering the overall business process. </p>\n<p>With LoginRadius M2M authorization, businesses can ensure a secure and reliable method of autonomous interactions since it aids business systems to achieve efficiency and, at the same time, eliminates the need for human intervention. </p>\n<p>LoginRadius M2M helps businesses to provide flexible machine-to-machine communication while ensuring granular access, authorization, and security requirements are enforced.</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,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeElEQVQY001RuU4CURSdODrMACJgKFQiEGXfXUBg2AZnQKKIiQVqpbGhsLGg0MTCGENiYeEHGC2JVi6NsbQwNhb+z/G+GUwsTt5y3zvLvZwpIMORqsOdXYcYUcDOYqAIyV+AFDAg6ntZv7PEanBmWphM1GCO1iCFKzCzGvtHdU5/HKlCiiqQ4irsSRXWhAoxWNLJx/xF4zGB9yzDRKLTlQ6C1W3w6RZGwjXw3gxM84Yo96dsCpXJqQZbpAx7rApzbBW2pIaplRZG/TJcKRW59gHSa3tYaOwi1Riu9R1kN/fhLbQgzOXI4ZCQOXKQO2dcgZPiSHENjnQDPnkLQrAMa6iICRJypTW6a8OT28AsYSbT1A2Mh8v/IhMp+yTGWGTNiMxikohAzi2hEjj3Io7OrvD5/YP7x1fcPbzgdvCE948vDJ7fiFQhh3mKPIzrWmpigoYjEInumg3Eb4A1nfdloXS66F3eoHvaN3DSx/H5NQ57F9SqCvUxj1/TksOl/PGdLwAAAABJRU5ErkJggg=='); 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/a854d948ee1cb58ffca614fbff39f749/e5715/BD-Developers2-1024x310.png\"\n        srcset=\"/static/a854d948ee1cb58ffca614fbff39f749/a6d36/BD-Developers2-1024x310.png 650w,\n/static/a854d948ee1cb58ffca614fbff39f749/e5715/BD-Developers2-1024x310.png 768w,\n/static/a854d948ee1cb58ffca614fbff39f749/2bef9/BD-Developers2-1024x310.png 1024w\"\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":"December 15, 2021","updated_date":null,"description":"Machine to Machine (M2M) authorization ensures that business systems communicate autonomously without human intervention and access the needed information securely and reliably.","title":"LoginRadius Launches M2M Authorization for Seamless Business Operations","tags":["industry-news","authorization","authentication"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7699115044247788,"src":"/static/f118b3f7ee6801914b66c5a2e8352b5a/14b42/m2m-cover.jpg","srcSet":"/static/f118b3f7ee6801914b66c5a2e8352b5a/f836f/m2m-cover.jpg 200w,\n/static/f118b3f7ee6801914b66c5a2e8352b5a/2244e/m2m-cover.jpg 400w,\n/static/f118b3f7ee6801914b66c5a2e8352b5a/14b42/m2m-cover.jpg 800w,\n/static/f118b3f7ee6801914b66c5a2e8352b5a/16310/m2m-cover.jpg 1024w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}}]},"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":324,"currentPage":55,"type":"///","numPages":161,"pinned":"ee8a4479-3471-53b1-bf62-d0d8dc3faaeb"}},"staticQueryHashes":["1171199041","1384082988","2100481360","23180105","528864852"]}