{"componentChunkName":"component---src-templates-blog-list-template-js","path":"/113","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"excerpt":"What is PGP? PGP (Pretty Good Privacy) is a cryptographic process used to encrypt and decrypt information. It combines concepts from…","fields":{"slug":"/engineering/using-pgp-encryption-with-nodejs/"},"html":"<h2 id=\"what-is-pgp\" style=\"position:relative;\"><a href=\"#what-is-pgp\" aria-label=\"what is pgp 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 PGP?</h2>\n<p>PGP (Pretty Good Privacy) is a cryptographic process used to encrypt and decrypt information. It combines concepts from symmetric and asymmetric key encryption, maintaining some of the best security and usability aspects of both.</p>\n<p>One way PGP can be used is to protect the confidentiality of information. Once the information is encrypted, nobody will be able to decrypt it unless they have the right key. In practice, PGP is commonly used in sending and receiving emails, sharing information on the Dark Web, and others. This is because both on and off the Internet, there are ways to intercept information being sent, making encryption using PGP or similar critical.</p>\n<p>On a high-level the process between a sender and receiver looks like this:</p>\n<ol>\n<li>The recipient generates public and private keys.</li>\n<li>The recipient sends its public key to the sender.</li>\n<li>The sender encrypts the message using the given public key.</li>\n<li>The sender sends the encrypted message to the recipient.</li>\n<li>The recipient decrypts the message using its private key.</li>\n</ol>\n<h2 id=\"pgp-examples-in-nodejs\" style=\"position:relative;\"><a href=\"#pgp-examples-in-nodejs\" aria-label=\"pgp examples in nodejs 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>PGP Examples in Node.js</h2>\n<p>Now, let's go over some examples in Node.js using the <a href=\"https://www.npmjs.com/package/openpgp\">openpgp library</a>.</p>\n<ul>\n<li>OpenPGP is a protocol that defines the standards for PGP. OpenPGP.js implements the OpenPGP protocol in JavaScript.</li>\n</ul>\n<p>We'll go over some basic examples and show how to encrypt &#x26; decrypt large files using Node.js streams.</p>\n<p>First, set up your Node.js project and install openpgp.js:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">mkdir pgp-tutorial && cd pgp-tutorial && npm init</span>\n<span class=\"grvsc-line\">npm i openpgp --save</span></code></pre>\n<p>Note: examples use openpgp v4.10.8</p>\n<h3 id=\"generating-keys\" style=\"position:relative;\"><a href=\"#generating-keys\" aria-label=\"generating keys 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>Generating keys</h3>\n<p>When generating private and public PGP keys with OpenPGP, you can define which curve to use in Elliptic-curve cryptography. In this example, we use Ed25519 for its performance and small key size. For the full list of curves, you can choose from, refer to OpenPGP.js docs.</p>\n<p>You also need to define a passphrase used to decrypt files and the private key. In practice, this should be a strong, randomized secret generated for a single-use.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">// generate-keys.js</span>\n<span class=\"grvsc-line\">const openpgp = require(&quot;openpgp&quot;);</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">generate();</span>\n<span class=\"grvsc-line\">async function generate() {</span>\n<span class=\"grvsc-line\">  const { privateKeyArmored, publicKeyArmored } = await openpgp.generateKey({</span>\n<span class=\"grvsc-line\">    userIds: [{ name: &quot;person&quot;, email: &quot;person@somebody.com&quot; }],</span>\n<span class=\"grvsc-line\">    curve: &quot;ed25519&quot;,</span>\n<span class=\"grvsc-line\">    passphrase: &quot;qwerty&quot;,</span>\n<span class=\"grvsc-line\">  });</span>\n<span class=\"grvsc-line\">  console.log(privateKeyArmored);</span>\n<span class=\"grvsc-line\">  console.log(publicKeyArmored);</span>\n<span class=\"grvsc-line\">}</span></code></pre>\n<p>Running the above gives us our private key:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">-----BEGIN PGP PRIVATE KEY BLOCK-----</span>\n<span class=\"grvsc-line\">Version: OpenPGP.js v4.10.8</span>\n<span class=\"grvsc-line\">Comment: https://openpgpjs.org</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">xYYEX6iKVxYJKwYBBAHaRw8BAQdANJ6JIXuMMZV3NIlwq0POS7xsF2N7+kAE</span>\n<span class=\"grvsc-line\">7KQjAtfIuqj+CQMI4CUgW9jPsGPgJvQnnCWFf1s7lO/5+D5ZQ9JK25fUtmQo</span>\n<span class=\"grvsc-line\">WyHX0Ja1ryOoFnvq7u+7fUC0+RAzt8S1xv3eDzazfgNuLtEmufwMyR6wMi78</span>\n<span class=\"grvsc-line\">Kc0ccGVyc29uIDxwZXJzb25Ac29tZWJvZHkuY29tPsKPBBAWCgAgBQJfqIpX</span>\n<span class=\"grvsc-line\">BgsJBwgDAgQVCAoCBBYCAQACGQECGwMCHgEAIQkQVrbGpNEnCPUWIQQb8YRJ</span>\n<span class=\"grvsc-line\">hw7DjekU68lWtsak0ScI9UM7AQDv4YRbIdU2ErPf8MobreeLiXXjYZ6fas8E</span>\n<span class=\"grvsc-line\">zW0KoTZWEQD+NHDY2YYByMF1mWusPkdPDpyBzqMJrlMeihMzZ+PE8AfHiwRf</span>\n<span class=\"grvsc-line\">qIpXEgorBgEEAZdVAQUBAQdARY37/Vys4Sj6DvwN6TRjxrIqiMIngxQgvOb6</span>\n<span class=\"grvsc-line\">wi+tQzEDAQgH/gkDCJ2xNZ1OXxv94E8fTLQ3gYHFQuebn/PSijD8CqlvHNB/</span>\n<span class=\"grvsc-line\">/Z9sIxSFt7rzorW+9v6Awfe+pQwXW5iEyJkdiGu3BM91GMwMvMmZ+rBNlBvq</span>\n<span class=\"grvsc-line\">iX7CeAQYFggACQUCX6iKVwIbDAAhCRBWtsak0ScI9RYhBBvxhEmHDsON6RTr</span>\n<span class=\"grvsc-line\">yVa2xqTRJwj17W0BAI5MuCWHrqjSRcdjLTwxa++jYv+Yxq4tODj8oh27T86v</span>\n<span class=\"grvsc-line\">AQCfb3lij9JGlIMNDQgceeougl+Lw4Gb0kQCnsNQRggTDw==</span>\n<span class=\"grvsc-line\">=yzT4</span>\n<span class=\"grvsc-line\">-----END PGP PRIVATE KEY BLOCK-----</span></code></pre>\n<p>And the public key:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">-----BEGIN PGP PUBLIC KEY BLOCK-----</span>\n<span class=\"grvsc-line\">Version: OpenPGP.js v4.10.8</span>\n<span class=\"grvsc-line\">Comment: https://openpgpjs.org</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">xjMEX6iKVxYJKwYBBAHaRw8BAQdANJ6JIXuMMZV3NIlwq0POS7xsF2N7+kAE</span>\n<span class=\"grvsc-line\">7KQjAtfIuqjNHHBlcnNvbiA8cGVyc29uQHNvbWVib2R5LmNvbT7CjwQQFgoA</span>\n<span class=\"grvsc-line\">IAUCX6iKVwYLCQcIAwIEFQgKAgQWAgEAAhkBAhsDAh4BACEJEFa2xqTRJwj1</span>\n<span class=\"grvsc-line\">FiEEG/GESYcOw43pFOvJVrbGpNEnCPVDOwEA7+GEWyHVNhKz3/DKG63ni4l1</span>\n<span class=\"grvsc-line\">42Gen2rPBM1tCqE2VhEA/jRw2NmGAcjBdZlrrD5HTw6cgc6jCa5THooTM2fj</span>\n<span class=\"grvsc-line\">xPAHzjgEX6iKVxIKKwYBBAGXVQEFAQEHQEWN+/1crOEo+g78Dek0Y8ayKojC</span>\n<span class=\"grvsc-line\">J4MUILzm+sIvrUMxAwEIB8J4BBgWCAAJBQJfqIpXAhsMACEJEFa2xqTRJwj1</span>\n<span class=\"grvsc-line\">FiEEG/GESYcOw43pFOvJVrbGpNEnCPXtbQEAjky4JYeuqNJFx2MtPDFr76Ni</span>\n<span class=\"grvsc-line\">/5jGri04OPyiHbtPzq8BAJ9veWKP0kaUgw0NCBx56i6CX4vDgZvSRAKew1BG</span>\n<span class=\"grvsc-line\">CBMP</span>\n<span class=\"grvsc-line\">=C6S6</span>\n<span class=\"grvsc-line\">-----END PGP PUBLIC KEY BLOCK-----</span></code></pre>\n<h3 id=\"file-encryption\" style=\"position:relative;\"><a href=\"#file-encryption\" aria-label=\"file encryption 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>File Encryption</h3>\n<p>Now we can start encrypting information.</p>\n<p>Create a text file:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">echo &#39;This file contains secret information&#39; &gt; secrets.txt</span></code></pre>\n<p>Here, we act as the sender who received a public key from the intended recipient. We use their public key to encrypt the confidential information:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">// encrypt-file.js</span>\n<span class=\"grvsc-line\">const openpgp = require(&quot;openpgp&quot;);</span>\n<span class=\"grvsc-line\">const fs = require(&quot;fs&quot;);</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">const publicKeyArmored = &lt;PUBLIC KEY GIVEN BY RECIPIENT&gt;</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">encrypt();</span>\n<span class=\"grvsc-line\">async function encrypt() {</span>\n<span class=\"grvsc-line\">  const plainData = fs.readFileSync(&quot;secrets.txt&quot;);</span>\n<span class=\"grvsc-line\">  const encrypted = await openpgp.encrypt({</span>\n<span class=\"grvsc-line\">    message: openpgp.message.fromText(plainData),</span>\n<span class=\"grvsc-line\">    publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys,</span>\n<span class=\"grvsc-line\">  });</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">  fs.writeFileSync(&quot;encrypted-secrets.txt&quot;, encrypted.data);</span>\n<span class=\"grvsc-line\">}</span></code></pre>\n<p>In the newly created <code>encrypted-secrets.txt</code> file, we have the contents encrypted like so:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">-----BEGIN PGP MESSAGE-----</span>\n<span class=\"grvsc-line\">Version: OpenPGP.js v4.10.8</span>\n<span class=\"grvsc-line\">Comment: https://openpgpjs.org</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">wV4DUsPKVnc3UHMSAQdAey4TJiEOrZQIrx6q2zBLgmPkbnhPMt1WR+jCWX5x</span>\n<span class=\"grvsc-line\">Gn8wEim8W4OhDVMwfhtgVIClBCGPhvdeZ1zvVUAJGDdl8+S+DUynKhPNcN8m</span>\n<span class=\"grvsc-line\">Kb9TRGYs0sAlAaXcTChBHSS5kDHV/8Hgjcn0OIs6v2mbCkz/bHs/shwf8WMI</span>\n<span class=\"grvsc-line\">ov711iEkgcXnXIX+ZDGyDFnAKftoygzAf0aZy82g7ejAD9SX13wNmO6TK8Gw</span>\n<span class=\"grvsc-line\">wr9Xj8F6XBV0yHvdsm2uzRY9W03tTSqAf0anEs+ZWyVR/ha9ddnZJPFKtUbC</span>\n<span class=\"grvsc-line\">BEF4AMavsIN0CcqpA4q69I3E6GEtkAzgBWfJOOO8mQsNQ1vJWcJocinryBE6</span>\n<span class=\"grvsc-line\">Kbhznoe+R69qmUaJXPpe5scF6tfCYuQtPz4uhOljT+OUP6qss5Nz4zBs4JLq</span>\n<span class=\"grvsc-line\">nUlyynLLSSgdVr4Hvg==</span>\n<span class=\"grvsc-line\">=5tyF</span>\n<span class=\"grvsc-line\">-----END PGP MESSAGE-----</span></code></pre>\n<p>Now, as the sender, we can send the encrypted file to the recipient.</p>\n<h3 id=\"file-decryption\" style=\"position:relative;\"><a href=\"#file-decryption\" aria-label=\"file decryption 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>File Decryption</h3>\n<p>Here, we act as the reciever. To decrypt the <code>encrypted-secrets.txt</code> file, we use our private key and passphrase:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">// decrypt-file.js</span>\n<span class=\"grvsc-line\">const openpgp = require(&quot;openpgp&quot;);</span>\n<span class=\"grvsc-line\">const fs = require(&quot;fs&quot;);</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">const privateKeyArmored = &lt;PRIVATE KEY&gt;</span>\n<span class=\"grvsc-line\">const passphrase = &lt;PASS PHRASE&gt;;</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">decrypt();</span>\n<span class=\"grvsc-line\">async function decrypt() {</span>\n<span class=\"grvsc-line\">  const privateKey = (await openpgp.key.readArmored([privateKeyArmored])).keys[0];</span>\n<span class=\"grvsc-line\">  await privateKey.decrypt(passphrase);</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">  const encryptedData = fs.readFileSync(&quot;encrypted-secrets.txt&quot;);</span>\n<span class=\"grvsc-line\">  const decrypted = await openpgp.decrypt({</span>\n<span class=\"grvsc-line\">    message: await openpgp.message.readArmored(encryptedData),</span>\n<span class=\"grvsc-line\">    privateKeys: [privateKey],</span>\n<span class=\"grvsc-line\">  });</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">  console.log(decrypted.data);</span>\n<span class=\"grvsc-line\">}</span></code></pre>\n<p>Which logs the decrypted file contents:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"8\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">This file contains secret information.</span></code></pre>\n<h3 id=\"using-streams-for-large-files\" style=\"position:relative;\"><a href=\"#using-streams-for-large-files\" aria-label=\"using streams for large files 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 Streams for Large Files</h3>\n<p>If you plan on encrypting or decrypting large files, you won't be able to fit the entire file contents in memory. In this case, you can use Node.js streams.</p>\n<p>Here, we encrypt a large file called <code>dataset-1mill.json</code> using streams:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"9\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">encrypt();</span>\n<span class=\"grvsc-line\">async function encrypt() {</span>\n<span class=\"grvsc-line\">  const encrypted = await openpgp.encrypt({</span>\n<span class=\"grvsc-line\">    message: openpgp.message.fromText(fs.createReadStream(&quot;dataset-1mill.json&quot;)),</span>\n<span class=\"grvsc-line\">    publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys,</span>\n<span class=\"grvsc-line\">  });</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">  let readStream = encrypted.data;</span>\n<span class=\"grvsc-line\">  let writeStream = fs.createWriteStream(&quot;encrypted-dataset.txt&quot;, { flags: &quot;a&quot; });</span>\n<span class=\"grvsc-line\">  readStream.pipe(writeStream);</span>\n<span class=\"grvsc-line\">  readStream.on(&quot;end&quot;, () =&gt; console.log(&quot;done!&quot;));</span>\n<span class=\"grvsc-line\">}</span></code></pre>\n<p>And then, we decrypt the newly created <code>encrypted-dataset.txt</code> using streams:</p>\n<ul>\n<li>Notice that we set the flag allow<em>unauthenticated</em>stream to true, which allows streaming data before the message integrity has been checked. This is because, in our case, our OpenPGP message only has a single integrity tag at the end. This means the entire message gets loaded into memory, and we get a heap out of memory error since our file is too large to fit into memory at once.</li>\n</ul>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"10\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">openpgp.config.allow_unauthenticated_stream = true;</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">decrypt();</span>\n<span class=\"grvsc-line\">async function decrypt() {</span>\n<span class=\"grvsc-line\">  const privateKey = (await openpgp.key.readArmored([privateKeyArmored])).keys[0];</span>\n<span class=\"grvsc-line\">  await privateKey.decrypt(passphrase);</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">  const decrypted = await openpgp.decrypt({</span>\n<span class=\"grvsc-line\">    message: await openpgp.message.readArmored(fs.createReadStream(&quot;encrypted-dataset.txt&quot;)),</span>\n<span class=\"grvsc-line\">    privateKeys: [privateKey],</span>\n<span class=\"grvsc-line\">  });</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">  let readStream = decrypted.data;</span>\n<span class=\"grvsc-line\">  let writeStream = fs.createWriteStream(&quot;decrypted-dataset.json&quot;, { flags: &quot;a&quot; });</span>\n<span class=\"grvsc-line\">  readStream.pipe(writeStream);</span>\n<span class=\"grvsc-line\">  readStream.on(&quot;end&quot;, () =&gt; console.log(&quot;done!&quot;));</span>\n<span class=\"grvsc-line\">}</span></code></pre>\n<p>Now, <code>decrypted-dataset.json</code> will have the same contents as our original <code>dataset-1mill.json</code> file.</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":"November 10, 2020","updated_date":null,"description":"Starter guide on Pretty Good Privacy(PGP) with Nodejs. PGP, a cryptographic process used to encrypt and decrypt information.","title":"Using PGP Encryption with Nodejs","tags":["Security","NodeJs","Encryption"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7699115044247788,"src":"/static/17b7404342f677f5ecd47557fd49ab6f/58556/cover.webp","srcSet":"/static/17b7404342f677f5ecd47557fd49ab6f/61e93/cover.webp 200w,\n/static/17b7404342f677f5ecd47557fd49ab6f/1f5c5/cover.webp 400w,\n/static/17b7404342f677f5ecd47557fd49ab6f/58556/cover.webp 800w,\n/static/17b7404342f677f5ecd47557fd49ab6f/54d25/cover.webp 1080w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Andy Yeung","github":null,"avatar":null}}}},{"node":{"excerpt":"Python is a general-purpose programming language and has overtaken Java in popularity according to a recent Stackoverflow survey.  People…","fields":{"slug":"/engineering/python-basics-in-minutes/"},"html":"<p>Python is a general-purpose programming language and has overtaken Java in popularity according to a recent Stackoverflow survey. </p>\n<p>People who have never programmed before are tempted to try due to the simplicity to learn and use it. Well, let's get down to business.</p>\n<h2 id=\"before-we-get-started\" style=\"position:relative;\"><a href=\"#before-we-get-started\" aria-label=\"before we get started 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>Before we get started</h2>\n<p>Before we get started, there are a few things you should know about python:</p>\n<ul>\n<li>Python is a high-level programming language, which means it has a strong abstraction from the computer's details (that's why it's so easy and understandable). Because of that, it may be not so efficient as other languages like assembly, C, or C++;</li>\n<li>Python is an interpreted language. Its syntax is read and then executed directly. The interpreter reads each program statement, following the program flow, then decides what to do and does it. That's why you should test all your programs, even if everything seems to be working correctly. If there is an error within a loop, for example, it will only be shown if the loop is executed;</li>\n<li>Python has excellent documentation <a href=\"https://docs.python.org/3/\">that you can access here</a> and an incredible community. Use them.</li>\n</ul>\n<h2 id=\"print-function\" style=\"position:relative;\"><a href=\"#print-function\" aria-label=\"print function 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>Print function</h2>\n<p><em>We are assuming that you have already installed python. If you do not, please click <a href=\"https://www.python.org/downloads/\">here</a>.</em></p>\n<p>To write your first Python code, open your text editor and type: </p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">print(&quot;Hello world, this is my first python code&quot;)</span></code></pre>\n<p>Save the file as <code>helloworld.py</code> and put it into the python interpreter to be executed.\nYou also can run your code on the command line:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">C:\\Users\\Your Name&gt;python helloworld.py</span></code></pre>\n<p>If everything went well, you should see something like this:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">&gt; Hello world, this is my first python code</span></code></pre>\n<p>You can also use the print function to show integers, variables, lists, etc. Try it!</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"python\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk3\">#show the sum of two integers</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">number1 = </span><span class=\"mtk7\">5</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">number2 = </span><span class=\"mtk7\">7</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk11\">print</span><span class=\"mtk1\">(number1+number2)</span></span></code></pre>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"python\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk3\">#dividing two decimals</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">number1 = </span><span class=\"mtk10\">float</span><span class=\"mtk1\">(</span><span class=\"mtk7\">12.1</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">number2 = </span><span class=\"mtk10\">float</span><span class=\"mtk1\">(</span><span class=\"mtk7\">4</span><span class=\"mtk1\">)</span></span></code></pre>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"python\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk3\">#concatenating strings</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">name = </span><span class=\"mtk8\">&quot;Python&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">phrase = </span><span class=\"mtk10\">str</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;I hate &quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk11\">print</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;I love &quot;</span><span class=\"mtk1\">, name)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk11\">print</span><span class=\"mtk1\">(phrase+name)</span></span></code></pre>\n<h2 id=\"data-types\" style=\"position:relative;\"><a href=\"#data-types\" aria-label=\"data types 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>Data Types</h2>\n<p>Python has the following data types built-in by default, in these categories:</p>\n<ul>\n<li>Text Type:\t<code>str</code> <em>(string)</em></li>\n<li>Numeric Types:\t<code>int</code> <em>(integer)</em>, <code>float</code> <em>(decimal)</em>, <code>complex</code></li>\n<li>Sequence Types:\t<code>list</code>, <code>tuple</code>, <code>range</code></li>\n<li>Mapping Type:\t<code>dict</code></li>\n<li>Set Types:\t<code>set</code>, <code>frozenset</code></li>\n<li>Boolean Type:\t<code>bool</code></li>\n<li>Binary Types:\t<code>bytes</code>, <code>bytearray</code>, <code>memoryview</code></li>\n</ul>\n<blockquote>\n<p><strong>Note:</strong> Variables in Python are interpreted as integers by default. Is a good practice to declare them as another type <em>explicitly</em> (if they aren't integers). You can see the kind of a variable using the function <code>type()</code>.</p>\n</blockquote>\n<h2 id=\"python-operators\" style=\"position:relative;\"><a href=\"#python-operators\" aria-label=\"python operators 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>Python Operators</h2>\n<p>Operators are used to performing operations on variables and values.\nThe main groups are:</p>\n<ul>\n<li>Arithmetic operators</li>\n<li>Comparison operators</li>\n<li>Logical operators</li>\n</ul>\n<h3 id=\"arithmetic-operators\" style=\"position:relative;\"><a href=\"#arithmetic-operators\" aria-label=\"arithmetic operators 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>Arithmetic operators</h3>\n<p><em>Arithmetic operators are used with numeric values to perform common mathematical operations.</em></p>\n<ul>\n<li><strong>Addition</strong>:\t<code>x + y</code></li>\n<li><strong>Subtraction:</strong> <code>x - y</code></li>\n<li><strong>Multiplication:</strong> <code>x * y</code></li>\n<li><strong>Division:</strong> <code>x / y</code></li>\n<li><strong>Modulus:</strong> <code>x % y</code>\t</li>\n<li><strong>Exponentiation:</strong> <code>x ** y</code>\t</li>\n<li><strong>Floor division:</strong> <code>x // y</code></li>\n</ul>\n<h3 id=\"comparison-operators\" style=\"position:relative;\"><a href=\"#comparison-operators\" aria-label=\"comparison operators 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>Comparison operators</h3>\n<p><em>Comparison operators are used to compare two values.</em></p>\n<ul>\n<li><strong>Equal:</strong> <code>x == y</code></li>\n<li><strong>Not equal:</strong> <code>x != y</code></li>\n<li><strong>Greater than:</strong> <code>x > y</code></li>\n<li><strong>Less than:</strong> <code>x &#x3C; y</code>\t</li>\n<li><strong>Greater than or equal to:</strong> <code>x >= y</code></li>\n<li><strong>Less than or equal to:</strong>\t<code>x &#x3C;= y</code></li>\n</ul>\n<h3 id=\"logical-operators\" style=\"position:relative;\"><a href=\"#logical-operators\" aria-label=\"logical operators 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>Logical operators</h3>\n<p><em>Logical operators are used to combine conditional statements.</em></p>\n<ul>\n<li><strong>and</strong> -> Returns True if both statements are true\n<code>x &#x3C; 2 and x &#x3C; 4</code></li>\n<li><strong>or</strong> ->\tReturns True if one of the statements is true\n<code>x &#x3C; 10 or x &#x3C; 9</code></li>\n<li><strong>not</strong> -> Reverse the result, returns False if the result is true\n<code>not(x &#x3C; 2 and x &#x3C; 4)</code></li>\n</ul>\n<h2 id=\"if-statement\" style=\"position:relative;\"><a href=\"#if-statement\" aria-label=\"if statement 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>If statement</h2>\n<p>Look to the code below:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"python\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">age = </span><span class=\"mtk7\">18</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">if</span><span class=\"mtk1\"> (age&lt;</span><span class=\"mtk7\">21</span><span class=\"mtk1\">):</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">print</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;The student is underage!&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">elif</span><span class=\"mtk1\"> (age==</span><span class=\"mtk7\">21</span><span class=\"mtk1\">):</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">print</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;The student is 21!&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">else</span><span class=\"mtk1\">:</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">print</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;The student isn&#39;t underage!&quot;</span><span class=\"mtk1\">)</span></span></code></pre>\n<p>In programming, we often have to choose what to do depending on the situation. It is essential to know how to use conditional arguments like <code>if</code>and <code>else</code>.\nThe code above print a different message according to a condition.</p>\n<p>Try to write a code that asks for two test scores. If the average is less than 7, the user should see \"I'm sorry, you didn't do well on the tests\". If the average is exactly 7, the user should see \"You did it!\". And if it is greater than 7, the user should see \"Congratulations!! You're a great student.\".</p>\n<blockquote>\n<p><strong>Note:</strong> to request a response from the user, you need to use the <code>input()</code> function. For example:</p>\n</blockquote>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"python\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">name = </span><span class=\"mtk10\">str</span><span class=\"mtk1\">(</span><span class=\"mtk11\">input</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;What&#39;s your name?&quot;</span><span class=\"mtk1\">))</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">age = </span><span class=\"mtk10\">int</span><span class=\"mtk1\">(</span><span class=\"mtk11\">input</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;How old are you? &quot;</span><span class=\"mtk1\">))</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk11\">print</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;I&#39;m </span><span class=\"mtk4\">%s</span><span class=\"mtk8\"> and I&#39;m </span><span class=\"mtk4\">%d</span><span class=\"mtk8\">&quot;</span><span class=\"mtk1\">% (name, age))</span></span></code></pre>\n<h2 id=\"loops\" style=\"position:relative;\"><a href=\"#loops\" aria-label=\"loops 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>Loops</h2>\n<p>Python has two primitive loop commands: <code>while</code> and <code>for</code>.</p>\n<h3 id=\"while-loop\" style=\"position:relative;\"><a href=\"#while-loop\" aria-label=\"while loop 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>While loop</h3>\n<p><em>With the while loop, we can execute a set of statements as long as a condition is true.</em></p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"python\" data-index=\"8\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">count = </span><span class=\"mtk7\">0</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">while</span><span class=\"mtk1\"> count &lt; </span><span class=\"mtk7\">10</span><span class=\"mtk1\">:</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">print</span><span class=\"mtk1\">(count)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    count += </span><span class=\"mtk7\">1</span><span class=\"mtk1\">    </span><span class=\"mtk3\">#this line is the same as    count = count+1</span></span></code></pre>\n<p>The code above will print count as long as count is less than 10.</p>\n<h3 id=\"for-loop\" style=\"position:relative;\"><a href=\"#for-loop\" aria-label=\"for loop 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>For loop</h3>\n<p>A for loop is used for iterating over a sequence. Using it, we can execute a set of statements, once for each item in a list, tuple, set, string, etc. For example:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"python\" data-index=\"9\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk3\">#loop through a string</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">for</span><span class=\"mtk1\"> x </span><span class=\"mtk4\">in</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&quot;banana&quot;</span><span class=\"mtk1\">:</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">print</span><span class=\"mtk1\">(x)</span></span></code></pre>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"python\" data-index=\"10\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk3\">#loop through a list of fruits</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">fruits = [</span><span class=\"mtk8\">&quot;apple&quot;</span><span class=\"mtk1\">, </span><span class=\"mtk8\">&quot;banana&quot;</span><span class=\"mtk1\">, </span><span class=\"mtk8\">&quot;melon&quot;</span><span class=\"mtk1\">]</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">for</span><span class=\"mtk1\"> x </span><span class=\"mtk4\">in</span><span class=\"mtk1\"> fruits:</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk11\">print</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;I like&quot;</span><span class=\"mtk1\">, x)</span></span></code></pre>\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>Did you understand why python became so popular? In a few minutes, you were able to learn the main concepts of this fantastic language.</p>\n<p>Please comment and share 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  .dark-default-dark .mtk3 { color: #6A9955; }\n  .dark-default-dark .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk7 { color: #B5CEA8; }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n  .dark-default-dark .mtk8 { color: #CE9178; }\n  .dark-default-dark .mtk15 { color: #C586C0; }\n  .dark-default-dark .mtk4 { color: #569CD6; }\n</style>","frontmatter":{"date":"November 06, 2020","updated_date":null,"description":"Learn the basics of Python programming lanuage (For Beginners)","title":"Python basics in minutes","tags":["Python"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/e65362be2b3196aeea5b79ea97dab3a6/58556/python.webp","srcSet":"/static/e65362be2b3196aeea5b79ea97dab3a6/61e93/python.webp 200w,\n/static/e65362be2b3196aeea5b79ea97dab3a6/1f5c5/python.webp 400w,\n/static/e65362be2b3196aeea5b79ea97dab3a6/58556/python.webp 800w,\n/static/e65362be2b3196aeea5b79ea97dab3a6/99238/python.webp 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Sara Lins","github":"saranicoly","avatar":null}}}},{"node":{"excerpt":"E-commerce security is a set of protocols that ensures safe transactions through the internet. In digital security, significant data…","fields":{"slug":"/identity/ecommerce-security/"},"html":"<p>E-commerce security is a set of protocols that ensures safe transactions through the internet. In digital security, significant data breaches have profoundly undermined trust. Consumers are comfortable making purchases through common networks. However, they require a little more convincing when it comes to sharing their credit card data with unfamiliar companies.</p>\n<p>By 2021, <a href=\"https://www.statista.com/statistics/251666/number-of-digital-buyers-worldwide/\">over 2.14 billion people worldwide</a> are expected to buy goods and services online. Increased online buying means retail data breaches will also be on the rise as point-of-sale (POS) systems, e-commerce sites and other store servers are major targets for hackers.</p>\n<p>The biggest long-term consequence of a data breach is the loss of consumer trust which will have a direct effect on sales and destroy the retailers’ credibility.</p>\n<h2 id=\"current-statistics-on-data-breach\" style=\"position:relative;\"><a href=\"#current-statistics-on-data-breach\" aria-label=\"current statistics on data breach 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>Current Statistics On Data breach </h2>\n<p>Data breach refers to a security incident in which personal information is publicly exposed or accessed without authorization. </p>\n<p>Cybercrime Magazine predicts that retail will be one of <a href=\"https://cybersecurityventures.com/cybersecurity-almanac-2019/\">the top 10 most attacked industries</a> for 2019–2022. </p>\n<p>A few recent data breaches include:</p>\n<ul>\n<li>In March 2020, Marriott announced that <a href=\"https://news.marriott.com/news/2020/03/31/marriott-international-notifies-guests-of-property-system-incident\">data of 5.2 million guests</a> have been accessed using the login credentials of two employees at a franchise property.</li>\n<li>In May 2020, low-cost airline EasyJet revealed that a \"highly-sophisticated attacker\" <a href=\"https://www.bbc.com/news/technology-52722626#:~:text=EasyJet\">stole nine million consumers' personal data</a>.</li>\n<li>A single ransomware attack at Blackbaud exposed information from at least 247 organizations that have issued their own breach notices as of September, 2020. Of the 247 organizations to issue breach notices to their consumers, only 58 have disclosed the number of individuals impacted by the breach – 6,981,091. </li>\n<li>A <a href=\"https://www.retaildive.com/news/survey-19-of-consumers-would-avoid-a-retailer-after-security-breach/425006/\">study by KPMG</a> states that 19% of consumers would completely stop shopping at a retailer after a breach and 33% would take a break from shopping there for an extended period.</li>\n</ul>\n<p>The above statistics have serious implications for online retailers, mainly when trust and consumer confidence in your brand is the only way to ensure success. </p>\n<h2 id=\"top-5-e-commerce-platforms-for-online-businesses\" style=\"position:relative;\"><a href=\"#top-5-e-commerce-platforms-for-online-businesses\" aria-label=\"top 5 e commerce platforms for online businesses 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>Top 5 E-commerce Platforms for Online Businesses</h2>\n<p>It is very difficult to find the right ecommerce platforms for online business. Factors like popularity, overall ranking, features, consumer service, pricing, and ease of use play an important role in selecting the best e-commerce platforms. </p>\n<p>Based on these factors a few e-commerce platforms are mentioned below:</p>\n<h3 id=\"shopify\" style=\"position:relative;\"><a href=\"#shopify\" aria-label=\"shopify 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>Shopify </h3>\n<p>Shopify is one of the best e-commerce sites and caters to businesses of all sizes. One of the most crucial reasons for their success is its flexibility. There are more than 2,400 apps in the Shopify App Store. It includes a built-in CMS, multiple themes for your site, a third-party marketplace and capability for a blog for your online store. Apart from the standard Shopify, Shopify Lite is for those with an existing website that needs a platform to take payments. </p>\n<h3 id=\"bigcommerce\" style=\"position:relative;\"><a href=\"#bigcommerce\" aria-label=\"bigcommerce 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>Bigcommerce</h3>\n<p>BigCommerce, as a leading open SaaS solution provides merchants sophisticated enterprise-grade functionality, customization, and performance with simplicity and ease-of-use. It has two offerings: BigCommerce Essentials (a DIY SaaS platform) and BigCommerce Enterprise (a customized experience for larger consumers). More than 800 apps in the BigCommerce app store allow you to add numerous additional capabilities to your store. Its multi-currency features allow merchants to set prices in multiple currencies and also settle in more than one currency.</p>\n<h3 id=\"magento\" style=\"position:relative;\"><a href=\"#magento\" aria-label=\"magento 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>Magento</h3>\n<p>Magento is best for small-to-medium businesses that have already established demand, as well as the time, manpower and skill to build their own site. The platform is very powerful and has a library of over 5,000 extensions. Being open source, it targets people with professional web development experience. Magneto exists in two versions: Magento Open Source and Magento Commerce.</p>\n<h3 id=\"wix\" style=\"position:relative;\"><a href=\"#wix\" aria-label=\"wix 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>Wix</h3>\n<p>Wix.com is a cloud-based website builder that allows users to create online stores through drag-and-drop tools. It has an extensive range of templates and designs that make it easy to build a compelling and functional website. Its website builder and ecommerce component is very user-friendly. It also provides a large selection of templates to fit various business needs. Wix.com’s ecommerce functionality has most of what a business would need, but doesn’t scale as well as dedicated platforms like Shopify or Magento.</p>\n<h3 id=\"woocommerce\" style=\"position:relative;\"><a href=\"#woocommerce\" aria-label=\"woocommerce 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>WooCommerce</h3>\n<p>WooCommerce is a free, open-source WordPress shopping cart plugin owned and developed by WordPress. It is suitable for small businesses that operate on a tight budget but still want a robust online store. However, you will have to separately purchase hosting, a domain name, and an SSL certificate, all of which are catered for by many of the stand-alone e-commerce platforms. WooCommerce allows unlimited products and product variants, including digital products.</p>\n<h3 id=\"appy-pies-website-builder\" style=\"position:relative;\"><a href=\"#appy-pies-website-builder\" aria-label=\"appy pies website builder 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>Appy Pie's website builder</h3>\n<p><a href=\"https://www.appypie.com/website-builder\">Appy Pie's website builder</a> tool is a versatile platform for creating websites and mobile apps without any coding skills. It offers a user-friendly interface with drag-and-drop functionality, making it easy for beginners to design professional-looking websites. The tool provides a wide range of customizable templates catering to different industries and purposes, from business websites to portfolios and online stores.</p>\n<h2 id=\"security-threats-that-e-commerce-stores-face\" style=\"position:relative;\"><a href=\"#security-threats-that-e-commerce-stores-face\" aria-label=\"security threats that e commerce stores face 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 Threats That E-Commerce Stores Face</h2>\n<p><img src=\"/bedb8378ad0bf6203fb7ec3abbee5ed0/Ecommerce-security-1.webp\"></p>\n<p>Ecommerce security for e-commerce is a must-have and consumers need to be constantly reassured about the safety measures that have been taken to mitigate a security threat. Features which an e-commerce security needs to adapt are:</p>\n<ol>\n<li><strong>Invisible security</strong> – The website works fast and returns minimal errors. The e-commerce site should implement website speed optimization, use a faster DNS provider and reduce image sizes. </li>\n<li><strong>Visible security</strong> – Trust signals are visuals and graphics that make the consumers feel safe when they shop from an online e-commerce site. Few trust signals like About us page, branding, consumer testimonials, secure payment gateways and guarantees would help.</li>\n</ol>\n<p>Both invisible and visible security help build trusting consumer relationships. </p>\n<p>Cybersecurity is a crucial feature which needs to be implemented by the e-commerce industry.  Without proper <a href=\"https://www.loginradius.com/blog/2019/10/cybersecurity-best-practices-for-enterprises/\">security practices</a> put into practice online retailers will put themselves and their consumers at high risk for data breach.  </p>\n<p>Some of the types of threats faced by e-commerce are mentioned below:</p>\n<ol>\n<li><strong>Denial of Service or Distributed Denial of Service attacks</strong></li>\n</ol>\n<p>A distributed denial-of-service (DDoS) attack occurs when multiple machines are operating together to attack the e-commerce site and server. They are flooded with malicious queries that stop the site from working properly making the website inoperable. These attacks are disruptive, costly and affect overall sales.</p>\n<ol start=\"2\">\n<li><strong>SQL injections</strong></li>\n</ol>\n<p>SQL injections are cyber-attacks used to manipulate backend databases and access information that was not intended to be displayed. They can inject rogue code into the database to data as well as delete it. </p>\n<ol start=\"3\">\n<li><strong>XSS attacks</strong></li>\n</ol>\n<p>Cross site scripting (XSS) is a type of attack in which malicious scripts are injected into the websites and web applications for the purpose of running on the end user's device. </p>\n<ol start=\"4\">\n<li><strong>Customer journey hijacking</strong></li>\n</ol>\n<p>Customer journey hijacking (CJH) is a customer-side phenomenon whereby unauthorized advertisements are injected into consumers’ browsers. The injected advertisements can include product ads, pop-ups, banners and in-text redirects. </p>\n<ol start=\"5\">\n<li><strong>Credit card frauds</strong></li>\n</ol>\n<p>Credit card fraud is the unauthorized use of a credit or debit card to make a purchase. The card numbers can be stolen from unsecured websites or can be obtained in an identity theft scheme.</p>\n<ol start=\"6\">\n<li><strong>Bad bots</strong></li>\n</ol>\n<p>Bad bots are designed to perform a variety of malicious jobs. They are capable of stealing content from the website, such as product reviews, product pricing, catalogs and so on which they publish on some other site. This affects the search engine ranking of the retailers' website. Bad bots are able to make multiple page visits within a very short span of time thus straining Web servers, which makes the site slow for genuine users.</p>\n<p><a href=\"https://www.loginradius.com/resource/how-retail-and-consumer-goods-companies-use-loginradius-identity-solution/\"><img src=\"/c95f0155d52f8dea65efe90f3ec7c41a/DS-How-Retail-Consumer-Goods-Companies.webp\" alt=\"Datasheet-How-Retail-Consumer-Goods-Companies-Use-the-LoginRadius\"></a></p>\n<h2 id=\"5-ways-e-commerce-can-keep-their-online-stores-safe-using-identity-management\" style=\"position:relative;\"><a href=\"#5-ways-e-commerce-can-keep-their-online-stores-safe-using-identity-management\" aria-label=\"5 ways e commerce can keep their online stores safe using identity management permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5 Ways E-Commerce Can Keep Their Online Stores Safe Using Identity Management</h2>\n<ol>\n<li><strong>Renew SSL certificates and ensure total PCI compliance.</strong></li>\n</ol>\n<p>SSL is the de facto standard for securing online transactions and essential to establish secure connectivity between the end-user systems and your e-commerce website. With SSL certifications in place, one can move from HTTP to HTTPS, which serves as a trust signal and prerequisite for consumers to provide their personal details and credit card information. </p>\n<p>Payment Card Industry Data Security Standard (PCI DSS or PCI) is an industry standard that ensures credit card information collected online is being transmitted and stored in a secure manner. E-commerce websites need to maintain PCI compliance. </p>\n<ol start=\"2\">\n<li><strong>Encourage your consumers to go passwordless while accessing their accounts</strong></li>\n</ol>\n<p>In the retail industry, registering or logging in without a password calls for consumer retention and loyalty. By enabling the one-touch login feature, consumers can log in with a <a href=\"https://www.loginradius.com/blog/2020/10/loginradius-launches-passwordless-login-with-magic-link-or-otp/\">magic link or OTP</a> sent to their mobile number or email id.</p>\n<ol start=\"3\">\n<li><strong>Prominently display payment trust signals and logos on your payment pages.</strong></li>\n</ol>\n<p>Prominently displaying payment trust signals and logos on payment pages shows the consumer the security measures taken by the e-commerce website. Consumer privacy is critical in e-commerce. E-commerce sites should only collect data that is useful for the purposes of fulfilling the transaction. </p>\n<ol start=\"4\">\n<li><strong>Verify card and address details to reduce the risk of fraudulent transactions</strong></li>\n</ol>\n<p>In order to risk fraudulent transactions, e-commerce websites need to verify card and address details of consumers. Usage of unique tracking numbers for every transaction helps to combat chargeback fraud. Geo-targeting can also help eliminate fraudulent transactions. </p>\n<ol start=\"5\">\n<li><strong>A secure login form to prevent credential attacks</strong></li>\n</ol>\n<p>By implementing <a href=\"https://www.loginradius.com/blog/2019/06/what-is-multi-factor-authentication/\">multi-factor authentication (MFA)</a>, retailers would be able to ensure that digital consumers can be authenticated. This method requires the consumer to provide two or more verification factors to gain access to the online account. </p>\n<h2 id=\"how-loginradius-enhances-e-commerce-security-with-its-advance-ciam-solution\" style=\"position:relative;\"><a href=\"#how-loginradius-enhances-e-commerce-security-with-its-advance-ciam-solution\" aria-label=\"how loginradius enhances e commerce security with its advance ciam solution permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How LoginRadius Enhances E-Commerce Security With Its Advance CIAM Solution </h2>\n<p><img src=\"/5573ae87df2ff632af6406f4db2f4166/Ecommerce-security-2.webp\"></p>\n<p>LoginRadius is a customer identity and access management tool that offers a seamless and secure way to access customer information – in your case, shoppers’ data. </p>\n<p>The <a href=\"https://www.loginradius.com/industry-retail-and-ecommerce/\">LoginRadius identity solution</a> provides a centralized, available, and secure identification and management of customers’ data to retailers. </p>\n<p>A few of LoginRadius solutions are mentioned below:</p>\n<ul>\n<li>Real-time ability for visitors to self-register for services</li>\n<li>Login and authenticate</li>\n<li>Enjoy a single-source view</li>\n</ul>\n<p>With LoginRadius, you can get 360-degree customer profiling, with 100% customer consent, across all touch points. This allows you to personalize marketing and loyalty programs that engage your audience. </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>Consumers want to shop with <a href=\"https://www.loginradius.com/blog/identity/loginradius-ciam-retail-ecommerce-business/\">e-commerce retailers</a> whom they can trust. When they enter their personal information, like credit card numbers or other banking details, they expect it to be well protected. By implementing proper e-commerce security safeguards, you can protect your business and consumers from online threats. </p>\n<p><a href=\"https://www.loginradius.com/contact-us?utm_source=blog&#x26;utm_medium=web&#x26;utm_campaign=ecommerce-security\"><img src=\"/8fce571f703a5970dbb1359a2fe0e51a/book-a-demo-loginradius.webp\"></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":"November 06, 2020","updated_date":null,"description":"Security for e-commerce is a series of protocols that guarantee protected internet transactions. Major data violations have significantly eroded trust in digital security. Via common networks, consumers are comfortable making purchases. However, when it comes to sharing their credit card details with new businesses, they need a little more convincing.","title":"E-commerce Security: 5 Ways to Enhance Data Protection During the Shopping Season","tags":["ecommerce security","data security","cx"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.3986013986013985,"src":"/static/55e22a56a55fa650f913014c544f8b18/176df/ecommerce-security.webp","srcSet":"/static/55e22a56a55fa650f913014c544f8b18/61e93/ecommerce-security.webp 200w,\n/static/55e22a56a55fa650f913014c544f8b18/1f5c5/ecommerce-security.webp 400w,\n/static/55e22a56a55fa650f913014c544f8b18/176df/ecommerce-security.webp 767w","sizes":"(max-width: 767px) 100vw, 767px"}}},"author":{"id":"Karl Wittig","github":null,"avatar":null}}}},{"node":{"excerpt":"What is Rest? Representational State Transfer in short-form as REST defines a set of constraints for creating Web Services.\nRest API is the…","fields":{"slug":"/engineering/rest-api-cucumber-blog/"},"html":"<h2 id=\"what-is-rest\" style=\"position:relative;\"><a href=\"#what-is-rest\" aria-label=\"what is rest 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 Rest?</h2>\n<p>Representational State Transfer in short-form as <strong>REST</strong> defines a set of constraints for creating Web Services.\nRest API is the most-used web service technology nowadays, and it's an almost meaningless description. A REST API is a way to communicate for two computer systems over HTTP, which is similar to web browsers and servers.</p>\n<h2 id=\"what-is-bdd\" style=\"position:relative;\"><a href=\"#what-is-bdd\" aria-label=\"what is bdd 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 BDD?</h2>\n<p>BDD stands for <strong>Behavior Driven Development</strong> (BDD). Nowadays, many Organizations, to get a better advantage of testing, are taking a step forward.  </p>\n<ul>\n<li>BDD allows us to create test scripts from both the developer’s and the customer’s perspective.</li>\n<li>BDD uses human-readable descriptions of software user requirements as the basis for software tests</li>\n</ul>\n<h2 id=\"what-is-cucumber\" style=\"position:relative;\"><a href=\"#what-is-cucumber\" aria-label=\"what is cucumber 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 Cucumber?</h2>\n<p>A cucumber is an approach that supports BDD. It allows you to write tests that anyone can understand, irrespective of their technical knowledge. In BDD, users (business analysts, product owners, developers, etc..). We need to first write scenarios or acceptance tests that describe the system's behavior from the customer's point of view for review and sign-off by the product owners before developers start actual development.</p>\n<h2 id=\"what-are-the-prerequisites-to-test-rest-api-using-cucumber\" style=\"position:relative;\"><a href=\"#what-are-the-prerequisites-to-test-rest-api-using-cucumber\" aria-label=\"what are the prerequisites to test rest api using cucumber 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 the Prerequisites to Test Rest API using Cucumber?</h2>\n<ul>\n<li>Java</li>\n<li>Editor (Eclipse, IntelliJ, etc..)</li>\n<li>Maven</li>\n</ul>\n<h3 id=\"steps-to-install-java\" style=\"position:relative;\"><a href=\"#steps-to-install-java\" aria-label=\"steps to install java 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>Steps to Install Java</h3>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">http://www.oracle.com/technetwork/java/javase/downloads/index.html  </span></code></pre>\n<p>Download JDK from the above link and install it\nSet the Environment Variable on System Properties </p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">Right Click on My PC -&gt; Properties -&gt; Advanced System Settings -&gt; Environment Variables -&gt; Create New -&gt; provide path of JDK</span></code></pre>\n<h3 id=\"steps-to-install-eclipse\" style=\"position:relative;\"><a href=\"#steps-to-install-eclipse\" aria-label=\"steps to install eclipse 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>Steps to Install Eclipse</h3>\n<ul>\n<li>Make Sure Java is installed on your PC.</li>\n<li>Use the below link to download Eclipse :\n<a href=\"https://eclipse.org/downloads\">Eclipse Download</a></li>\n<li>Install Eclipse on your PC </li>\n</ul>\n<p><strong>Steps to Install Maven</strong></p>\n<ul>\n<li>Use the below link to download Maven :\n<a href=\"https://maven.apache.org/download.cgi\">Maven Download</a></li>\n<li>Set the environment variable.</li>\n</ul>\n<h3 id=\"configuring-cucumber-with-maven\" style=\"position:relative;\"><a href=\"#configuring-cucumber-with-maven\" aria-label=\"configuring cucumber with maven permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Configuring Cucumber with Maven</h3>\n<ul>\n<li>\n<p>Create a Maven Project. Use below navigation.</p>\n<p><code>Open Eclipse -> File -> New -> Maven Project</code>\n</p>\n</li>\n<li>\n<p>Provide Group Id and Artifact Id and click on finish. </p>\n<p><strong>Group Id:</strong> This element indicates the organization's unique identifier or group that created the project. The groupId is one of the key identifiers of a project and is typically based on your organization's fully qualified domain name. For example, <code>com.loginradius</code>  is the designated groupId for all Maven plugins.</p>\n<p><strong>Artifact Id:</strong>  it points to the unique base name of the primary artifact generated by this project. The main or primary artifact for a project is typically a JAR file. Secondary artifacts like source bundles also use the artifactId as part of their final name.</p>\n</li>\n<li>\n<p>Open pom.xml file to add necessary dependencies </p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">&lt;dependency&gt;</span>\n<span class=\"grvsc-line\">\t&lt;groupId&gt;io.cucumber&lt;/groupId&gt;</span>\n<span class=\"grvsc-line\">\t&lt;artifactId&gt;cucumber-java&lt;/artifactId&gt;</span>\n<span class=\"grvsc-line\">\t&lt;version&gt;6.6.0&lt;/version&gt;</span>\n<span class=\"grvsc-line\">&lt;/dependency&gt;</span>\n<span class=\"grvsc-line\">&lt;dependency&gt;</span>\n<span class=\"grvsc-line\">\t&lt;groupId&gt;io.cucumber&lt;/groupId&gt;</span>\n<span class=\"grvsc-line\">\t&lt;artifactId&gt;cucumber-testng&lt;/artifactId&gt;</span>\n<span class=\"grvsc-line\">\t&lt;version&gt;6.6.0&lt;/version&gt;</span>\n<span class=\"grvsc-line\">&lt;/dependency&gt;</span>\n<span class=\"grvsc-line\">&lt;dependency&gt;</span>\n<span class=\"grvsc-line\">\t&lt;groupId&gt;io.rest-assured&lt;/groupId&gt;</span>\n<span class=\"grvsc-line\">\t&lt;artifactId&gt;rest-assured&lt;/artifactId&gt;</span>\n<span class=\"grvsc-line\">\t&lt;version&gt;4.3.0&lt;/version&gt;</span>\n<span class=\"grvsc-line\">\t&lt;scope&gt;test&lt;/scope&gt;</span>\n<span class=\"grvsc-line\">&lt;/dependency&gt;</span>\n<span class=\"grvsc-line\">&lt;dependency&gt;</span>\n<span class=\"grvsc-line\">\t&lt;groupId&gt;org.testng&lt;/groupId&gt;</span>\n<span class=\"grvsc-line\">\t&lt;artifactId&gt;testng&lt;/artifactId&gt;</span>\n<span class=\"grvsc-line\">\t&lt;version&gt;7.1.0&lt;/version&gt;</span>\n<span class=\"grvsc-line\">\t&lt;scope&gt;test&lt;/scope&gt;</span>\n<span class=\"grvsc-line\">&lt;/dependency&gt;</span></code></pre>\n</li>\n</ul>\n<p> Now we need three Important files.</p>\n<ul>\n<li>Feature file</li>\n<li>StepDefination file</li>\n<li>Runner file</li>\n</ul>\n<p> <strong>Feature File:</strong>  It's a entry point to the cucumber. We use Gherkins to write the feature file. This is the file where you will describe your descriptive language(Gherkin uses simple English). A feature file can contains a Scenario or List of Scenario. A sample Feature file is below</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">Feature: Login Functionality</span>\n<span class=\"grvsc-line\">@validLogin</span>\n<span class=\"grvsc-line\">Scenario: User Should Login With Valid Credentials </span>\n<span class=\"grvsc-line\">   Given Post Login API</span>\n<span class=\"grvsc-line\">   When Provide Valid Credential</span>\n<span class=\"grvsc-line\">   Then Status_code equals 200    </span>\n<span class=\"grvsc-line\">   And  response contains IsLogin equals &quot;true&quot;</span>\n<span class=\"grvsc-line\">@invalidLogin    </span>\n<span class=\"grvsc-line\">Scenario Outline: Email and Password Validation in Login API </span>\n<span class=\"grvsc-line\">   Given Post Login API</span>\n<span class=\"grvsc-line\">   When Provide different combinations to &quot;&lt;email&gt;&quot;&quot;&lt;password&gt;&quot;</span>\n<span class=\"grvsc-line\">   Then Status_code equals &lt;statuscode&gt;    </span>\n<span class=\"grvsc-line\">   And  response contains message equals &quot;&lt;message&gt;&quot;</span>\n<span class=\"grvsc-line\">   Examples:</span>\n<span class=\"grvsc-line\">   |email     \t\t|password    | statuscode |  message</span>\n<span class=\"grvsc-line\">   |          \t\t|            |   401      | Required email and password</span>\n<span class=\"grvsc-line\">   | abc\t  \t|            |   401      | Email format is incorrect</span>\n<span class=\"grvsc-line\">   | abc@mail7.io  \t|\t     |   401      | Required password</span>\n<span class=\"grvsc-line\">   | abc@mail7.io   \t| password   |   401      | Email and Password combination Incorrect</span></code></pre>\n<p> Save the above code as login.feature </p>\n<ul>\n<li><strong>Feature:</strong> It indicates the name of the feature under the test.</li>\n<li><strong>Description:</strong> It indicates a meaningful description of the feature (Optional).</li>\n<li><strong>scenario:</strong> scenario indicates the steps and expected outcomes for a particular test case.</li>\n<li><strong>Scenario Outline:</strong> Single scenario can be executed for multiple data sets using scenario outlines. The data is provided by a tabular structure separated by (I I).</li>\n<li><strong>Given:</strong> Prerequisite before the test steps get executed.</li>\n<li><strong>When:</strong> Specific condition which should match to execute the next step.</li>\n<li><strong>Then:</strong> What should happen if the condition mentioned in WHEN is satisfied.</li>\n<li><strong>Examples:</strong> Its a tabular format input data to pass to scenario outline.</li>\n<li><strong>&#x3C;>:</strong> anything if you write between is variable. </li>\n</ul>\n<p><strong>StepDefinition:</strong>\nNow you have your feature file ready with test scenarios defined. However, our job is not done yet. Cucumber doesn't know when should execute which part of code. So StepDefinition acts as an intermediate to your runner and feature file. It stores the mapping between each step of the scenario in the Feature file. So when you run the scenario, it will scan the stepDefination file to check matched glue.</p>\n<p><strong>How to write step definition:</strong>\nWe have a chrome extension(Tidy Gherkin) to convert your feature into a step definition.<br>\nCopy your scenario from the feature file and paste it in Tidy Gherkin and click on Java Steps; copy the Java Steps.\nCreate a new file name a StepDefinition.java and paste the Java Steps</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"java\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">package</span><span class=\"mtk1\"> com.loginradius.login</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk14\">import</span><span class=\"mtk1\"> cucumber.api.java.en.</span><span class=\"mtk14\">G</span><span class=\"mtk1\">iven;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> cucumber.api.java.en.When;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> cucumber.api.java.en.Then;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> cucumber.api.java.en.And;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> cucumber.api.junit.Cucumber;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> org.junit.runner.RunWith;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> </span><span class=\"mtk4\">static</span><span class=\"mtk1\"> io.restassured.RestAssured.given;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> </span><span class=\"mtk4\">static</span><span class=\"mtk1\"> org.testng.Assert.assertTrue;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> io.restassured.http.ContentType;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> io.restassured.response.Response;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> io.restassured.specification.RequestSpecification;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> io.restassured.RestAssured;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">public</span><span class=\"mtk1\"> </span><span class=\"mtk4\">class</span><span class=\"mtk1\"> </span><span class=\"mtk10\">StepDefinition</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk4\">private</span><span class=\"mtk1\">  </span><span class=\"mtk4\">static</span><span class=\"mtk1\">  </span><span class=\"mtk4\">final</span><span class=\"mtk1\">  </span><span class=\"mtk10\">String</span><span class=\"mtk1\">  </span><span class=\"mtk12\">BASE_URL</span><span class=\"mtk1\">  =  </span><span class=\"mtk8\">&quot;https://www.loginradius.com&quot;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk10\">String</span><span class=\"mtk1\"> </span><span class=\"mtk12\">email</span><span class=\"mtk1\"> = </span><span class=\"mtk8\">&quot;abcxyz@mail7.io;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">\tString password = &quot;</span><span class=\"mtk1\">password</span><span class=\"mtk8\">&quot;;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">\tRequestSpecification request;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">\tprivate  static  Response response;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">\tprivate  static  String  jsonString;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">    @Given(&quot;</span><span class=\"mtk10\">Post</span><span class=\"mtk1\"> </span><span class=\"mtk10\">Login</span><span class=\"mtk1\"> API</span><span class=\"mtk8\">&quot;)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">    public void post_login_api() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">\t    RestAssured.baseURI  =  BASE_URL;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">\t\trequest  =  RestAssured.given();</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">\t\trequest.header(&quot;</span><span class=\"mtk1\">Content-Type</span><span class=\"mtk8\">&quot;,  &quot;</span><span class=\"mtk1\">application/json</span><span class=\"mtk8\">&quot;);    </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">    }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">    </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">   @When(&quot;</span><span class=\"mtk10\">Provide</span><span class=\"mtk1\"> </span><span class=\"mtk10\">Valid</span><span class=\"mtk1\"> Credential</span><span class=\"mtk8\">&quot;)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">    public void provide_valid_credential() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk8\">      response  =  request.body(&quot;</span><span class=\"mtk1\">{ \\</span><span class=\"mtk8\">&quot;userName</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">:</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">&quot;</span><span class=\"mtk1\">  +  email  +  </span><span class=\"mtk8\">&quot;</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">, </span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">password</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">:</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">&quot;</span><span class=\"mtk1\">  +  password  +  </span><span class=\"mtk8\">&quot;</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">}&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t\t\t\t\t  .</span><span class=\"mtk11\">post</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;/user/login&quot;</span><span class=\"mtk1\">);\t</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=\"mtk10\">Then</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;Status_code equals {int}&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">public</span><span class=\"mtk1\"> </span><span class=\"mtk10\">void</span><span class=\"mtk1\"> </span><span class=\"mtk11\">statuscode_equals_</span><span class=\"mtk1\">(</span><span class=\"mtk10\">int</span><span class=\"mtk1\"> agr) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t    </span><span class=\"mtk12\">Assert</span><span class=\"mtk1\">.</span><span class=\"mtk11\">assertEquals</span><span class=\"mtk1\">(arg, </span><span class=\"mtk12\">response</span><span class=\"mtk1\">.</span><span class=\"mtk11\">getStatusCode</span><span class=\"mtk1\">());</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t@</span><span class=\"mtk10\">And</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;response contains IsPosted equals {string}&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">public</span><span class=\"mtk1\"> </span><span class=\"mtk10\">void</span><span class=\"mtk1\"> </span><span class=\"mtk11\">response_contains_IsPosted_equals_</span><span class=\"mtk1\">(</span><span class=\"mtk10\">String</span><span class=\"mtk1\"> message) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t    </span><span class=\"mtk12\">Assert</span><span class=\"mtk1\">.</span><span class=\"mtk11\">assertEquals</span><span class=\"mtk1\">(message, </span><span class=\"mtk11\">getJsonPath</span><span class=\"mtk1\">(response, </span><span class=\"mtk8\">&quot;IsPosted&quot;</span><span class=\"mtk1\">));</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }\t</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   @</span><span class=\"mtk10\">And</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;response contains message equals {string}&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">public</span><span class=\"mtk1\"> </span><span class=\"mtk10\">void</span><span class=\"mtk1\"> </span><span class=\"mtk11\">response_contains_equals_</span><span class=\"mtk1\">(</span><span class=\"mtk10\">String</span><span class=\"mtk1\"> message) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t    </span><span class=\"mtk12\">Assert</span><span class=\"mtk1\">.</span><span class=\"mtk11\">assertEquals</span><span class=\"mtk1\">(message, </span><span class=\"mtk11\">getJsonPath</span><span class=\"mtk1\">(response, </span><span class=\"mtk8\">&quot;message&quot;</span><span class=\"mtk1\">));</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t@</span><span class=\"mtk10\">When</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;Provide different combinations to {string}, {string}&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk4\">public</span><span class=\"mtk1\"> </span><span class=\"mtk10\">void</span><span class=\"mtk1\"> </span><span class=\"mtk11\">provide_different_combinations_to_somethingsomething</span><span class=\"mtk1\">(</span><span class=\"mtk10\">String</span><span class=\"mtk1\"> email, </span><span class=\"mtk10\">String</span><span class=\"mtk1\"> password){</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t    response = </span><span class=\"mtk12\">request</span><span class=\"mtk1\">.</span><span class=\"mtk11\">body</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;{ </span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">userName</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">:</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">&quot;</span><span class=\"mtk1\"> + email + </span><span class=\"mtk8\">&quot;</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">, </span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">password</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">:</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">&quot;</span><span class=\"mtk1\"> + password + </span><span class=\"mtk8\">&quot;</span><span class=\"mtk6\">\\&quot;</span><span class=\"mtk8\">}&quot;</span><span class=\"mtk1\">) .</span><span class=\"mtk11\">post</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;/user/login&quot;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk4\">public</span><span class=\"mtk1\"> </span><span class=\"mtk10\">String</span><span class=\"mtk1\"> </span><span class=\"mtk11\">getJsonPath</span><span class=\"mtk1\">(</span><span class=\"mtk10\">Response</span><span class=\"mtk1\"> response, </span><span class=\"mtk10\">String</span><span class=\"mtk1\"> key) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t</span><span class=\"mtk10\">String</span><span class=\"mtk1\"> </span><span class=\"mtk12\">resp</span><span class=\"mtk1\"> = </span><span class=\"mtk12\">response</span><span class=\"mtk1\">.</span><span class=\"mtk11\">asString</span><span class=\"mtk1\">();</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t</span><span class=\"mtk10\">JsonPath</span><span class=\"mtk1\"> </span><span class=\"mtk12\">js</span><span class=\"mtk1\"> = </span><span class=\"mtk15\">new</span><span class=\"mtk1\"> </span><span class=\"mtk11\">JsonPath</span><span class=\"mtk1\">(resp);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t</span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk12\">js</span><span class=\"mtk1\">.</span><span class=\"mtk11\">get</span><span class=\"mtk1\">(key).</span><span class=\"mtk11\">toString</span><span class=\"mtk1\">();</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Now we have Our Feature file and StepDefinition Ready, we need a runner file to run our Test Scenario's</p>\n<p><strong>Runner File:</strong>\nA runner will help us to run the feature file and acts as an interlink between the feature file and StepDefinition Class\nBelow is the code which will help you to run the tests</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"java\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">package</span><span class=\"mtk1\"> runner;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">import</span><span class=\"mtk1\"> io.cucumber.testng.CucumberOptions;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">@</span><span class=\"mtk10\">CucumberOptions</span><span class=\"mtk1\">(</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\tfeatures= {</span><span class=\"mtk8\">&quot;feature_files/login.feature&quot;</span><span class=\"mtk1\">},</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        glue= {</span><span class=\"mtk8\">&quot;step_definations/StepDefinitation.java&quot;</span><span class=\"mtk1\">},</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        tags= </span><span class=\"mtk8\">&quot;@validLogin&quot;</span><span class=\"mtk1\">,    </span><span class=\"mtk3\">// based on tags scenarios will run</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        monochrome=</span><span class=\"mtk4\">true</span><span class=\"mtk1\">, dryRun=</span><span class=\"mtk4\">false</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t)\t</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">public</span><span class=\"mtk1\">  </span><span class=\"mtk4\">class</span><span class=\"mtk1\">  </span><span class=\"mtk10\">TestRunner</span><span class=\"mtk1\">  {</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Now We have Feature, StepDefinition, and runner files ready, We can run the runner file to see the results.</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>Cucumber is very useful in understanding the overall testing process without having coding knowledge. Since it uses simple English to write the feature file and makes developer, QA and other stakeholders on same page before starting the actual development.</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 .mtk4 { color: #569CD6; }\n  .dark-default-dark .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk14 { color: #F44747; }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n  .dark-default-dark .mtk12 { color: #9CDCFE; }\n  .dark-default-dark .mtk8 { color: #CE9178; }\n  .dark-default-dark .mtk6 { color: #D7BA7D; }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk15 { color: #C586C0; }\n  .dark-default-dark .mtk3 { color: #6A9955; }\n</style>","frontmatter":{"date":"November 05, 2020","updated_date":null,"description":"This article is about basic overview of how to automate Rest API using Cucumber and JAVA.","title":"Automating Rest API's using Cucumber and Java","tags":["Automation","Cucumber","Rest API","Java"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/1775ed5790237a2d1ac5fbda108bc357/58556/cucumber_rest_assured.webp","srcSet":"/static/1775ed5790237a2d1ac5fbda108bc357/61e93/cucumber_rest_assured.webp 200w,\n/static/1775ed5790237a2d1ac5fbda108bc357/1f5c5/cucumber_rest_assured.webp 400w,\n/static/1775ed5790237a2d1ac5fbda108bc357/58556/cucumber_rest_assured.webp 800w,\n/static/1775ed5790237a2d1ac5fbda108bc357/99238/cucumber_rest_assured.webp 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Surendranath Reddy Birudala","github":"reddysuren","avatar":null}}}},{"node":{"excerpt":"Introduction to Arduino and its usage Arduino is an open-source community that works on both Hardware and software development. We can say…","fields":{"slug":"/engineering/bluetooth-controlled-arduino-car-miniature/"},"html":"<h2 id=\"introduction-to-arduino-and-its-usage\" style=\"position:relative;\"><a href=\"#introduction-to-arduino-and-its-usage\" aria-label=\"introduction to arduino and its usage 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 to Arduino and its usage</h2>\n<p>Arduino is an open-source community that works on both Hardware and software development. We can say that both the hardware and software help build the new segment automated devices like e.g., 3D printer, IOT based projects, and much more. </p>\n<p>The Arduino software is used to build the code for every project made using any Arduino boards; it mostly uses the C/C++ language for its coding. Once the code is ready, we have to just compile and upload it on the board to make our project work. There are many types of Arduino boards like  Arduino Uno, Arduino Nano, Arduino USB, etc. In this project, we are going to use the Arduino UNO board (Atmega 328p).</p>\n<h3 id=\"bluetooth-module-hc-05\" style=\"position:relative;\"><a href=\"#bluetooth-module-hc-05\" aria-label=\"bluetooth module hc 05 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>Bluetooth Module HC-05</h3>\n<p>Bluetooth HC-05 is a Bluetooth module that is mostly used in the Bluetooth based project. It is easy to operate and can be easily configured with the Arduino.</p>\n<p>It has two operating modes: Command mode and Data mode, as we can change these modes by just pressing the push button on the Bluetooth module.\nIt has Six terminals. Two terminal are Vcc and GROUND for power purpose. The other two are TXD and RXD, the transmitter and receiver; respectively, these are the terminals that send and receive signals from the Arduino board to control the device. The other two terminals are State and Key, which tells the state of the module that it is in command mode or data mode.</p>\n<h3 id=\"motor-driver-l298d\" style=\"position:relative;\"><a href=\"#motor-driver-l298d\" aria-label=\"motor driver l298d 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>Motor Driver L298D</h3>\n<p>This is an IC made into a Module with a HEAT SINK embedded into it, which helps release heat whenever the L298D IC is heated. Now, this module is used to control the motors connected for the locomotion of the car; these motors work by the command prompted by the Arduino to move or rotate in a specific direction. It can control Four Gear motors at maximum; also, the speed of the motors can be handled by this IC.</p>\n<h2 id=\"objective\" style=\"position:relative;\"><a href=\"#objective\" aria-label=\"objective 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>Objective</h2>\n<ul>\n<li>This project's main motive is to expand the knowledge for smart micro-controllers like Arduino, which is widely used in the latest IoT technologies.</li>\n<li>Making the use of Connectivity Modules like Bluetooth HC-05, to understand the different modes of operating and communications with the micro-controller board.</li>\n<li>To get familiar with Codes and programs used for the controlling of the Arduino Uno board.</li>\n<li>Introductory project for Every Electronics And Electrical Student, to get the working of the Arduino board and its software.</li>\n</ul>\n<h3 id=\"components-required-for-the-project\" style=\"position:relative;\"><a href=\"#components-required-for-the-project\" aria-label=\"components required for the project permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Components Required for the project:</h3>\n<ol>\n<li>Arduino UNO</li>\n<li>Bluetooth HC-05 Module</li>\n<li>Motor Driver L298</li>\n<li>Jumper Wires </li>\n<li>Gear Motors (x4)</li>\n<li>12 V battery (x3 Lithium-ion cells)</li>\n<li>LED</li>\n<li>Motor Wheels </li>\n</ol>\n<h3 id=\"pin-connections\" style=\"position:relative;\"><a href=\"#pin-connections\" aria-label=\"pin connections 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>Pin Connections:</h3>\n<ol>\n<li>Connect one terminal of each of two motors to the OUT1 (left side) and OUT2(left side) pins and each of the other two motors to the OUT3(right side) and OUT4(right side) of L298N motor driver.</li>\n<li>Connect the  positive wire of batteries to +12V pin and negative to the GND of L298N also +5V(of motor driver) to Vin(in analog pins)</li>\n<li>Connect the same GND of a motor driver to GND (in analog) of Arduino.</li>\n<li>Pins of HC-05 are connected to Arduino like this: GND(in analog pins) to GND; VCC(in analog) to 5V; RX to TX(in digital pins) and TX to RX(in digital pins).</li>\n<li>Connect anode and cathode of LED to Pin 9 (in digital pins) and 3.3V (in analog pins) pins, respectively.</li>\n<li>The use of the LED light is the optional parameter in this project.</li>\n</ol>\n<p>Here, I want to tell one important point that, The code that will be given should be uploaded before connection of the pins; else you will face an error in uploading the code, so, just first copy the code provided below and pasted in the Arduino software and upload it to the board before the pin connections.</p>\n<blockquote>\n<p>Software details: Arduino: 1.8.9 (Windows Store 1.8.21.0) (Windows 10), Board: \"Arduino/Genuino Uno \"</p>\n</blockquote>\n<blockquote>\n<p>The application used for Controlling the car is <code>Arduino Car</code>, which can be found on Playstore.</p>\n</blockquote>\n<h3 id=\"code-for-the-project\" style=\"position:relative;\"><a href=\"#code-for-the-project\" aria-label=\"code for the project 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>CODE FOR THE PROJECT</h3>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">char t;</span>\n<span class=\"grvsc-line\"> </span>\n<span class=\"grvsc-line\">void setup() {</span>\n<span class=\"grvsc-line\">pinMode(13,OUTPUT);   //left motors forward</span>\n<span class=\"grvsc-line\">pinMode(12,OUTPUT);   //left motors reverse</span>\n<span class=\"grvsc-line\">pinMode(11,OUTPUT);   //right motors forward</span>\n<span class=\"grvsc-line\">pinMode(10,OUTPUT);   //right motors reverse</span>\n<span class=\"grvsc-line\">pinMode(9,OUTPUT);   //Led</span>\n<span class=\"grvsc-line\">Serial.begin(9600);</span>\n<span class=\"grvsc-line\"> </span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> </span>\n<span class=\"grvsc-line\">void loop() {</span>\n<span class=\"grvsc-line\">if(Serial.available()){</span>\n<span class=\"grvsc-line\">  t = Serial.read();</span>\n<span class=\"grvsc-line\">  Serial.println(t);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> </span>\n<span class=\"grvsc-line\">if(t == &#39;F&#39;){            //move forward(all motors rotate in forward direction)</span>\n<span class=\"grvsc-line\">  digitalWrite(13,HIGH);</span>\n<span class=\"grvsc-line\">  digitalWrite(11,HIGH);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> </span>\n<span class=\"grvsc-line\">else if(t == &#39;G&#39;){      //move reverse (all motors rotate in reverse direction)</span>\n<span class=\"grvsc-line\">  digitalWrite(12,HIGH);</span>\n<span class=\"grvsc-line\">  digitalWrite(10,HIGH);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> </span>\n<span class=\"grvsc-line\">else if(t == &#39;R&#39;){      //turn right (left side motors rotate in forward direction, right side motors doesn&#39;t rotate)</span>\n<span class=\"grvsc-line\">  digitalWrite(11,HIGH);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> </span>\n<span class=\"grvsc-line\">else if(t == &#39;L&#39;){      //turn left (right side motors rotate in forward direction, left side motors doesn&#39;t rotate)</span>\n<span class=\"grvsc-line\">  digitalWrite(13,HIGH);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\">else if(t == &#39;M&#39;){    //turn led on or off)</span>\n<span class=\"grvsc-line\">  digitalWrite(9,HIGH);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\">else if(t == &#39;m&#39;){</span>\n<span class=\"grvsc-line\">  digitalWrite(9,LOW);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> </span>\n<span class=\"grvsc-line\">else if(t == &#39;S&#39;){      //STOP (all motors stop)</span>\n<span class=\"grvsc-line\">  digitalWrite(13,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(12,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(11,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(10,LOW);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\">else if(t == &#39;Q&#39;){</span>\n<span class=\"grvsc-line\">   digitalWrite(13,HIGH);</span>\n<span class=\"grvsc-line\">  delay(2000);</span>\n<span class=\"grvsc-line\">    digitalWrite(13,HIGH);</span>\n<span class=\"grvsc-line\">  digitalWrite(11,HIGH);</span>\n<span class=\"grvsc-line\">  delay(2000) ;</span>\n<span class=\"grvsc-line\">  digitalWrite(13,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(11,LOW);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> else if(t == &#39;E&#39;){</span>\n<span class=\"grvsc-line\">   digitalWrite(11,HIGH);</span>\n<span class=\"grvsc-line\">  delay(2000);</span>\n<span class=\"grvsc-line\">    digitalWrite(13,HIGH);</span>\n<span class=\"grvsc-line\">  digitalWrite(11,HIGH);</span>\n<span class=\"grvsc-line\">  delay(2000); </span>\n<span class=\"grvsc-line\">  digitalWrite(13,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(11,LOW);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> else if(t == &#39;Z&#39;){</span>\n<span class=\"grvsc-line\">   digitalWrite(13,HIGH);</span>\n<span class=\"grvsc-line\">  delay(2000);</span>\n<span class=\"grvsc-line\">  digitalWrite(12,HIGH);</span>\n<span class=\"grvsc-line\">  digitalWrite(10,HIGH);</span>\n<span class=\"grvsc-line\">  delay(2000) ;</span>\n<span class=\"grvsc-line\">  digitalWrite(12,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(10,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(13,LOW);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\"> else if(t == &#39;C&#39;){</span>\n<span class=\"grvsc-line\">   digitalWrite(11,HIGH);</span>\n<span class=\"grvsc-line\">  delay(2000);</span>\n<span class=\"grvsc-line\">    digitalWrite(12,HIGH);</span>\n<span class=\"grvsc-line\">  digitalWrite(10,HIGH);</span>\n<span class=\"grvsc-line\">  delay(2000); </span>\n<span class=\"grvsc-line\">  digitalWrite(12,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(11,LOW);</span>\n<span class=\"grvsc-line\">  digitalWrite(10,LOW);</span>\n<span class=\"grvsc-line\">}</span>\n<span class=\"grvsc-line\">}</span></code></pre>\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":"November 04, 2020","updated_date":null,"description":"In this blog, you will learn how to make a Bluetooth controlled Arduino Car.","title":"Bluetooth Controlled Arduino Car Miniature","tags":["Arduino","Bluetooth"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/97e8b7b803bfeda226780dd055369351/58556/Arduinocar.webp","srcSet":"/static/97e8b7b803bfeda226780dd055369351/61e93/Arduinocar.webp 200w,\n/static/97e8b7b803bfeda226780dd055369351/1f5c5/Arduinocar.webp 400w,\n/static/97e8b7b803bfeda226780dd055369351/58556/Arduinocar.webp 800w,\n/static/97e8b7b803bfeda226780dd055369351/210c1/Arduinocar.webp 900w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Abhishek Potekar","github":"Madmaxcoder2612","avatar":null}}}},{"node":{"excerpt":"Amazon Web Services offers scalable, reliable, and inexpensive cloud computing services. Below are some salient features provided by AWS…","fields":{"slug":"/engineering/a-journey-with-aws/"},"html":"<p>Amazon Web Services offers scalable, reliable, and inexpensive cloud computing services. Below are some salient features provided by AWS.</p>\n<ol>\n<li>Secure cloud services platform</li>\n<li>Compute power</li>\n<li>Database storage</li>\n<li>Content delivery </li>\n<li><strong>Pay for what you use</strong></li>\n</ol>\n<p>Prerequisites:</p>\n<ul>\n<li>AWS Account</li>\n<li>Active internet connection</li>\n<li>CLI usage</li>\n</ul>\n<h2 id=\"aws-ec2elastic-compute-cloud\" style=\"position:relative;\"><a href=\"#aws-ec2elastic-compute-cloud\" aria-label=\"aws ec2elastic compute cloud 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>AWS EC2(Elastic Compute Cloud)</h2>\n<p>It is the most commonly used service of AWS and catered deployment of various applications as per AMI configured before creating an EC2 Instance.\nAmazon Elastic Compute Cloud (Amazon EC2) is a web service that provides secure and resizable compute capacity in the cloud.\nIt is designed to make web-scale cloud computing easier for developers. <br>\n<strong>Here are some of the important steps while setting up new EC2 Instance-></strong> <br></p>\n<p>Choose an Amazon AMI.\n<img src=\"/6b52e56f919744985b3f92a8eda96aae/AWS_EC21.webp\" alt=\"AWS\"></p>\n<p>Choose the instance type.\n<img src=\"/2124d67a037bc991dad3b1303dd0d6cf/AWS_EC22.webp\" alt=\"AWS\"></p>\n<p>Configure security group(It allows specific IP's that user will give permission to specific ports as per requirement.)\n<img src=\"/6fa466a29f1a919fb2da28166c03938a/AWS_EC23.webp\" alt=\"AWS\"></p>\n<p>Login to EC2 via CLI</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">$ ssh -i ec2-key.pem ec2-user@11.11.11.111</span></code></pre>\n<p>Switch to ROOT</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">sudo su</span></code></pre>\n<h2 id=\"aws-rdsrelational-database-service\" style=\"position:relative;\"><a href=\"#aws-rdsrelational-database-service\" aria-label=\"aws rdsrelational database service permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>AWS RDS(Relational Database Service)</h2>\n<p>Amazon Relational Database Service is a web service that makes it easier to set up, operate, and scale a relational database in the AWS Cloud. It provides a resizable,  cost-efficient capacity for an industry-standard relational database and manages everyday database administration tasks.\nAfter setting up RDS, you can be logged in to the local tool(SQL Developer/ MY SQL Workbench) and copy RDS's endpoint with Username/Password configured while setting RDS.</p>\n<p><img src=\"/39e0cf055612574822ed7d30ac838534/AWS_RDS.webp\" alt=\"Available Databases\"></p>\n<h2 id=\"aws-elasticache\" style=\"position:relative;\"><a href=\"#aws-elasticache\" aria-label=\"aws elasticache 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>AWS ElastiCache</h2>\n<p>Amazon ElastiCache allows you to seamlessly set up, run, and scale popular open-Source compatible in-memory data stores in the cloud. This service is commonly used to avoid unnecessary calls to RDS and improve the user experience by displaying the data faster.</p>\n<p>There are two types of cluster engine supported by AWS ElastiCache</p>\n<ul>\n<li>Redis</li>\n<li>Memcached</li>\n</ul>\n<p><img src=\"/c6841f2f22b01b8cc2dbe1770592b3a0/AWS_EC.webp\" alt=\"AWS Elasti Cache\"></p>\n<p>Login to Redis locally via this command (First port can be anything except 6379 as it will direct AWS Redis to local Redis installed on the machine) and after first port, just paste the endpoint of Redis.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\">ssh -f -i ec2-key.pem -N -L 6378:demo-redis.xxxx.xx.0001.xxxx.cache.amazonaws.com:6379 ec2-user@11.11.11.111</span></code></pre>\n<h2 id=\"aws-lex\" style=\"position:relative;\"><a href=\"#aws-lex\" aria-label=\"aws lex 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>AWS Lex</h2>\n<p>Amazon Lex provides advanced deep learning functionalities of ASR(Automatic Speech Recognition) &#x26; NLU(Natural Language Understanding). With the use of Lex, we can build chatbots that can converse using speech and text as mediums.\nThere are a few components of BOT that need to be understood to build it.</p>\n<ul>\n<li>Intent:- It is a particular goal that the user wants to achieve.</li>\n<li>Utterances:-These are spoken/typed phrases that invoke content.</li>\n<li>Slots:- Data provided by the user to fulfill the intent.</li>\n<li>Prompts:-These are queries/questions asked by the user to input the data.</li>\n</ul>\n<p><img src=\"/c1243e5996dcca9944ee6252c85d6360/AWS_Lex.webp\" alt=\"AWS Lex\"></p>\n<p>Moreover, there are VERSIONS linked with bots, intents, and custom slots. With the help of versions, we can make changes in the dev version without any impact occurring in PROD; hence it helps to make Immutable versions of bot that is created using AWS Lex.</p>\n<p><img src=\"/f9ba2b9e5877382f2d0600a912b2fe2c/AWS_LexV.webp\" alt=\"AWS Lex Versions\"></p>\n<h2 id=\"aws-api-gateway\" style=\"position:relative;\"><a href=\"#aws-api-gateway\" aria-label=\"aws api gateway 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>AWS API Gateway</h2>\n<p>This AWS service is used to Create, Publish, Maintain, and Monitor secure Application Programming Interfaces(<strong>API</strong>). Moreover, it provides an easy interface for code running on AWS Lambda.\nHere are some of the pointers that explain the need for this service.</p>\n<ul>\n<li>Efficient API Development.</li>\n<li>Performance at Scale.</li>\n<li>Cost-saving at scale.</li>\n<li>Flexible Security Controls.</li>\n</ul>\n<p>This service enables us to make APIs on the go with a few clicks; also, we can use the Mocking approach to make dummy routes without any original data. In this faking data is used and bouncing back to without any activity.</p>\n<p><img src=\"/ac41c7ffa5a3f3722f2fe662d1c7c55d/AWS_API.webp\" alt=\"AWS API Gateway\"></p>\n<h2 id=\"aws-dynamodb\" style=\"position:relative;\"><a href=\"#aws-dynamodb\" aria-label=\"aws dynamodb 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>AWS DynamoDB</h2>\n<p>Dynamo DB is a NO SQL database provided by Amazon Web Services. The main job of Dynamo DB is to Store &#x26; Retrieve any amount of data and serve any level requests of traffic.\nIn this, there are different terminologies as that of a regular database. Secondary Indexes is a Data Structure that contains a subset of attributes from a table.</p>\n<ul>\n<li>Partition &#x26; Sort Keys (Partition key is single primary key composed of one attribute only)</li>\n<li>\n<p>Local &#x26; Global Secondary Indexes</p>\n<ul>\n<li>Local Index: Index with same partition key as of base table but different sort key</li>\n<li>Global Index: In the global index, both the partition key and sort key can differ from that of the base table.  </li>\n</ul>\n</li>\n</ul>\n<p><img src=\"/ab68ecc7af42f7662d490b7696839a54/AWS_Dynammo.webp\" alt=\"AWS Dynammo\"></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":"November 03, 2020","updated_date":null,"description":"Learn about various AWS services and how to set up in a step by step tutorial.","title":"AWS Services-Walkthrough","tags":["AWS","Serverless"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/78050f048f7ab8ee8ffbdfdb9cfbee1a/58556/aws.webp","srcSet":"/static/78050f048f7ab8ee8ffbdfdb9cfbee1a/61e93/aws.webp 200w,\n/static/78050f048f7ab8ee8ffbdfdb9cfbee1a/1f5c5/aws.webp 400w,\n/static/78050f048f7ab8ee8ffbdfdb9cfbee1a/58556/aws.webp 800w,\n/static/78050f048f7ab8ee8ffbdfdb9cfbee1a/210c1/aws.webp 900w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Nitin Gupta","github":"ng29","avatar":null}}}}]},"markdownRemark":{"excerpt":"Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards…","fields":{"slug":"/identity/developer-first-identity-provider-loginradius/"},"html":"<p>Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards and refining approaches to building secure, seamless experiences.</p>\n<p>We’re here to support developers on that journey. We know how important simplicity, efficiency, and well-structured documentation are when working with identity and access management solutions. That’s why we’ve redesigned the <a href=\"https://www.loginradius.com/\">LoginRadius website</a>—to be faster, more intuitive, and developer-first in every way.</p>\n<p>The goal? Having them spend less time searching and more time building.</p>\n<h2 id=\"whats-new-and-improved-on-the-loginradius-website\" style=\"position:relative;\"><a href=\"#whats-new-and-improved-on-the-loginradius-website\" aria-label=\"whats new and improved on the loginradius website permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What’s New and Improved on the LoginRadius Website?</h2>\n<p>LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve spent the last few months redesigning our interface— making navigation more intuitive and reassuring that essential resources are easily accessible.</p>\n<p>Here’s a closer look at what’s new and why it’s important:</p>\n<h3 id=\"a-developer-friendly-dark-theme\" style=\"position:relative;\"><a href=\"#a-developer-friendly-dark-theme\" aria-label=\"a developer friendly dark theme permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A Developer-Friendly Dark Theme</h3>\n<p><img src=\"/f46881583c7518a93bb24e94c32320de/a-developer-friendly-dark-theme.webp\" alt=\"This image shows how LoginRadius offers several authentication methods like traditional login, social login, passwordless login, passkeys and more in a dark mode.\">    </p>\n<p>Developers spend long hours working in dark-themed IDEs and terminals, so we’ve designed the LoginRadius experience to be developer-friendly and align with that preference.</p>\n<p>The new dark mode reduces eye strain, enhances readability, and provides a seamless transition between a coding environment and our platform. Our new design features a clean, modern aesthetic with a consistent color scheme and Barlow typography, ensuring better readability. High-quality graphics and icons are thoughtfully placed to enhance the content without adding visual clutter.</p>\n<p>So, whether you’re navigating our API docs or configuring authentication into your system, our improved interface will make those extended development hours more comfortable and efficient.</p>\n<h3 id=\"clear-categorization-for-loginradius-capabilities\" style=\"position:relative;\"><a href=\"#clear-categorization-for-loginradius-capabilities\" aria-label=\"clear categorization for loginradius capabilities permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Clear Categorization for LoginRadius Capabilities</h3>\n<p><img src=\"/e5358b82be414940f3fb146013845933/capabilities.webp\" alt=\"This image shows a breakdown of all the LoginRadius CIAM capabilities, including authentication, security, UX, scalability and multi-brand management.\"></p>\n<p>We’ve restructured our website to provide a straightforward breakdown of our customer identity and access management platform capabilities, helping you quickly find what you need:</p>\n<ul>\n<li>Authentication: Easily understand <a href=\"https://www.loginradius.com/blog/identity/authentication-option-for-your-product/\">how to choose the right login method</a>, from traditional passwords and OTPs to social login, federated SSO, and passkeys with few lines of code.</li>\n<li>Security: Implement no-code security features like bot detection, IP throttling, breached password alerts, DDoS protection, and adaptive MFA to safeguard user accounts.</li>\n<li>User Experience: Leverage AI builder, hosted pages, and drag-and-drop workflows to create smooth, branded sign-up and login experiences.</li>\n<li>High Performance &#x26; Scalability: Confidently scale with sub-100ms API response times, 100% uptime, 240K+ RPS, and 28+ global data center regions.</li>\n<li>Multi-Brand Management: Efficiently manage multiple identity apps, choosing isolated or shared data stores based on your brand’s unique needs.</li>\n</ul>\n<p>This structured layout ensures you can quickly understand each capability and how it integrates into your identity ecosystem.</p>\n<h3 id=\"developer-first-navigation\" style=\"position:relative;\"><a href=\"#developer-first-navigation\" aria-label=\"developer first navigation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Developer-First Navigation</h3>\n<p><img src=\"/a8c155c2b6faf3d5f4b4de4e2b14d763/developers-menu.webp\" alt=\"This image shows the LoginRadius menu bar, highlighting the developer dropdown.\">   </p>\n<p>We’ve been analyzing developer workflows to identify how you access key resources. That’s why we redesigned our navigation with one goal in mind: to reduce clicks and make essential resources readily available.</p>\n<p>The new LoginRadius structure puts APIs, SDKs, and integration guides right at the menu bar under the Developers dropdown so you can get started faster. Our Products, Solutions, and Customer Services are also clearly categorized, helping development teams quickly find the right tools and make informed decisions.</p>\n<h3 id=\"quick-understanding-of-integration-benefits\" style=\"position:relative;\"><a href=\"#quick-understanding-of-integration-benefits\" aria-label=\"quick understanding of integration benefits permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Quick Understanding of Integration Benefits</h3>\n<p><img src=\"/b2f9a964a2da0ea83e2f8596b833bba7/we-support-your-tech-stack.webp\" alt=\"This image shows a list of popular programming languages and frameworks offered by LoginRadius.\"></p>\n<p>Developers now have a clear view of the tech stack available with LoginRadius, designed to support diverse business needs.</p>\n<p>Our platform offers pre-built SDKs for Node.js, Python, Java, and more, making CIAM integration seamless across popular programming languages and frameworks.</p>\n<h2 id=\"over-to-you-now\" style=\"position:relative;\"><a href=\"#over-to-you-now\" aria-label=\"over to you now permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Over to You Now!</h2>\n<p>Check out our <a href=\"https://www.loginradius.com/\">revamped LoginRadius website</a> and see how the improved experience makes it easier to build, scale, and secure your applications.</p>\n<p>Do not forget to explore the improved navigation and API documentation, and get started with our free trial today. We’re excited to see what you’ll build with LoginRadius!</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"February 21, 2025","updated_date":null,"description":"LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve redesigned our website interface, making navigation more intuitive and reassuring that essential resources are easily accessible.","title":"Revamped & Ready: Introducing the New Developer-First LoginRadius Website","tags":["Developer tools","API","Identity Management","User Authentication"],"pinned":true,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7857142857142858,"src":"/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp","srcSet":"/static/80b4e4fbe176a10a327d273504607f32/61e93/hero-section.webp 200w,\n/static/80b4e4fbe176a10a327d273504607f32/1f5c5/hero-section.webp 400w,\n/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp 800w,\n/static/80b4e4fbe176a10a327d273504607f32/99238/hero-section.webp 1200w,\n/static/80b4e4fbe176a10a327d273504607f32/7c22d/hero-section.webp 1600w,\n/static/80b4e4fbe176a10a327d273504607f32/1258b/hero-section.webp 2732w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.webp"}}}},"pageContext":{"limit":6,"skip":672,"currentPage":113,"type":"///","numPages":164,"pinned":"ee8a4479-3471-53b1-bf62-d0d8dc3faaeb"}},"staticQueryHashes":["1171199041","1384082988","2100481360","23180105","528864852"]}