<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JekayinOluwa Olabemiwo</title>
    <description>The latest articles on DEV Community by JekayinOluwa Olabemiwo (@entuziaz).</description>
    <link>https://dev.to/entuziaz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F559855%2F5964aecc-692b-4a33-bfb3-2f1346065ab9.jpg</url>
      <title>DEV Community: JekayinOluwa Olabemiwo</title>
      <link>https://dev.to/entuziaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/entuziaz"/>
    <language>en</language>
    <item>
      <title>Building an Escrow Smart Contract</title>
      <dc:creator>JekayinOluwa Olabemiwo</dc:creator>
      <pubDate>Sun, 28 Apr 2024 21:35:42 +0000</pubDate>
      <link>https://dev.to/entuziaz/building-an-escrow-smart-contract-1dl9</link>
      <guid>https://dev.to/entuziaz/building-an-escrow-smart-contract-1dl9</guid>
      <description>&lt;p&gt;According to &lt;a href="https://en.wikipedia.org/wiki/Escrow" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;, escrow is a contractual agreement between two transacting parties whereby a third party holds the funds and makes the disbursement based on certain agreed conditions. An example is a trust account holding funds in a person's name to pay taxes or insurance fees.&lt;/p&gt;

&lt;p&gt;It is the bread and butter of Ethereum smart contracts. When a depositor initiates an escrow transaction, the value (Ether) is held in the escrow contract until the beneficiary has fulfilled an agreed task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Escrow Contract
&lt;/h3&gt;

&lt;p&gt;This code demonstrates an escrow written in Solidity, the prominent language of the Ethereum Virtual Machine (EVM).  The contract is called &lt;code&gt;Escrow&lt;/code&gt; in the &lt;code&gt;Escrow.sol&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contract Escrow{...}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  State Variables
&lt;/h3&gt;

&lt;p&gt;Variables hold values that are persistently stored in the blockchain (the Ethereum ledger here). The smart contract in this code defines a &lt;code&gt;depositor&lt;/code&gt; of value, a &lt;code&gt;beneficiary&lt;/code&gt; of transferred value and an &lt;code&gt;arbiter&lt;/code&gt; who alone can approve a transfer transaction. Therefore, they are defined early enough in the contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contract Escrow {
    address public depositor;
    address public beneficiary;
    address public arbiter;
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;address&lt;/code&gt; data type in Solidity is a 20-byte value representing an Ethereum address. We used it for our variables here since they will be EOAs or smart contracts with an Ethereum address.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Constructor and State Variables Initialization
&lt;/h3&gt;

&lt;p&gt;Here, the state variables are initialized in the constructor of the contract. This is similar to how classes are defined in some object-oriented languages like C#.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contract Escrow {
    ...
    constructor(address _arbiter, address _beneficiary) payable {
        arbiter = _arbiter;
        beneficiary = _beneficiary;
        depositor = msg.sender;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code, the depositor deploys the contract and, the &lt;code&gt;msg.sender&lt;/code&gt; address assumes the position of the depositor in our escrow contract. The &lt;code&gt;msg.sender&lt;/code&gt; is a globally available identifier for the externally owned account (EOA) or another smart contract calling our escrow smart contract. Read more about the use of &lt;code&gt;msg.sender&lt;/code&gt; in this &lt;a href="https://metaschool.so/articles/solidity-basics-msg-sender/" rel="noopener noreferrer"&gt;metaschool.so&lt;/a&gt; answer by Munim Iftikhar.&lt;/p&gt;

&lt;p&gt;The depositor being the deployer of the contract obtains the addresses of the arbiter and beneficiary and stores the addresses as arguments to our contract for storage as state variables.&lt;/p&gt;

&lt;p&gt;It's noteworthy to point out that the &lt;code&gt;payable&lt;/code&gt; keyword in the constructor code above identifies the contract as being able to pay the beneficiary after the arbiter approves the value transfer. The &lt;code&gt;payable&lt;/code&gt; keyword is used in Solidity to signify the ability to accept ether. Ether is the denomination of payment for EVM computation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arbiter and Transfer Approval
&lt;/h3&gt;

&lt;p&gt;In the following code, we will write the logic to transfer the value in the escrow balance to the beneficiary whose address we saved in the state storage. This is how the arbiter will be able to approve the transfer of the deposit to the beneficiary. Let's create a function &lt;code&gt;approve()&lt;/code&gt; for the process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...

function approve() external {        
    uint balance = address(this).balance;
    (bool success, ) = beneficiary.call{ value: balance }("");
    require(success);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;external&lt;/code&gt; keyword in the function definition indicates that the &lt;code&gt;approve()&lt;/code&gt; function can only be used outside of the contract by other contracts.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;address(this).balance&lt;/code&gt; allows us to access the constructor's balance with its address using the &lt;code&gt;this&lt;/code&gt; keyboard. This is the value in the escrow. In some languages like JavaScript, &lt;a href="https://en.wikipedia.org/wiki/This_(computer_programming)" rel="noopener noreferrer"&gt;this&lt;/a&gt; keyword helps to access variables defined within a specified scope of usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we made a &lt;strong&gt;&lt;a href=""&gt;message call&lt;/a&gt;&lt;/strong&gt; to beneficiary transfering the escrow balance to the beneficiary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we used the &lt;code&gt;require(success)&lt;/code&gt; line to handle when the &lt;code&gt;approve()&lt;/code&gt; function executes successfully&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Arbiter Authorization
&lt;/h3&gt;

&lt;p&gt;We need to allow only the arbiter to approve the deposit transfer. Therefore, we will create an Error to be returned once the arbiter is not the approver.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
error NotAuthorized();

function approve() external {
    if(msg.sender != arbiter) revert NotAuthorized();
    ...
    require(success);
}
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the code above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;we specify our custom error titled "NotAuthorized"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the approve() function, we used the &lt;code&gt;revert&lt;/code&gt; keyword to throw NotAuthorized when the &lt;code&gt;msg.sender&lt;/code&gt; of the deposit transfer is not the arbiter. The &lt;code&gt;msg.sender&lt;/code&gt; signifies the address that is approving the transfer from the escrow to the beneficiary.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Emitting Events
&lt;/h3&gt;

&lt;p&gt;Events are a way to emit data for front-end systems and servers consuming or working with our contract. They can listen to events and get up-to-date information for their users and processes alike. Let us add an event, &lt;code&gt;Approved(uint)&lt;/code&gt; which we will use to emit the escrow &lt;code&gt;balance&lt;/code&gt; that the arbiter transfers to the beneficiary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
event Approved(uint);
...

function approve() external {
    ...
    emit Approved(balance);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I hope you enjoyed reading this short tutorial. We have just touched on one of the first concepts in blockchain development. The smart contract source code is on &lt;a href="https://github.com/J-rayX/escrow-smart-contract" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can go ahead and build other use cases for smart contracts and improve your knowledge of Solidity. The &lt;a href="https://docs.soliditylang.org/en" rel="noopener noreferrer"&gt;Solidity documentation&lt;/a&gt; is a great place to start. You can also learn more about Ethereum development from the &lt;a href="https://ethereum.org/en/developers/docs/" rel="noopener noreferrer"&gt;Ethereum documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Are there any other concepts you would like me to write about? Share them with me! You can find me on &lt;a href="https://twitter.com/entusiaz" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover Photo by Mikhail Nilov: &lt;a href="https://www.pexels.com/photo/people-having-a-meeting-7731327/" rel="noopener noreferrer"&gt;https://www.pexels.com/photo/people-having-a-meeting-7731327/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>ethereum</category>
      <category>solidity</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>A faster way to learn new languages</title>
      <dc:creator>JekayinOluwa Olabemiwo</dc:creator>
      <pubDate>Thu, 25 Apr 2024 23:08:53 +0000</pubDate>
      <link>https://dev.to/entuziaz/pick-up-new-languages-faster-this-way-2cdg</link>
      <guid>https://dev.to/entuziaz/pick-up-new-languages-faster-this-way-2cdg</guid>
      <description>&lt;p&gt;This post is not about tutorials, books, videos, solving random code challenges, learning paths, or roadmaps. It's about a strategy. Stay with me as I show you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's get into it!
&lt;/h2&gt;

&lt;p&gt;Firstly, solve some common data structure problems with it. implement some data structures like arrays, linked lists, stacks, queues, etc. You can check common problems on &lt;a href="https://leetcode.com/" rel="noopener noreferrer"&gt;LeetCode&lt;/a&gt;, &lt;a href="https://hackerrank.com/" rel="noopener noreferrer"&gt;Hackerank&lt;/a&gt; or some other resources.&lt;/p&gt;

&lt;p&gt;Then, go into the popularly known key/difficult concepts of the language. In JavaScript, such concepts include scopes &amp;amp; closures, callbacks, destructuring, rest &amp;amp; spread, higher-order functions (the trio of map, reduce, filter), regular expressions, error handling, objects, prototypes, classes, etc. Find common problems within the domain of those concepts and attempt to solve them. You can read about them in &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" rel="noopener noreferrer"&gt;MDN&lt;/a&gt;, in some articles online, on Wikipedia or in books. You may also explanatory videos on YouTube or elsewhere.&lt;/p&gt;

&lt;p&gt;Do I understand these concepts? Yes. Can I read and understand JavaScript &amp;amp; &lt;a href="https://www.freecodecamp.org/news/write-less-do-more-with-javascript-es6-5fd4a8e50ee2/" rel="noopener noreferrer"&gt;ES6&lt;/a&gt;? Yes. Have I mastered them? No, that comes with frequent writing of the language.&lt;/p&gt;

&lt;p&gt;However, I'm comfortable with them enough to advance into server programming or browser technology with JavaScript, which are advanced concepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing I didn’t much spend time on
&lt;/h2&gt;

&lt;p&gt;Asynchronous programming is one of the key JS concepts but I didn't spend much time on it as I believed my understanding of asynchronous programming from Python &amp;amp; C# would carry into my JavaScript usage. Also, I already learnt and understood functions, closures, callbacks, promises &amp;amp; error handling. I can learn generators and other async concepts as I use the language more. Therefore, with more frequent coding in the language, I won’t have much trouble doing async programming. &lt;/p&gt;

&lt;h2&gt;
  
  
  How long?
&lt;/h2&gt;

&lt;p&gt;It took me 4 days approx to get here. I used the language years back but didn't have a strong foundation in it then unlike now that I'm picking it up again. I knew just barely enough to do side projects with Vue.js since I had always been more focused on the backend with Python. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I have a strong Python foundation and years of experience using Python professionally. Along the line, I've had to use other languages too and learned core computer science concepts like data structures and algorithms. &lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;I can either go the &lt;strong&gt;Node.js&lt;/strong&gt; way as I’m biased towards the B.E or &lt;strong&gt;React.js&lt;/strong&gt; before which I have to learn JS browser &amp;amp; DOM operations. Either way, I will build some projects and maybe write about them too.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks
&lt;/h3&gt;

&lt;p&gt;Thanks for reading up to this point. I hope you find this post nice and insightful. I'll share more about other developer hacks I have found useful in upcoming posts. So, watch out!&lt;/p&gt;

&lt;p&gt;If you'd like to share the strategies you have used too in the comment section so I can learn from you. You can find me on &lt;a href="https://twitter.com/entusiaz" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover photo by &lt;a href="https://unsplash.com/@disruptxn?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Desola Lanre-Ologun&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/man-in-grey-shirt-using-grey-laptop-computer-7d4LREDSPyQ?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building a Photo Uploader: A Practical Introduction to the JAMSTACK with Vue.js</title>
      <dc:creator>JekayinOluwa Olabemiwo</dc:creator>
      <pubDate>Mon, 18 Oct 2021 22:14:41 +0000</pubDate>
      <link>https://dev.to/hackmamba/building-a-photo-uploader-a-practical-introduction-to-the-jamstack-with-vuejs-4m9i</link>
      <guid>https://dev.to/hackmamba/building-a-photo-uploader-a-practical-introduction-to-the-jamstack-with-vuejs-4m9i</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;JAMSTACK is a JavaScript-powered stack that enables you to harness the powers of JavaScript, APIs, and markups. You can build with the JAMSTACK by using the various JavaScript frameworks and libraries and integrate with serverless functions or APIs. It is fast, lean and inexpensive.&lt;/p&gt;

&lt;p&gt;In this tutorial, you will learn how to build JAMSTACK apps with a feature to upload images. You will use Cloudinary to power the upload functionality and &lt;a href="https://auth0.com/" rel="noopener noreferrer"&gt;Auth0&lt;/a&gt; for authentication. This can come in handy when building photo albums, e-commerce applications, and business websites.&lt;/p&gt;

&lt;p&gt;For a brief introduction to Vue.js, you can check out this article, &lt;a href="https://cloudinary.com/blog/getting_started_with_vue_js_the_progressive_javascript_framework" rel="noopener noreferrer"&gt;Getting Started with Vue JS: The Progressive JavaScript Framework&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A machine with &lt;a href="https://nodejs.org/en/about/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; and &lt;a href="https://docs.npmjs.com/about-npm" rel="noopener noreferrer"&gt;npm&lt;/a&gt;) installed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic familiarity with &lt;a href="https://www.w3schools.com/js/DEFAULT.asp" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;, and &lt;a href="https://www.freecodecamp.org/news/write-less-do-more-with-javascript-es6-5fd4a8e50ee2/" rel="noopener noreferrer"&gt;ES6&lt;/a&gt; and Vue.js).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A text editor. E.g. Sublime Text, Visual Studio Code, Atom, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Cloudinary account. You can &lt;a href="https://cloudinary.com/users/register/free" rel="noopener noreferrer"&gt;sign up for a Cloudinary account for free&lt;/a&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An Auth0 account. You may create a free Auth0 account &lt;a href="https://auth0.com/signup" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Install the Project Dependencies
&lt;/h2&gt;

&lt;p&gt;You need the Node.js runtime and the npm to use &lt;a href="https://vuejs.org/" rel="noopener noreferrer"&gt;Vue.js&lt;/a&gt;. The Node package manager, &lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;npm&lt;/a&gt; will enable you to use Node.js on the command-line interface, CLI. If you do not have Node.js or npm installed, you can follow the instructions &lt;a href="https://docs.npmjs.com/downloading-and-installing-node-js-and-npm" rel="noopener noreferrer"&gt;here&lt;/a&gt; to install them on your machine.&lt;/p&gt;

&lt;p&gt;Another tool that you need to follow in this tutorial is the &lt;a href="https://cli.vuejs.org/" rel="noopener noreferrer"&gt;Vue CLI&lt;/a&gt; package. The &lt;code&gt;vue&lt;/code&gt; library will provide the capabilities of the Vue.js framework while &lt;code&gt;vue-cli&lt;/code&gt; will enable you to use certain terminal commands to interact with Vue.js and your project. &lt;/p&gt;

&lt;p&gt;You can go ahead to install Vue and the &lt;code&gt;vue-cli&lt;/code&gt; tool if you have Node.js and npm on your machine already. Use the following terminal commands to install the two packages respectively.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;vue
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @vue/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next section, you will set up your Vue.js project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Vue Project
&lt;/h2&gt;

&lt;p&gt;Use the following &lt;code&gt;vue-cli&lt;/code&gt; command to set up a Vue.js project on your terminal. You may name the project &lt;code&gt;vue-photo-uploader&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vue create vue-photo-uploader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Select Vue.js 2 version in the options prompted and allow Vue to scaffold the project folders and files for you. You should get a message that looks like the following in your terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
📄 Generating README.md...

🎉 Successfully created project vue-photo-uploader.
👉 Get started with the following commands:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you need to set up the new project to handle file uploads. This is the purpose of the next section of the tutorial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configue the Vue.js Project for File Uploads
&lt;/h2&gt;

&lt;p&gt;To handle file uploads, you will need to create an interface for your users to be able to upload files. To do that, modify the &lt;code&gt;App.vue&lt;/code&gt; file of your project as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"app"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Vue logo"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./assets/logo.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;HelloWorld&lt;/span&gt; &lt;span class="na"&gt;msg=&lt;/span&gt;&lt;span class="s"&gt;"Learn how to upload photos with Cloudinary"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"openUploadModel"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Add Photo&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code, you edited the message to be displayed by the &lt;code&gt;HelloWorld&lt;/code&gt; component. You changed it to &lt;code&gt;learn how to upload photos with Cloudinary&lt;/code&gt;. In addition, you created a button that calls the &lt;code&gt;openUploadModel&lt;/code&gt; method. The method will open the Cloudinary upload modal when the button is clicked. Now, add the method inside the  part of the &amp;lt;code&amp;gt;App.vue&amp;lt;/code&amp;gt; file as follows:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight javascript"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;amp;lt;&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;script&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;HelloWorld&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;from&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;./components/HelloWorld.vue&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;export&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;default&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;App&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;components&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;HelloWorld&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;methods&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="nf"&amp;gt;openUploadModel&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
     &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class="o"&amp;gt;&amp;amp;lt;&amp;lt;/span&amp;gt;&amp;lt;span class="sr"&amp;gt;/script&amp;lt;/span&amp;gt;&amp;lt;span class="err"&amp;gt;&amp;amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The full code of the &amp;lt;code&amp;gt;App.vue&amp;lt;/code&amp;gt; file becomes:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight html"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;template&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;id=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"app"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;img&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;alt=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"Vue logo"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;src=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"./assets/logo.png"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;HelloWorld&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;msg=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"Learn how to upload photos with Cloudinary"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;

    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;button&amp;lt;/span&amp;gt; &amp;lt;span class="err"&amp;gt;@&amp;lt;/span&amp;gt;&amp;lt;span class="na"&amp;gt;click=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"openUploadModel"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;Add Photo&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/button&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/template&amp;amp;gt;&amp;lt;/span&amp;gt;

&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;HelloWorld&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;from&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;./components/HelloWorld.vue&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;export&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;default&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;App&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;components&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;HelloWorld&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;methods&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="nf"&amp;gt;openUploadModal&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
     &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;
  &amp;lt;a name="configure-cloudinary-upload-widget" href="#configure-cloudinary-upload-widget" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  Configure Cloudinary Upload Widget
&amp;lt;/h2&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Login and obtain parameters&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Login to your Cloudinary account and go to your &amp;lt;a href="https://cloudinary.com/console"&amp;gt;console dashboard&amp;lt;/a&amp;gt; and get your cloud name. Also, get your upload preset from your Cloudinary &amp;lt;a href="https://cloudinary.com/console/settings/upload"&amp;gt;acount settings&amp;lt;/a&amp;gt;. Copy the two values somewhere because you will need them in your Vue.js project.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Configure Upload Preset settings&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;In your account settings page, scroll down the &amp;lt;a href="https://cloudinary.com/console/settings/upload"&amp;gt;Upload Settings tab&amp;lt;/a&amp;gt; to the Upload Preset section as shown below.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/60s7rb5s14yr0pxkmbpl.png" alt="Upload preset settings on Cloudinary dashboard"/&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Activate the unsigned uploading feature by clicking the &amp;lt;strong&amp;gt;Enable unsigned uploading&amp;lt;/strong&amp;gt; link. The link should change to &amp;lt;strong&amp;gt;Signed&amp;lt;/strong&amp;gt; as shown below.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lpf2zbgczlpss84ui4vi.png" alt="Unsigned uploading feature enabled"/&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;If you don&amp;amp;#39;t enable unsigned upload preset, you might get the following error.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;Upload preset must be whitelisted &amp;lt;span class="k"&amp;gt;for &amp;lt;/span&amp;gt;unsigned uploads
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Next, navigate to the &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt; page in the &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; folder of your project. Then, include the Cloudinary widget script inside the &amp;lt;body&amp;gt; tag.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight html"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;script &amp;lt;/span&amp;gt;&amp;lt;span class="na"&amp;gt;src=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"https://widget.cloudinary.com/v2.0/global/all.js"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;type=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"text/javascript"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/span&amp;gt;
...
&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/body&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Next, modify the &amp;lt;code&amp;gt;openUploadModal&amp;lt;/code&amp;gt; of the &amp;lt;code&amp;gt;App.vue&amp;lt;/code&amp;gt; file as follows:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight javascript"&amp;gt;&amp;lt;code&amp;gt;  &amp;lt;span class="p"&amp;gt;...&amp;lt;/span&amp;gt;
    &amp;lt;span class="nf"&amp;gt;openUploadModal&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;cloudinary&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;openUploadWidget&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;cloud_name&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;&amp;amp;lt;CLOUD_NAME&amp;amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
          &amp;lt;span class="na"&amp;gt;upload_preset&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;&amp;amp;lt;UPLOAD_PRESET&amp;amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;if &amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;!&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;event&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;===&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;success&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
            &amp;lt;span class="nx"&amp;gt;console&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;log&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;Image uploaded..: &amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;info&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;  
          &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}).&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;open&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;In the above code, you added the logic of the &amp;lt;code&amp;gt;&lt;a class="mentioned-user" href="https://dev.to/click"&gt;@click&lt;/a&gt;&amp;lt;/code&amp;gt; event of the button by which calls the &amp;lt;code&amp;gt;openUploadWidget&amp;lt;/code&amp;gt; method that activates the Cloudinary file upload modal.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Replace &amp;lt;code&amp;gt;CLOUD_NAME&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;UPLOAD_PRESET&amp;lt;/code&amp;gt; in the above code with the values you got from your Cloudinary account.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Next, run the project on your terminal:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;npm run serve
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Then, navigate to &amp;lt;code&amp;gt;127.0.0.1:8000&amp;lt;/code&amp;gt; on your browser to add images to the application. You should get a page that looks like the following image.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tprnqxu0aawccft6yq3.png" alt="Photo album prototype live!"/&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Click the &amp;lt;code&amp;gt;Add Photo&amp;lt;/code&amp;gt; button and the upload modal will be displayed like the following.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hludwb2yinpcy9lfr0bw.png" alt="Cloudinary upload widget"/&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Now, you can upload your images.&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;
  &amp;lt;a name="deliver-and-view-images-with-cloudinary" href="#deliver-and-view-images-with-cloudinary" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  Deliver and View Images with Cloudinary
&amp;lt;/h2&amp;gt;

&amp;lt;p&amp;gt;Cloudinary enables the delivery of images to the browser via its Vue.js SDK, &amp;lt;code&amp;gt;cloudinary-vue&amp;lt;/code&amp;gt;. Install the library to get started:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;npm &amp;lt;span class="nb"&amp;gt;install &amp;lt;/span&amp;gt;cloudinary-vue 
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;You need the following Cloudinary Vue.js components to achieve the goal of this section of the article.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;CldContext&amp;lt;/code&amp;gt; - this tag helps you to set the parameters that all the child components share.&amp;lt;br&amp;gt;
&amp;lt;code&amp;gt;CldImage&amp;lt;/code&amp;gt; - the Cloudinary Image tag. It sources images from Cloudinary and makes them available on the browser.&amp;lt;br&amp;gt;
&amp;lt;code&amp;gt;CldTransformation&amp;lt;/code&amp;gt; - the tag that allows you to describe the transformations that are applied to the images delivered.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Next, import the components in the &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; section of the &amp;lt;code&amp;gt;App.vue&amp;lt;/code&amp;gt; file. In addition, add the image &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;public_id&amp;lt;/code&amp;gt; to the Data property of Vue.js. These two variables will be defined later in the article.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight javascript"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;amp;lt;&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;script&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;...&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;CldContext&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;CldImage&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;CldTransformation&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;from&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;cloudinary-vue&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;export&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;default&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;App&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;components&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;HelloWorld&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;CldContext&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;CldImage&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;CldTransformation&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
  &amp;lt;span class="nf"&amp;gt;data&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;url&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;''&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;publicId&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;''&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;...&amp;lt;/span&amp;gt;

&amp;lt;span class="o"&amp;gt;&amp;amp;lt;&amp;lt;/span&amp;gt;&amp;lt;span class="sr"&amp;gt;/script&amp;lt;/span&amp;gt;&amp;lt;span class="err"&amp;gt;&amp;amp;gt;
&amp;lt;/span&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Then, apply the imported components in the template code.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight vue"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;template&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;id=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"app"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
    ...

    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-context&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;cloudName=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"CLOUD_NAME"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;style=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"display: flex; justify-content: center;"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-image&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;:publicId=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"publicId"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"250"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-transformation&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;height=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;gravity=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"face"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;crop=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"thumb"&amp;lt;/span&amp;gt; &amp;lt;span class="nt"&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/cld-image&amp;amp;gt;&amp;lt;/span&amp;gt;

         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-image&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;:publicId=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"publicId"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"250"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-transformation&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;height=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;gravity=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"face"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;crop=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"thumb"&amp;lt;/span&amp;gt; &amp;lt;span class="nt"&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/cld-image&amp;amp;gt;&amp;lt;/span&amp;gt;

         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-image&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;:publicId=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"publicId"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"250"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-transformation&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;height=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;gravity=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"face"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;crop=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"thumb"&amp;lt;/span&amp;gt; &amp;lt;span class="nt"&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/cld-image&amp;amp;gt;&amp;lt;/span&amp;gt;

         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-image&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;:publicId=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"publicId"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"250"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-transformation&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;height=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;gravity=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"face"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;crop=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"thumb"&amp;lt;/span&amp;gt; &amp;lt;span class="nt"&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/cld-image&amp;amp;gt;&amp;lt;/span&amp;gt;

         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-image&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;:publicId=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"publicId"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"250"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-transformation&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;height=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"200"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;gravity=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"face"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;crop=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"thumb"&amp;lt;/span&amp;gt; &amp;lt;span class="nt"&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/cld-image&amp;amp;gt;&amp;lt;/span&amp;gt;

      &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/cld-context&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;template&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;

&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Don&amp;amp;#39;t forget to replace &amp;lt;code&amp;gt;CLOUD_NAME&amp;lt;/code&amp;gt; in the code above with the real value gotten from your dashboard.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Whenever you upload an image, Cloudinary assigns a &amp;lt;code&amp;gt;public_id&amp;lt;/code&amp;gt; to an image whenever you are uploading one.&amp;lt;br&amp;gt;
Therefore, you can use the &amp;lt;code&amp;gt;public_id&amp;lt;/code&amp;gt; returned in Cloudinary&amp;amp;#39;s JSON response when an image is being uploaded. &amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;So, modify the &amp;lt;code&amp;gt;openUploadModal()&amp;lt;/code&amp;gt; method to capture the &amp;lt;code&amp;gt;public_id&amp;lt;/code&amp;gt; of an uploaded image.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight javascript"&amp;gt;&amp;lt;code&amp;gt;    &amp;lt;span class="nf"&amp;gt;openUploadModal&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;cloudinary&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;openUploadWidget&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;cloud_name&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;CLOUD_NAME&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
          &amp;lt;span class="na"&amp;gt;upload_preset&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;UPLOAD_PRESET&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;if &amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;!&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;event&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;===&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;success&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
            &amp;lt;span class="nx"&amp;gt;console&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;log&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;Image uploaded..: &amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;info&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;  

            &amp;lt;span class="c1"&amp;gt;//add the next 2 lines &amp;lt;/span&amp;gt;
            &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;url&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;info&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;url&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
            &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;publicId&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;info&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;public_id&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
            &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}).&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;open&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The full code of the &amp;lt;code&amp;gt;App.vue&amp;lt;/code&amp;gt; file is the following:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight html"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;template&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;id=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"app"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;img&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;alt=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"Vue logo"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;src=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"./assets/logo.png"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;HelloWorld&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;msg=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"Learn how to upload photos with Cloudinary"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;button&amp;lt;/span&amp;gt; &amp;lt;span class="err"&amp;gt;@&amp;lt;/span&amp;gt;&amp;lt;span class="na"&amp;gt;click=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"openUploadModel"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;Add Photo&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/button&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-context&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;cloudName=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"diiayntjq"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;style=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"display: flex; justify-content: center;"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-image&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;:publicId=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"publicId"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"250"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;cld-transformation&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;width=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"600"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;height=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"600"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;gravity=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"face"&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;crop=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"thumb"&amp;lt;/span&amp;gt; &amp;lt;span class="nt"&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/cld-image&amp;amp;gt;&amp;lt;/span&amp;gt;

      &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/cld-context&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;

  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/template&amp;amp;gt;&amp;lt;/span&amp;gt;

&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;HelloWorld&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;from&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;./components/HelloWorld.vue&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;CldContext&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;CldImage&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;CldTransformation&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;from&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;cloudinary-vue&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;

&amp;lt;span class="k"&amp;gt;export&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;default&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;App&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;components&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;HelloWorld&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;CldContext&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;CldImage&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;CldTransformation&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
  &amp;lt;span class="nf"&amp;gt;data&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;url&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;''&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;publicId&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;''&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
  &amp;lt;span class="na"&amp;gt;methods&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="nf"&amp;gt;openUploadModel&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;cloudinary&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;openUploadWidget&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;cloud_name&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;diiayntjq&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
          &amp;lt;span class="na"&amp;gt;upload_preset&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;bi7uln2q&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;if &amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="o"&amp;gt;!&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;event&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;===&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;success&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
            &amp;lt;span class="nx"&amp;gt;console&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;log&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="s1"&amp;gt;Image uploaded..: &amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;'&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;info&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;  

            &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;url&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;info&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;url&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
            &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;publicId&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;result&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;info&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;public_id&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
          &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}).&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;open&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;    
&amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/span&amp;gt;

&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;
  &amp;lt;a name="authenticating-with-auth0" href="#authenticating-with-auth0" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  Authenticating with Auth0
&amp;lt;/h2&amp;gt;

&amp;lt;p&amp;gt;Auth0 allows you to &amp;lt;a href="https://en.wikipedia.org/wiki/Authentication"&amp;gt;authenticate&amp;lt;/a&amp;gt; and &amp;lt;a href="https://en.wikipedia.org/wiki/Authorization"&amp;gt;authorize&amp;lt;/a&amp;gt; users. It integrates with several languages and frameworks for building applications. Furthermore, Auth0 proves a &amp;lt;a href="https://auth0.com/docs/login/universal-login"&amp;gt;Universal Login&amp;lt;/a&amp;gt; page to help with authenticating users. The login page redirects users back to your application after they log in.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Create an Auth0 Application&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;To start the authentication setup, log in to your &amp;lt;a href="https://manage.auth0.com/dashboard/"&amp;gt;Auth0 dashboard&amp;lt;/a&amp;gt; and follow the following steps to create an Auth0 Application.&amp;lt;/p&amp;gt;

&amp;lt;ol&amp;gt;
&amp;lt;li&amp;gt;Click &amp;lt;strong&amp;gt;&amp;amp;quot;Applications&amp;amp;quot;&amp;lt;/strong&amp;gt; in the left sidebar menu. Supply these parameters:

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Name&amp;lt;/strong&amp;gt;: Vue.js Image Uploader&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt; &amp;lt;strong&amp;gt;Application type&amp;lt;/strong&amp;gt; as Single Page Applications&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Click &amp;lt;strong&amp;gt;&amp;amp;quot;Create&amp;amp;quot;&amp;lt;/strong&amp;gt; button to complete the application creation&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Click on the &amp;lt;strong&amp;gt;&amp;amp;quot;Settings&amp;amp;quot;&amp;lt;/strong&amp;gt; tab of the newly created Application page. Set the following parameters:

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Allowed Callback URLs&amp;lt;/strong&amp;gt;: &amp;lt;code&amp;gt;http://localhost:8080&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Allowed Logout URLs&amp;lt;/strong&amp;gt;: &amp;lt;code&amp;gt;http://localhost:8080&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Allowed Web Origins&amp;lt;/strong&amp;gt;: &amp;lt;code&amp;gt;http://localhost:8080&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Scroll down the page and click on the &amp;lt;strong&amp;gt;&amp;amp;quot;Save Changes&amp;amp;quot;&amp;lt;/strong&amp;gt; button to save the settings.&amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Install Auth0&amp;lt;/strong&amp;gt; &amp;lt;br&amp;gt;
Install the Client SDK for Auth0 Single-Page Applications:&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;npm &amp;lt;span class="nb"&amp;gt;install&amp;lt;/span&amp;gt; @auth0/auth0-spa-js
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Since you need to move from one page or link to another in the Vue.js application, you will need the &amp;lt;a href="https://router.vuejs.org/"&amp;gt;Vue router&amp;lt;/a&amp;gt;. Add it with the following command and choose &amp;lt;strong&amp;gt;&amp;amp;#39;yes&amp;amp;#39;&amp;lt;/strong&amp;gt; when asked if you&amp;amp;#39;d like to use it in history mode.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;vue add router
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Create a new folder inside the &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; folder and name it &amp;lt;code&amp;gt;auth&amp;lt;/code&amp;gt;. Then, create a new file inside the &amp;lt;code&amp;gt;auth&amp;lt;/code&amp;gt; folder and name it &amp;lt;code&amp;gt;index.js&amp;lt;/code&amp;gt;. Add the following code inside the file.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight javascript"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="k"&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;Vue&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;from&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;vue&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;import&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;createAuth0Client&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;from&amp;lt;/span&amp;gt; &amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;@auth0/auth0-spa-js&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;

&amp;lt;span class="cm"&amp;gt;/** Define a default action to perform after authentication */&amp;lt;/span&amp;gt;
&amp;lt;span class="kd"&amp;gt;const&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;DEFAULT_REDIRECT_CALLBACK&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;history&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;replaceState&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;({},&amp;lt;/span&amp;gt; &amp;lt;span class="nb"&amp;gt;document&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;title&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;location&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;pathname&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;

&amp;lt;span class="kd"&amp;gt;let&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;instance&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;

&amp;lt;span class="cm"&amp;gt;/** Returns the current instance of the SDK */&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;export&amp;lt;/span&amp;gt; &amp;lt;span class="kd"&amp;gt;const&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;getInstance&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;instance&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;

&amp;lt;span class="cm"&amp;gt;/** Creates an instance of the Auth0 SDK. If one has already been created, it returns that instance */&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;export&amp;lt;/span&amp;gt; &amp;lt;span class="kd"&amp;gt;const&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;useAuth0&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;({&amp;lt;/span&amp;gt;
  &amp;lt;span class="nx"&amp;gt;onRedirectCallback&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;DEFAULT_REDIRECT_CALLBACK&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
  &amp;lt;span class="nx"&amp;gt;redirectUri&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;location&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;origin&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;...&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;options&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;})&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
  &amp;lt;span class="k"&amp;gt;if &amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;instance&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;instance&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;

  &amp;lt;span class="c1"&amp;gt;// The 'instance' is simply a Vue object&amp;lt;/span&amp;gt;
  &amp;lt;span class="nx"&amp;gt;instance&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;new&amp;lt;/span&amp;gt; &amp;lt;span class="nc"&amp;gt;Vue&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;({&amp;lt;/span&amp;gt;
    &amp;lt;span class="nf"&amp;gt;data&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;loading&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;true&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;isAuthenticated&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;user&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{},&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;null&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;popupOpen&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;error&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;null&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;};&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
    &amp;lt;span class="na"&amp;gt;methods&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="cm"&amp;gt;/** Authenticates the user using a popup window */&amp;lt;/span&amp;gt;
      &amp;lt;span class="k"&amp;gt;async&amp;lt;/span&amp;gt; &amp;lt;span class="nf"&amp;gt;loginWithPopup&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;options&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;config&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;popupOpen&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;true&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;

        &amp;lt;span class="k"&amp;gt;try&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;loginWithPopup&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;options&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;config&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;user&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;getUser&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;isAuthenticated&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;isAuthenticated&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;null&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;catch &amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;e&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;e&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
          &amp;lt;span class="c1"&amp;gt;// eslint-disable-next-line&amp;lt;/span&amp;gt;
          &amp;lt;span class="nx"&amp;gt;console&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;error&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;e&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;finally&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;popupOpen&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;

        &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;user&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;getUser&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;isAuthenticated&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;true&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
      &amp;lt;span class="cm"&amp;gt;/** Handles the callback when logging in using a redirect */&amp;lt;/span&amp;gt;
      &amp;lt;span class="k"&amp;gt;async&amp;lt;/span&amp;gt; &amp;lt;span class="nf"&amp;gt;handleRedirectCallback&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;loading&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;true&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;try&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;handleRedirectCallback&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;user&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;getUser&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;isAuthenticated&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;true&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;null&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;catch &amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;e&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;e&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;finally&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;loading&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
      &amp;lt;span class="cm"&amp;gt;/** Authenticates the user using the redirect method */&amp;lt;/span&amp;gt;
      &amp;lt;span class="nf"&amp;gt;loginWithRedirect&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;loginWithRedirect&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
      &amp;lt;span class="cm"&amp;gt;/** Returns all the claims present in the ID token */&amp;lt;/span&amp;gt;
      &amp;lt;span class="nf"&amp;gt;getIdTokenClaims&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;getIdTokenClaims&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
      &amp;lt;span class="cm"&amp;gt;/** Returns the access token. If the token is invalid or missing, a new one is retrieved */&amp;lt;/span&amp;gt;
      &amp;lt;span class="nf"&amp;gt;getTokenSilently&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;getTokenSilently&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
      &amp;lt;span class="cm"&amp;gt;/** Gets the access token using a popup window */&amp;lt;/span&amp;gt;

      &amp;lt;span class="nf"&amp;gt;getTokenWithPopup&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;getTokenWithPopup&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
      &amp;lt;span class="cm"&amp;gt;/** Logs the user out and removes their session on the authorization server */&amp;lt;/span&amp;gt;
      &amp;lt;span class="nf"&amp;gt;logout&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;logout&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;o&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
    &amp;lt;span class="cm"&amp;gt;/** Use this lifecycle method to instantiate the SDK client */&amp;lt;/span&amp;gt;
    &amp;lt;span class="k"&amp;gt;async&amp;lt;/span&amp;gt; &amp;lt;span class="nf"&amp;gt;created&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="c1"&amp;gt;// Create a new instance of the SDK client using members of the given options object&amp;lt;/span&amp;gt;
      &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="nf"&amp;gt;createAuth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;({&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;...&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;options&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;client_id&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;options&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;clientId&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;redirect_uri&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;redirectUri&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;});&amp;lt;/span&amp;gt;

      &amp;lt;span class="k"&amp;gt;try&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="c1"&amp;gt;// If the user is returning to the app after authentication..&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;if &amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;
          &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;location&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;search&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;includes&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;code=&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt;
          &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;location&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;search&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;includes&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="s2"&amp;gt;state=&amp;lt;/span&amp;gt;&amp;lt;span class="dl"&amp;gt;"&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
          &amp;lt;span class="c1"&amp;gt;// handle the redirect and retrieve tokens&amp;lt;/span&amp;gt;
          &amp;lt;span class="kd"&amp;gt;const&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;appState&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;handleRedirectCallback&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;

          &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;null&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;

          &amp;lt;span class="c1"&amp;gt;// Notify subscribers that the redirect callback has happened, passing the appState&amp;lt;/span&amp;gt;
          &amp;lt;span class="c1"&amp;gt;// (useful for retrieving any pre-authentication state)&amp;lt;/span&amp;gt;
          &amp;lt;span class="nf"&amp;gt;onRedirectCallback&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;appState&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
        &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;catch &amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;e&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;error&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;e&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;finally&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
        &amp;lt;span class="c1"&amp;gt;// Initialize our internal authentication state&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;isAuthenticated&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;isAuthenticated&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;user&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;await&amp;lt;/span&amp;gt; &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;auth0Client&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;getUser&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
        &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;loading&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="kc"&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;});&amp;lt;/span&amp;gt;

  &amp;lt;span class="k"&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;instance&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;;&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;};&amp;lt;/span&amp;gt;

&amp;lt;span class="c1"&amp;gt;// Create a simple Vue plugin to expose the wrapper object throughout the application&amp;lt;/span&amp;gt;
&amp;lt;span class="k"&amp;gt;export&amp;lt;/span&amp;gt; &amp;lt;span class="kd"&amp;gt;const&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;Auth0Plugin&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
  &amp;lt;span class="nf"&amp;gt;install&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;Vue&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class="nx"&amp;gt;options&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="nx"&amp;gt;Vue&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;prototype&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;$auth&amp;lt;/span&amp;gt; &amp;lt;span class="o"&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class="nf"&amp;gt;useAuth0&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;options&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;);&amp;lt;/span&amp;gt;
  &amp;lt;span class="p"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class="p"&amp;gt;};&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The options object in the above code is used to pass in the &amp;lt;code&amp;gt;domain&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clientId&amp;lt;/code&amp;gt; values. Hence, you have to create a JSON file called &amp;lt;code&amp;gt;auth_config.json&amp;lt;/code&amp;gt; in the root folder of the Vue.js application and add the following values to it. Obtain the domain and clientId values from the &amp;lt;strong&amp;gt;&amp;amp;quot;Settings&amp;amp;quot;&amp;lt;/strong&amp;gt; tab of the Auth0 Application page and put them in the JSON file like the following.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight shell"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="o"&amp;gt;{&amp;lt;/span&amp;gt;
  &amp;lt;span class="s2"&amp;gt;"domain"&amp;lt;/span&amp;gt;: &amp;lt;span class="s2"&amp;gt;"YOUR_DOMAIN"&amp;lt;/span&amp;gt;,
  &amp;lt;span class="s2"&amp;gt;"clientId"&amp;lt;/span&amp;gt;: &amp;lt;span class="s2"&amp;gt;"YOUR_CLIENT_ID"&amp;lt;/span&amp;gt;
&amp;lt;span class="o"&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Next, import the Auth0 plugin and Vue router in the &amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt; file as shown below.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight vue"&amp;gt;&amp;lt;code&amp;gt;...
import router from './router' // newly added line

// Import the Auth0 configuration
import { domain, clientId } from "../auth_config.json";

// Import the plugin here
import { Auth0Plugin } from "./auth";

// Install the authentication plugin here
Vue.use(Auth0Plugin, {
  domain,
  clientId,
  onRedirectCallback: appState =&amp;amp;gt; {
    router.push(
      appState &amp;lt;span class="err"&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt; appState.targetUrl
        ? appState.targetUrl
        : window.location.pathname
    );
  }
});

Vue.config.productionTip = false;

new Vue({
  router, // newly added line
  render: h =&amp;amp;gt; h(App)
}).$mount("#app");
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Configure Log in and Log out follows&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Edit the App.vue file by adding two buttons for login and log out after the HelloWorld tag in the template code.&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight vue"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;template&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;id=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"app"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
  ...

    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;div&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;v-if=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"!$auth.loading"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="c"&amp;gt;&amp;amp;lt;!-- show login when not authenticated --&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;button&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;v-if=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"!$auth.isAuthenticated"&amp;lt;/span&amp;gt; &amp;lt;span class="err"&amp;gt;@&amp;lt;/span&amp;gt;&amp;lt;span class="na"&amp;gt;click=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"login"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;Log in&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/button&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="c"&amp;gt;&amp;amp;lt;!-- show logout when authenticated --&amp;amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;button&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;v-if=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"$auth.isAuthenticated"&amp;lt;/span&amp;gt; &amp;lt;span class="err"&amp;gt;@&amp;lt;/span&amp;gt;&amp;lt;span class="na"&amp;gt;click=&amp;lt;/span&amp;gt;&amp;lt;span class="s"&amp;gt;"logout"&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;Log out&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/button&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;

  ...
  &amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class="nt"&amp;gt;&amp;amp;lt;/&amp;lt;/span&amp;gt;&amp;lt;span class="k"&amp;gt;template&amp;lt;/span&amp;gt;&amp;lt;span class="nt"&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Next, add the login and log out methods in the list of methods inside the &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; section&amp;lt;br&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;div class="highlight"&amp;gt;&amp;lt;pre class="highlight javascript"&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class="p"&amp;gt;...&amp;lt;/span&amp;gt;
  &amp;lt;span class="nx"&amp;gt;methods&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class="c1"&amp;gt;// Log the user in&amp;lt;/span&amp;gt;
    &amp;lt;span class="nf"&amp;gt;login&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;$auth&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;loginWithRedirect&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;();&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
    &amp;lt;span class="c1"&amp;gt;// Log the user out&amp;lt;/span&amp;gt;
    &amp;lt;span class="nf"&amp;gt;logout&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="k"&amp;gt;this&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;$auth&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nf"&amp;gt;logout&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;({&amp;lt;/span&amp;gt;
        &amp;lt;span class="na"&amp;gt;returnTo&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="nb"&amp;gt;window&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;location&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class="nx"&amp;gt;origin&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;});&amp;lt;/span&amp;gt;
    &amp;lt;span class="p"&amp;gt;},&amp;lt;/span&amp;gt;
    &amp;lt;span class="nf"&amp;gt;openUploadModel&amp;lt;/span&amp;gt;&amp;lt;span class="p"&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class="p"&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class="p"&amp;gt;...&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Now, you have added the login and log-out buttons and can proceed to test the authentication flow. Go to 127.0.0.1:8000 on your web browser. You will see the login button present now as shown below.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hh9tll1le8dmethhmh2w.png" alt="Login button is visible on the page now"/&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;When you click the login button, you will be directed to the Auth0 Universal login Page where your users can sign up or log in after which they will be redirected to your application.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ccm1zbdb75g0w99fyewm.png" alt="Auth0 universal login page activated"/&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;You can study the &amp;lt;a href="https://auth0.com/blog/complete-guide-to-vue-user-authentication/"&amp;gt;The Complete Guide to Vue.js User Authentication with Auth0&amp;lt;/a&amp;gt; for a detailed explanation of the Auth0 implementation in Vue.js.&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;
  &amp;lt;a name="conclusion" href="#conclusion" class="anchor"&amp;gt;
  &amp;lt;/a&amp;gt;
  Conclusion
&amp;lt;/h2&amp;gt;

&amp;lt;p&amp;gt;With the knowledge gained, you can try implementing the &amp;lt;a href="https://cloudinary.com/documentation/image_video_and_file_upload"&amp;gt;image and video upload&amp;lt;/a&amp;gt; in your next project. You may also develop a full-fledged user profile with Auth0. Much more, you can learn about the &amp;lt;a href="https://jamstack.org/"&amp;gt;JAMSTACK&amp;lt;/a&amp;gt; and its ecosystem as you build more JAMSTACK projects.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Thanks for your attention.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Content created for the &amp;lt;a href="https://content.hackmamba.io/"&amp;gt;Hackmamba&amp;lt;/a&amp;gt; Jamstack Content Hackathon using &amp;lt;a href="https://auth0.com/"&amp;gt;Auth0&amp;lt;/a&amp;gt;, &amp;lt;a href="https://cloudinary.com/"&amp;gt;Cloudinary&amp;lt;/a&amp;gt; and &amp;lt;a href="https://vuejs.org/"&amp;gt;Vue.js&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;
&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>vue</category>
      <category>auth0</category>
      <category>cloudinary</category>
    </item>
    <item>
      <title>Django Rest Framework with PostgreSQL: A CRUD Tutorial</title>
      <dc:creator>JekayinOluwa Olabemiwo</dc:creator>
      <pubDate>Wed, 24 Feb 2021 17:05:53 +0000</pubDate>
      <link>https://dev.to/entuziaz/django-rest-framework-with-postgresql-a-crud-tutorial-1l34</link>
      <guid>https://dev.to/entuziaz/django-rest-framework-with-postgresql-a-crud-tutorial-1l34</guid>
      <description>&lt;p&gt;Working with APIs is important for most web developers. From extending other services for your app to providing resources for other apps and services, APIs are essential to modern web systems for application-to-application communication.&lt;/p&gt;

&lt;p&gt;API, an acronym for &lt;strong&gt;Application Programming Interface&lt;/strong&gt; is a means by which the client-side interacts with the server-side to respond to the request of the user. It is a protocol that establishes how components of software communicate together.&lt;/p&gt;

&lt;p&gt;In this tutorial, we shall go through the procedure of creating a REST API with Django and a PostgreSQL database for a customer management app. We shall set up a Django app with Django Rest Framework. Also, we will install PostgreSQL and connect it with our API. Besides, we shall perform CRUD operations (&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt;) on the API.&lt;/p&gt;

&lt;p&gt;The objective of this tutorial is to create a RESTful API with CRUD capabilities on the database. We shall set up the Django REST framework, create the views and corresponding URL patterns for the APIs and &lt;/p&gt;

&lt;p&gt;In detail, we shall go through the following content:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is Django&lt;/li&gt;
&lt;li&gt;What is a RESTful API&lt;/li&gt;
&lt;li&gt;What is Django Rest Framework&lt;/li&gt;
&lt;li&gt;What are CRUD operations&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What is PostgreSQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setting up Django Rest Framework&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setting up PostgreSQL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating up a Postgres database&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connecting the Postgres database with the API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating Views for the CRUD Operations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating corresponding URL patterns for the views&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Have &lt;code&gt;Python&lt;/code&gt; and &lt;code&gt;pip&lt;/code&gt; package manager installed&lt;/li&gt;
&lt;li&gt;Have experience creating Django apps&lt;/li&gt;
&lt;li&gt;Have basic knowledge of Python programming&lt;/li&gt;
&lt;li&gt;Have basic experience using the command line&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Django?
&lt;/h2&gt;

&lt;p&gt;Django is an open-source Python framework for building high-performance web applications. It works by the &lt;a href="https://medium.com/shecodeafrica/understanding-the-mvc-pattern-in-django-edda05b9f43f" rel="noopener noreferrer"&gt;Model-View-Controller&lt;/a&gt; design. A notable benefit of the framework is that it enables you to build websites with speed without re-inventing the wheel. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is a REST API?
&lt;/h2&gt;

&lt;p&gt;RESTful API is an architectural standard for APIs that request data using HTTP. The data can be used to create, update, read, and delete resources. REST is an acronym for representational state transfer and, it uses HTTP to request data from a particular URL and, it returns the data in different formats such as JSON, HTML, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Django Rest Framework
&lt;/h2&gt;

&lt;p&gt;Django REST framework (DRF) is an extensive and versatile toolkit for building APIs for the web. Not only is it widely used, but it is also very customizable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are CRUD operations?
&lt;/h2&gt;

&lt;p&gt;CRUD refers to the four basic operations - Create, Read, Update and Delete - used in relational database systems. &lt;/p&gt;

&lt;p&gt;CRUD enables the basic functionalities of creating, reading, updating, and deleting resources in a REST environment. The CRUD operations are usually mapped to standard HTTP methods - POST for creating, GET for reading, PUT for updating, and DELETE for deleting respectively.&lt;/p&gt;

&lt;p&gt;From a database management perspective, the following explains how the CRUD operations work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CREATE: INSERT to create a new database record&lt;/li&gt;
&lt;li&gt;READ: SELECT to retrieve data from a database table&lt;/li&gt;
&lt;li&gt;UPDATE: UPDATES a record based on the specified primary key&lt;/li&gt;
&lt;li&gt;DELETE: DELETES a row in a database table&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is PostgreSQL?
&lt;/h2&gt;

&lt;p&gt;PostgreSQL is a free and open-source relational database system. It provides the developer with extensibility and scalability. It works with a lot of programming languages and all major operating systems such as Windows, macOS, and Linux. We will use PostgreSQL as our database for the CRUD app we will build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing PostgreSQL
&lt;/h2&gt;

&lt;p&gt;You can install PostgreSQL with the following command in the terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;python-pip python-dev libpq-dev postgresql postgresql-contrib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On macOS, you can install &lt;code&gt;posgresql&lt;/code&gt; in the &lt;code&gt;terminal&lt;/code&gt; with &lt;code&gt;brew&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you may start up &lt;code&gt;postresql&lt;/code&gt; after its installation with the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew services start postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use a Windows machine, you can download a compatible  &lt;a href="https://www.postgresql.org/download/windows/" rel="noopener noreferrer"&gt;PostgreSQL installer&lt;/a&gt; from the official website of PostgreSQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Database
&lt;/h2&gt;

&lt;p&gt;As part of the installation, PostgreSQL already created a user, &lt;code&gt;postgres&lt;/code&gt; by default for carrying out administrative responsibilities. We shall change to the user to create our database and new user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su - postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;psql&lt;/code&gt; gives us access to the Postgres interactive terminal where we can use the PostgreSQL queries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;psql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we shall create a database for this project. Always make sure to create a separate database for each project you work on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE DATABASE mydb;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above command, we have used the &lt;code&gt;CREATE&lt;/code&gt; command in SQL to create our database which we named &lt;code&gt;mydb&lt;/code&gt;. We also ended the line with a semi-colon which comes after every command in SQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Database User
&lt;/h2&gt;

&lt;p&gt;Now, we shall create a database user for our database. We will call the user &lt;code&gt;myuser&lt;/code&gt;. Replace &lt;code&gt;password&lt;/code&gt; with a strong password below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE USER myuser WITH PASSWORD 'password';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let us now grant access rights to our new user to enable it to work on the database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can then exit the current user's shell session and get back to the &lt;code&gt;postgres&lt;/code&gt; user's session&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\q
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let us leave the PostgreSQL interactive terminal back to the terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing Django and Setting up a Django Project
&lt;/h2&gt;

&lt;p&gt;When working with Django apps, always create new Django projects in isolated environments with virtual environment packages like &lt;code&gt;virtualenv&lt;/code&gt;. Virtual environments help us to work with different versions of Python and other packages with different projects we have on our machine. Let us get the &lt;code&gt;virtualenv&lt;/code&gt; package which we shall use to create our virtual environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;virtualenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, let us create a folder to house our projects and change directory into the new folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;myproject &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;myproject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the new folder, we will create the virtual environment for our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;virtualenv &lt;span class="nb"&gt;env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above command provides us a duplicate of Python and some other libraries in an isolated environment. &lt;/p&gt;

&lt;p&gt;We will activate the virtual environment so we can use it in our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source env&lt;/span&gt;/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The terminal should look like below. The name of the virtual environment will be in brackets preceding the line to show that the virtual environment has been activated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; user@host:_
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Going forward, we will install Django and set up our Django app inside the virtual environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;django djangorestframework psycopg2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We installed the following packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Django&lt;/code&gt;: the Django package that allows us to work with the Django framework and create Django apps &lt;/li&gt;
&lt;li&gt;Django Rest Framework: this toolkit gives us the features to create and use RESTful APIs with Django&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;psycopg2&lt;/code&gt;: PostgreSQL package that connects our app to PostgreSQL &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, we shall create a Django project with the &lt;code&gt;django-admin&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;django-admin startproject crm_project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; into the &lt;code&gt;crm-project&lt;/code&gt; directory and &lt;code&gt;cd&lt;/code&gt; into the sub-directory, &lt;code&gt;crm-project&lt;/code&gt;. We need to add the &lt;code&gt;rest_framework&lt;/code&gt; into the &lt;code&gt;settings.py&lt;/code&gt; file so it will be active in our project. Let us add it inside the &lt;code&gt;INSTALLED_APPS&lt;/code&gt; list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSTALLED_APPS = [
   ...
    'rest_framework', #new
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setting up Django Database Configuration
&lt;/h2&gt;

&lt;p&gt;We have created a &lt;code&gt;PostgreSQL&lt;/code&gt; database and a Django project. Now, we shall configure our Django project to use the PostgreSQL database.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;settings.py&lt;/code&gt; file of the project, you will see the &lt;code&gt;DATABASES&lt;/code&gt; section. It looks like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We need to change the SQLite database configuration to the &lt;code&gt;PostgreSQL&lt;/code&gt; database that we created. Therefore, replace the &lt;code&gt;DATABASES&lt;/code&gt; code with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating a Django app
&lt;/h2&gt;

&lt;p&gt;Let us create an app in our Django project using &lt;code&gt;manage.py&lt;/code&gt; file in the root directory of the project. It allows us to work with Django in various ways such as creating apps, creating database tables from models, running the inbuilt server, etc. Whenever you want to run the &lt;code&gt;manage.py&lt;/code&gt; file, ensure that you are at the root directory where &lt;code&gt;manage.py&lt;/code&gt; exists,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py startapp customer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you check the directory, a new sub-directory, &lt;code&gt;customer&lt;/code&gt; has been created.  Let us add the new &lt;code&gt;customer&lt;/code&gt; app to the &lt;code&gt;INSTALLED_APPS&lt;/code&gt; list in the &lt;code&gt;settings.py&lt;/code&gt; file of our &lt;code&gt;crm-project&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSTALLED_APPS = [
   ...
    'rest_framework',
    'customer', #new
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you &lt;code&gt;cd&lt;/code&gt; into customer, you would see that it has its  &lt;code&gt;models.py&lt;/code&gt; and &lt;code&gt;views.py&lt;/code&gt; files.&lt;/p&gt;

&lt;p&gt;We shall create models for the &lt;code&gt;customer&lt;/code&gt; app. Open the &lt;code&gt;models.py&lt;/code&gt; file of the &lt;code&gt;customer&lt;/code&gt; app, replace the content in it with the following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db import models

class Customer(models.Model):
    name = models.CharField("Name", max_length=240)
    email = models.EmailField()
    created = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Customer&lt;/code&gt; class in the above code extends from Django's Model class. &lt;code&gt;CharField&lt;/code&gt;, &lt;code&gt;EmailField&lt;/code&gt; ,and &lt;code&gt;DateField&lt;/code&gt; are appropriate data types for the respective fields.&lt;/p&gt;

&lt;p&gt;At this point, we will create database columns with the fields of our models through the process of migration. We will use the &lt;code&gt;manage.py&lt;/code&gt; file to apply the migrations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py makemigrations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating a REST API with Django Rest Framework
&lt;/h2&gt;

&lt;p&gt;We shall build our API on Django Rest Framework. We shall be dealing with views, serializers, and URL endpoints. The endpoints are attached to the views which fetch the responses to web requests.&lt;/p&gt;

&lt;p&gt;Serializers help with translating between JSON, XML, and native Python objects. Create a new file in the &lt;code&gt;customer&lt;/code&gt; directory and name it &lt;code&gt;serializers.py&lt;/code&gt;. Input the following code into it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from rest_framework import serializers
from .models import Customer

class CustomerSerializer(serializers.ModelSerializer):

    class Meta:
        model = Customer 
        fields = ['pk', 'name', 'email', 'created']

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;ModelSerializer&lt;/code&gt;  in the code above helps to serialize data for &lt;code&gt;Customer&lt;/code&gt; objects. &lt;/p&gt;

&lt;p&gt;Now, we shall extend the &lt;code&gt;GenericAPIViews&lt;/code&gt; that come shipped with Django Rest Framework to create our views. Add the following code inside the &lt;code&gt;views.py&lt;/code&gt; of the &lt;code&gt;customer&lt;/code&gt; app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
from django.shortcuts import render
from .models import Customer
from rest_framework import generics
from .serializers import CustomerSerializer


class CustomerCreate(generics.CreateAPIView):
    # API endpoint that allows creation of a new customer
    queryset = Customer.objects.all(),
    serializer_class = CustomerSerializer


class CustomerList(generics.ListAPIView):
    # API endpoint that allows customer to be viewed.
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above code enables us to use the &lt;code&gt;CustomerCreate&lt;/code&gt; view to create a new customer object, and the &lt;code&gt;CustomerList&lt;/code&gt; view will be used to list all the customers in the database. &lt;/p&gt;

&lt;p&gt;Should in case we want to check for a single customer, we can add a &lt;code&gt;CustomerDetail&lt;/code&gt; view as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
class CustomerDetail(generics.RetrieveAPIView):
    # API endpoint that returns a single customer by pk.
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will include a view for the &lt;code&gt;Update&lt;/code&gt; action,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
class CustomerUpdate(generics.RetrieveUpdateAPIView):
    # API endpoint that allows a customer record to be updated.
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let us add a view for the DELETE operation,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
class CustomerDelete(generics.RetrieveDestroyAPIView):
    # API endpoint that allows a customer record to be deleted.
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, create a new &lt;code&gt;urls.py&lt;/code&gt; file in the &lt;code&gt;customer&lt;/code&gt; directory and add the following code to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import include, path
from .views import CustomerCreate, CustomerList, CustomerDetail, CustomerUpdate, CustomerDelete


urlpatterns = [
    path('create/', CustomerCreate.as_view(), name='create-customer'),
    path('', CustomerList.as_view()),
    path('&amp;lt;int:pk&amp;gt;/', CustomerDetail.as_view(), name='retrieve-customer'),
    path('update/&amp;lt;int:pk&amp;gt;/', CustomerUpdate.as_view(), name='update-customer'),
    # path('delete/&amp;lt;int:pk&amp;gt;/', CustomerDelete.as_view(), name='delete-customer')
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each of the endpoints handles a particular HTTP method. The first endpoint handles the &lt;code&gt;POST&lt;/code&gt; method for CREATE operation. The second and third endpoints handle the &lt;code&gt;GET&lt;/code&gt; method for READ operations. The fourth endpoint handles the &lt;code&gt;PUT&lt;/code&gt; method for UPDATE operation while the last endpoint handles the &lt;code&gt;DELETE&lt;/code&gt; operation.&lt;/p&gt;

&lt;p&gt;Notwithstanding, we still need to point the root &lt;code&gt;urls.py&lt;/code&gt; file to the &lt;code&gt;urls.py&lt;/code&gt; file of the &lt;code&gt;customer&lt;/code&gt; app. Let us go back to the &lt;code&gt;crm_project&lt;/code&gt; sub-directory and open the &lt;code&gt;urls.py&lt;/code&gt; file there. We will then include the &lt;code&gt;customer&lt;/code&gt; app endpoints.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.contrib import admin
from django.urls import path, include #new

urlpatterns = [
    path('admin/', admin.site.urls),
    path('customer/', include('customer.urls')), #new
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file already contained the &lt;code&gt;urlpattern&lt;/code&gt; for the Django-admin app which gives us administrator capabilities.&lt;/p&gt;

&lt;p&gt;Django ships with an inbuilt server that could be used for testing purposes. We will run our application now through the server with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py runserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let us go to the URL &lt;a href="http://127.0.0.1:8000/customer" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/customer&lt;/a&gt; on the browser and we shall the interface of the Browsable API. Browsable API comes with REST Framework and allows us to interact with our API in the absence of a client-side app. We can visit each of the routes earlier defined in the &lt;code&gt;urlpatterns&lt;/code&gt; of our &lt;code&gt;customer&lt;/code&gt; app and perform the CRUD operations.  &lt;/p&gt;

&lt;p&gt;The Browsable API looks like the following for the &lt;em&gt;customer-create&lt;/em&gt; endpoint at  &lt;a href="http://127.0.0.1:8000/customer/create" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/customer/create&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="customer-create"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Well-done! We have learned how to set up a Rest API with Django connected to a PostgreSQL database. You can get the full code of the tutorial project &lt;a href="https://github.com/J-rayX/crm_project" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This tutorial helped us to build a RESTful API with the Django REST framework. We also learned how to set up PostgreSQL for a Django project. We used the command-line to create PostgreSQL databases and users. We connected the PostgreSQL database to a basic Django customer management application and added CRUD functionalities to the API. &lt;/p&gt;

&lt;p&gt;With what we have learned, we should be able to create APIs in our web projects. We would also be able to learn more about API development.  Thanks for your time. Kindly ask questions and share your ideas and suggestions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://twitter.com/JKayLight" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://www.linkedin.com/in/jekayinoluwa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>postgres</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Django Rest Framework Authentication with Dj-Rest-Auth</title>
      <dc:creator>JekayinOluwa Olabemiwo</dc:creator>
      <pubDate>Mon, 22 Feb 2021 20:44:34 +0000</pubDate>
      <link>https://dev.to/entuziaz/django-rest-framework-authentication-with-dj-rest-auth-4kli</link>
      <guid>https://dev.to/entuziaz/django-rest-framework-authentication-with-dj-rest-auth-4kli</guid>
      <description>&lt;p&gt;Authentication and authorization in Django RESTful APIs using Dj-Rest-Auth with Gmail server for sending verification emails to users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2ATYgcq2Ui8QqdxvLs" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2ATYgcq2Ui8QqdxvLs" alt="img" width="533" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Oftentimes, we come across websites and apps that demand that we register, that is, sign-up as users for us to have access to some service or feature on those websites and apps. Registering enables us to create accounts. We also get some personal credentials that allow us to have access every time we log in to use the apps. The credentials could consist of a password, email address, and/or username. 3rd-party services such as email accounts and social accounts could be used to create automatic sign-ups. When every we request to sign in to use such websites and apps, we are made to undergo an authentication process whereby the login credentials are checked with registered credentials.&lt;/p&gt;

&lt;p&gt;A common concept usually discussed with authentication is authorization. The authorization merely is granting access to specific features or services before or after authentication. In the Django framework, developers might mandate authentication before users can access some services. They can also permit users to access certain services in a web application without authentication. Nonetheless, they can also allow some users to be &lt;code&gt;superusers&lt;/code&gt; with certain administrative capabilities.&lt;/p&gt;

&lt;p&gt;APIs are used on websites to provide responses to requests from other web services. We could ensure that users who make requests to our APIs are authenticated before they can use the features on our APIs.&lt;/p&gt;

&lt;p&gt;In this article, you will learn how to implement authentication with dj-rest-auth in a Django REST framework API for a basic student management website. By using dj-rest-auth, you will be able to add an authentication feature to your Django REST API in few simple lines of code. You will get Sign up, Sign in and Sign out, password change and password reset features. By the end of the article, you will be able to add authentication to Django REST APIs using dj-rest-auth.&lt;/p&gt;

&lt;p&gt;Some technologies we would use include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Django&lt;/strong&gt;: Django is an open-source Python framework used for web development. It follows the &lt;a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" rel="noopener noreferrer"&gt;model view controller (MVC) pattern&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Django REST framework&lt;/strong&gt;: a robust and customizable toolkit for creating RESTful APIs in Django.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dj-Rest-Auth&lt;/strong&gt;: a free and open-source package used for handling authentication in Django REST APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Outline
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Step 1 — Creating Virtual Environment and Setting up Dependencies&lt;/li&gt;
&lt;li&gt;Step 2 -Setting up the Django Project and Django REST Framework&lt;/li&gt;
&lt;li&gt;Step 3 — Setting up the Student API&lt;/li&gt;
&lt;li&gt;Step 4 — Creating Authentication URLs&lt;/li&gt;
&lt;li&gt;Step 5 — Testing Authentication with the Browsable API&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Prerequisites
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;A development machine running either Linux, Windows, or macOS&lt;/li&gt;
&lt;li&gt;Have Python 3.4 or a later version, and pip installed. You can follow this article, &lt;a href="https://realpython.com/installing-python/" rel="noopener noreferrer"&gt;Python 3 Installation &amp;amp; Setup Guide&lt;/a&gt; to install and setup Python.&lt;/li&gt;
&lt;li&gt;Have a basic experience using the Django framework&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 1 — Creating Virtual Environment and Setting up Dependencies
&lt;/h2&gt;

&lt;p&gt;We shall start off by setting up a virtual environment and installing the dependencies for our application. A virtual environment will isolate the current project from other projects on our machine. So, we can have distinct versions of Python, pip, and other modules for the current project. If you use a Windows machine, you can learn how to set up &lt;code&gt;virtualenv&lt;/code&gt; on Windows in this article, &lt;a href="https://codesource.io/setting-up-a-virtual-environment-for-your-django-project/" rel="noopener noreferrer"&gt;Setting up a Virtual Environment for your Django Project&lt;/a&gt; . You can check &lt;a href="https://opensource.com/article/19/6/python-virtual-environments-mac" rel="noopener noreferrer"&gt;How to set up virtual environments for Python on a Mac&lt;/a&gt; if you run macOS. If you are running an Ubuntu machine, you may want to read &lt;a href="https://www.freecodecamp.org/news/how-to-set-up-python-virtual-environment-on-ubuntu-20-04/" rel="noopener noreferrer"&gt;How to Set Up a Python Virtual Environment on Ubuntu 20.04&lt;/a&gt;. Navigate to your home directory on the terminal. Then, create a virtual environment using the virtualenv package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~
virtualenv venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Activate the created virtual environment using &lt;code&gt;source&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source env/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure you are in your activated virtual environment while you are working on this project.&lt;/p&gt;

&lt;p&gt;Next, you can install the dependencies using &lt;code&gt;pip&lt;/code&gt;. These include the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Django: web framework to be used for the project.&lt;/li&gt;
&lt;li&gt;Django REST framework: package for creating REST APIs with Django.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install the dependencies with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install django djangorestframework
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the project dependencies installed, you will create the Django project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Setting up the Django Project and Django REST Framework
&lt;/h2&gt;

&lt;p&gt;Firstly, let us install the &lt;code&gt;tree&lt;/code&gt; package. &lt;code&gt;tree&lt;/code&gt; is a good tool for viewing files and directory structures from the terminal. We can use it to view the directory structure of our project files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get install tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we will create a new Django project by using the &lt;code&gt;django-admin&lt;/code&gt; utility on the command-line with the &lt;code&gt;startproject&lt;/code&gt; command as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;django-admin startproject drfauthproject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change directory to &lt;code&gt;drfauthproject&lt;/code&gt; folder and view the folder with the &lt;code&gt;tree&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/
tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the terminal output as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── drfauthproject
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The root folder contains the following essential files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;manage.py&lt;/code&gt;: this is a utility script that allows us to create new applications, migrate databases, and other administrative duties.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;settings.py&lt;/code&gt;: the configuration file that holds the settings for our project. We can edit the settings such as adding newly installed apps to the &lt;code&gt;INSTALLED_APPS&lt;/code&gt; settings. You can get more information from the Django documentation on &lt;a href="https://docs.djangoproject.com/en/3.1/topics/settings/" rel="noopener noreferrer"&gt;Django settings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urls.py&lt;/code&gt;: a file where we will define our URL patterns and their associated views. The patterns connect the URLS with their respective view functions. You can learn more about views in this tutorial, Django View&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let us add &lt;code&gt;rest_framework&lt;/code&gt;, &lt;code&gt;rest_framework.authtoken&lt;/code&gt;, which allows the use of token authentication, to the &lt;code&gt;INSTALLED_APPS&lt;/code&gt; setting in the &lt;code&gt;settings.py&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework.authtoken',
]
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file after modifying it.&lt;/p&gt;

&lt;p&gt;We will then create a new app called &lt;code&gt;students&lt;/code&gt; with the &lt;code&gt;manage.py&lt;/code&gt; script and the &lt;code&gt;startapp&lt;/code&gt; command for creating new apps inside a Django project. The &lt;code&gt;students&lt;/code&gt; app will be a module for managing students in our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py startapp students
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate to the &lt;code&gt;students&lt;/code&gt; directory and use the &lt;code&gt;tree&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd students
tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output will be like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── __init__.py
   ├── admin.py
   ├── apps.py
   ├── models.py
   ├── tests.py
   └── views.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;models.py&lt;/code&gt; will contain the models which define the database fields of our apps while the &lt;code&gt;views.py&lt;/code&gt; file will contain views for receiving and responding to web requests. Let us then add the new app to the &lt;code&gt;INSTALLED_APPS&lt;/code&gt; setting in the &lt;code&gt;settings.py&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',
    'students'
]
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we need to perform migrations on the database. In Django, migrations are carried out to persist the changes made in models into the database. The changes include adding and removing models and fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The out on the terminal should be like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying authtoken.0001_initial... OK
  Applying authtoken.0002_auto_20160226_1747... OK
  Applying authtoken.0003_tokenproxy... OK
  Applying sessions.0001_initial... OK

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Django comes shipped with a local development server. Let us start the server with the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py runserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output should look like the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Performing system checks...

System check identified no issues (0 silenced).
October 22, 2018 - 15:14:50
Django version 2.1.2, using settings 'drfauthproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, on your web browser, navigate to &lt;code&gt;https://127.0.0.1:8000&lt;/code&gt; where the web application will be running from. You will see the following page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A4QhJh7Azwuna9n7g" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A4QhJh7Azwuna9n7g" alt="img" width="533" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can stop the development server on the terminal with the &lt;code&gt;Ctrl + C&lt;/code&gt; keyboard shortcut or open a new terminal to continue working on the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Setting up Student API
&lt;/h2&gt;

&lt;p&gt;Next, we will use the Django REST Framework to create the REST API. We will create the models for database fields. We will also create API view functions for managing the API requests. We will then add API endpoints where the website visitors can access the API. We will also create serializers to transform model instances and QuerySets into JSON format when API responses are served.&lt;/p&gt;

&lt;p&gt;When visitors make requests through the endpoints, Django calls the corresponding view to deal with the requests and provide responses to the requests respectively.&lt;/p&gt;

&lt;p&gt;Our API endpoints will include the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;api/students&lt;/code&gt;: this endpoint is used to create students and return a list of students.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;api/students/&amp;lt;pk:id&amp;gt;&lt;/code&gt;: this endpoint is used to get, update, and delete single students by &lt;code&gt;id&lt;/code&gt; or primary key.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Creating the Student Model
&lt;/h4&gt;

&lt;p&gt;The Student model represents the database table that will contain the students’ data. The Django Object Relational Mapper (ORM) handles database management for us by providing a Python interface for SQL operations. It maps the Python classes and variables in our models to corresponding SQL tables and columns. Hence we do not need to use SQL queries ourselves.&lt;/p&gt;

&lt;p&gt;Navigate into the directory and open the &lt;code&gt;models.py&lt;/code&gt; file inside with the &lt;code&gt;nano&lt;/code&gt; command. You can learn more about GNU &lt;code&gt;nano&lt;/code&gt; text editor for Unix-like systems from this &lt;a href="https://linuxize.com/post/how-to-use-nano-text-editor/" rel="noopener noreferrer"&gt;How to Use Nano, the Linux Command Line Text Editor&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/students/
nano models.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see that it contains the following lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db import models
# Create your models here.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;from django.db import models&lt;/code&gt; already imports the Student model's API for us. Let us now add the &lt;code&gt;Student&lt;/code&gt; class with the following fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;first_name&lt;/code&gt;: the first name of the student&lt;code&gt;last_name&lt;/code&gt;: the last name of the student&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;email&lt;/code&gt;: the email address of the student&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;classroom&lt;/code&gt;: the classroom the student is in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add the code for the Student model :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db import models

class Student(models.Model):
    first_name = models.CharField("First name", max_length=255)
    last_name = models.CharField("Last name", max_length=255)
    email = models.EmailField()
    classroom = models.CharField("Classroom", max_length=20)

    def __str__(self):
        return self.first_name

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the code above, the Student class extends the models. Model from &lt;code&gt;django.db.models.Model&lt;/code&gt;. The &lt;strong&gt;str&lt;/strong&gt;() function tells how the model will be displaced. Here, we specified with a &lt;code&gt;return&lt;/code&gt; statement that the student's first name should be displayed. You can learn more about Django Models in this article, how to write Django models.&lt;/p&gt;

&lt;p&gt;Now, we will migrate the database to create tables. We will use the &lt;code&gt;makemigrations&lt;/code&gt; command to create migration files where the model changes are reflected. The changes will then be applied to the database with the &lt;code&gt;migrate&lt;/code&gt; command. So, let's navigate back to the root directory of the project where we can use our &lt;code&gt;manage.py&lt;/code&gt; utility script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, let us create the migration files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py makemigrations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output on the terminal will look like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;students/migrations/0001_initial.py
    - Create model Student
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, apply the changes to the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the migration completes, the output will show as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, students
Running migrations:
  Applying customers.0001_initial... OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Create the Serializer Class
&lt;/h4&gt;

&lt;p&gt;We shall add a serializer class for the Student model. The serializer class will convert student instances and QuerySets to and from JSON. Let us start off by creating a &lt;code&gt;serilizers.py&lt;/code&gt; file inside the &lt;code&gt;students&lt;/code&gt; application directory.&lt;/p&gt;

&lt;p&gt;Navigate to the &lt;code&gt;students&lt;/code&gt; folder and create make the &lt;code&gt;serializers.py&lt;/code&gt; file using the command &lt;code&gt;nano&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/students/
nano serializers.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following lines of code to the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from rest_framework import serializers
from .models import Student


class StudentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Student
        fields = ('pk', 'first_name', 'last_name', 'email', 'classroom')

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the first two lines, we imported the serializers API from the Django REST framework and the &lt;code&gt;Student&lt;/code&gt; model from the &lt;code&gt;models.py&lt;/code&gt; file of the student application. We then created the &lt;code&gt;CustomerSerializer&lt;/code&gt; class which extends the &lt;code&gt;serializers.ModelSerializer&lt;/code&gt; to specify the specific fields to be serialized.&lt;/p&gt;

&lt;p&gt;We then used the &lt;code&gt;Meta&lt;/code&gt; class to define the model and fields to be serialized which are: &lt;code&gt;pk&lt;/code&gt;, &lt;code&gt;first_name&lt;/code&gt;, &lt;code&gt;last_name&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, and &lt;code&gt;class&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now that we have created the serializer class for the &lt;code&gt;Student&lt;/code&gt; model, we shall create the API views.&lt;/p&gt;

&lt;h4&gt;
  
  
  Making the API Views
&lt;/h4&gt;

&lt;p&gt;At this point, we want to add the API views for the Student application. Whenever an endpoint is visited, Django will fetch the corresponding view.&lt;/p&gt;

&lt;p&gt;Open the &lt;code&gt;views.py&lt;/code&gt; file in the &lt;code&gt;students&lt;/code&gt; application directory and replace what is there with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from .models import Student
from rest_framework.generics import ListCreateAPIView,  RetrieveUpdateDestroyAPIView
from rest_framework.permissions import IsAuthenticated
from .serializers import StudentSerializer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the above code, we imported the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the Student model from the &lt;code&gt;models.py&lt;/code&gt; file of the &lt;code&gt;Student&lt;/code&gt; application.&lt;/li&gt;
&lt;li&gt;the generic view from the Django REST Framework. You can read more about other generic views provided by the Django REST Framework in this article, &lt;a href="https://www.django-rest-framework.org/api-guide/generic-views/" rel="noopener noreferrer"&gt;Generic views&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;IsAuthenticated&lt;/code&gt; permission class from the permissions module of the Django REST Framework to authorize user access to our own views. This ensures that the user is authenticated before they are able to perform a particular action or access a resource.&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;StudentSerializer&lt;/code&gt; class from the &lt;code&gt;serializers.py&lt;/code&gt; file of the &lt;code&gt;Student&lt;/code&gt; application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, let us add our API views:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
class StudentList(ListCreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

class StudentDetail(RetrieveUpdateDestroyAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code, we created 2 classes — &lt;code&gt;StudentList&lt;/code&gt; and &lt;code&gt;StudentDetail&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;StudentList&lt;/code&gt; enables us to accept GET requests to list all the students available. It also allows us to accept POST requests to create a new student.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StudentDetail&lt;/code&gt; responds to &lt;code&gt;GET&lt;/code&gt; requests to provide the details of a specific student as indicated by the &lt;code&gt;id&lt;/code&gt; or &lt;code&gt;primary_key&lt;/code&gt;. It also responds to &lt;code&gt;PUT&lt;/code&gt; requests to update one or more of the fields of a student. It also deletes a student instance when a &lt;code&gt;DELETE&lt;/code&gt; request is made.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, &lt;code&gt;permission_classes = [IsAuthenticated]&lt;/code&gt; ensures that the responses from the views will only be available if the user making the request is logged in and authenticated. Assuming we do not need our users to be authenticated to access the APIs, we wouldn't include the permission class. You can learn more about Permissions in Django REST Framework.&lt;/p&gt;

&lt;p&gt;The full code in the &lt;code&gt;views.py&lt;/code&gt; file is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from .models import Student
from rest_framework.generics import ListCreateAPIView,  RetrieveUpdateDestroyAPIView
from rest_framework.permissions import IsAuthenticated
from .serializers import StudentSerializer


class StudentList(ListCreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Student.objects.all()
    serializer_class = StudentSerializer


class StudentDetail(RetrieveUpdateDestroyAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Student.objects.all()
    serializer_class = StudentSerializer

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let us add our endpoints now.&lt;/p&gt;

&lt;h4&gt;
  
  
  Add API Endpoints
&lt;/h4&gt;

&lt;p&gt;Now, we will create the API endpoints for the student application. We shall have two endpoints: &lt;code&gt;api/students&lt;/code&gt; to create and get the list of students and &lt;code&gt;api/students/&amp;lt;pk:id&amp;gt;&lt;/code&gt; to get, update and delete single students by their &lt;code&gt;pk&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;urls.py&lt;/code&gt; file inside the &lt;code&gt;students&lt;/code&gt; application directory and add the following imports inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path
from .views import StudentList, StudentDetail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, add the URL patterns for our endpoints in the &lt;code&gt;urlpatterns&lt;/code&gt; list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
urlpatterns = [
    path('', StudentList.as_view()),
    path('&amp;lt;int:pk&amp;gt;', StudentDetail.as_view()),
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;int:pk&lt;/code&gt; above allows us to view the details of each student by going to an endpoint appended by the &lt;code&gt;pk&lt;/code&gt; of the particular student.&lt;/p&gt;

&lt;p&gt;The full code of the &lt;code&gt;urls.py&lt;/code&gt; file of the student application is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path
from .views import StudentList, StudentDetail

urlpatterns = [  
    path('', StudentList.as_view()),                
    path('&amp;lt;int:pk&amp;gt;', StudentDetail.as_view()),
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let us connect the &lt;code&gt;urls.py&lt;/code&gt; file of the student application to the &lt;code&gt;urls.py&lt;/code&gt; file of the Django project.&lt;/p&gt;

&lt;p&gt;Firstly, navigate to &lt;code&gt;~/drfauthproject/drfauthproject&lt;/code&gt; and open the &lt;code&gt;urls.py&lt;/code&gt; file of the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/drfauthproject
nano urls.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leave the code that is there already, but add the import to the &lt;code&gt;students&lt;/code&gt; views and &lt;code&gt;include&lt;/code&gt; as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.contrib import admin
from django.urls import path, include # added the include keyword
from students import views # new line

...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, add the URL to the &lt;code&gt;students&lt;/code&gt; app to the &lt;code&gt;urlpatterns&lt;/code&gt; list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/students/', include('students.urls')), # new line
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full code of the &lt;code&gt;urls.py&lt;/code&gt; of the project is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.contrib import admin
from django.urls import path, include
from students import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/students/', include('students.urls')),
]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we have the &lt;code&gt;students&lt;/code&gt; application up. Next, let us move into creating authentication endpoints where users can make authentication requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Creating Authentication Endpoints
&lt;/h2&gt;

&lt;p&gt;In this section, we shall create URLS patterns for our authentication endpoints. The authentication endpoints in our project will be mapped to the authentication views of the &lt;code&gt;dj-rest-auth&lt;/code&gt; package. The views contain code that handles the various authentication functions such as registering users and logging in. You can see more endpoints and views provided by the &lt;code&gt;dj-rest-auth&lt;/code&gt; package here, &lt;a href="https://dj-rest-auth.readthedocs.io/en/latest/api_endpoints.html" rel="noopener noreferrer"&gt;Dj-rest-auth API endpoints&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The views we shall be using are the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;LoginView&lt;/code&gt;: the view that accepts sign-in requests&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RegisterView&lt;/code&gt;: the view that will allow users to sign-up&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VerifyEmailView&lt;/code&gt;: works with the endpoints for email verification during sign up&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PasswordResetView&lt;/code&gt; and &lt;code&gt;PasswordResetConfirmView&lt;/code&gt;: used for resetting passwords&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Firstly, we will create a Django application called &lt;code&gt;users&lt;/code&gt; to manage user accounts. This is where our register and login endpoints for users will be housed.&lt;/p&gt;

&lt;p&gt;Navigate to the root directory of the project so you can use the &lt;code&gt;manage.py&lt;/code&gt; script with the &lt;code&gt;startapp&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/
python manage.py startapp users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we are going to put our register and login endpoints in the users app, we need to create a &lt;code&gt;urls.py&lt;/code&gt; file inside there to add URL patterns for authentication. Navigate to the users app and create a &lt;code&gt;urls.py&lt;/code&gt; file with the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/users/
nano urls.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let us then add the new &lt;code&gt;users&lt;/code&gt; application to the &lt;code&gt;INSTALLED_APPS&lt;/code&gt; setting in the &lt;code&gt;settings.py&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',
    'students',
    'users'
]
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, add a URL pattern to link the &lt;code&gt;urls.py&lt;/code&gt; file of the project to the &lt;code&gt;urls.py&lt;/code&gt; file of the &lt;code&gt;users&lt;/code&gt; app.&lt;/p&gt;

&lt;p&gt;Change directory to the project’s directory to access the &lt;code&gt;urls.py&lt;/code&gt; file of the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/drfauthproject/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full code of the &lt;code&gt;urls.py&lt;/code&gt; of the project is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.contrib import admin
from django.urls import path, include
from students import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/students/', include('students.urls')),
    path(('users/'), include('users.urls')),
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we will add the authentication endpoints inside the Users app.&lt;/p&gt;

&lt;h4&gt;
  
  
  Dj-rest-auth Settings and Configuration
&lt;/h4&gt;

&lt;p&gt;Next, let us install dj-rest-auth to handle authentication. We shall also install the django-allauth package to enable us to use the standard registration process of dj-rest-auth which is powered by django-allauth.&lt;/p&gt;

&lt;p&gt;Install the packages with the following command on the command-line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install dj-rest-auth django-allauth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, add &lt;code&gt;django.contrib.sites&lt;/code&gt;, &lt;code&gt;allauth&lt;/code&gt;, and &lt;code&gt;dj-rest-auth&lt;/code&gt;, to the list of &lt;code&gt;INSTALLED_APPS&lt;/code&gt; in our &lt;code&gt;settings.py&lt;/code&gt; file. We will also specifically add the registration module of the &lt;code&gt;dj-rest-auth&lt;/code&gt; package, that is &lt;code&gt;dj_rest_auth.registration&lt;/code&gt; to the list of &lt;code&gt;INSTALLED_APPS&lt;/code&gt; to be able to use it in our project.&lt;/p&gt;

&lt;p&gt;So, navigate to the root project folder and open the &lt;code&gt;settings.py&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/drfauthproject/
nano settings.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, add &lt;code&gt;django.contrib.sites&lt;/code&gt;, &lt;code&gt;allauth&lt;/code&gt;, &lt;code&gt;dj-rest-auth&lt;/code&gt; and &lt;code&gt;dj_rest_auth.registraion&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
INSTALLED_APPS = [
    ...
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'dj_rest_auth',
    'dj_rest_auth.registration',
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, perform migrations for the newly added &lt;code&gt;django.contrib.sites&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python manage.py makemigrations
python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we need to indicate the kind of authentication that we want for our REST API. We want token authentication so that API requests will be made with unique tokens. The Basic authentication type is also available where just the username and password are used to authenticate users. The session authentication type works by authenticating users by session contexts. You can learn more about the different types of authentication from the Django REST Framework documentation on &lt;a href="https://www.django-rest-framework.org/api-guide/authentication/" rel="noopener noreferrer"&gt;Authentication&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dj-rest-auth uses the JSON Web Token (JWT) for tokenization. Therefore, we shall install and use the &lt;code&gt;djangorestframework-simplejwt&lt;/code&gt; library.&lt;/p&gt;

&lt;p&gt;Let us use the &lt;code&gt;pip&lt;/code&gt; package manage to install &lt;code&gt;djangorestframework-simplejwt&lt;/code&gt; on the command-line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install djangorestframework-simplejwt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, navigate to the &lt;code&gt;settings.py&lt;/code&gt; file and add it &lt;code&gt;dj_rest_auth.jwt_auth.JWTCookieAuthentication'&lt;/code&gt; to the list of the default authentication classes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/drfauthproject/
nano settings.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add the following to the &lt;code&gt;settings.py&lt;/code&gt; file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'dj_rest_auth.jwt_auth.JWTCookieAuthentication',
    ],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, add &lt;code&gt;SITE_ID = 1&lt;/code&gt; in the &lt;code&gt;settings.py&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SITE_ID = 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, set &lt;code&gt;REST_USE_JWT&lt;/code&gt; to be &lt;code&gt;True&lt;/code&gt; so that JWT authentication will be used by dj-rest-auth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REST_USE_JWT = True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For every authenticated session, dj-rest-auth would return a &lt;code&gt;Set-Cookie&lt;/code&gt; header that looks like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set-Cookie: my-app-auth=xxxxxxxxxxxxx; expires=Sun, 17 Feb 2021 14:21:00 GMT; HttpOnly; Max-Age=300; Path=/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hence, you need to define what the cookie key will be called in your &lt;code&gt;settings.py&lt;/code&gt; file. We can call it &lt;code&gt;my-app-auth&lt;/code&gt;. So, put the following code inside the &lt;code&gt;settings.py&lt;/code&gt; file of the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JWT_AUTH_COOKIE = 'my-app-auth'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let us add the &lt;code&gt;AUTHENTICATION_BACKENDS&lt;/code&gt; that will allow our users to be authenticated upon login and also to allow us to log in to the Django admin irrespective of the &lt;code&gt;django-allauth&lt;/code&gt; authentication backend.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
AUTHENTICATION_BACKENDS = [
    'allauth.account.auth_backends.AuthenticationBackend',
    'django.contrib.auth.backends.ModelBackend',
]
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let us specify that we want email verification for our project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have just specified above that the &lt;code&gt;email&lt;/code&gt; should be used for authentication instead of the &lt;code&gt;username&lt;/code&gt;. We also specified that the e-mail address must be provided by the user in order to register. Lastly, we added the setting to ensure mandatory verification by email for the user to complete the registration process.&lt;/p&gt;

&lt;p&gt;Next, we shall add the following code to the &lt;code&gt;settings.py&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ACCOUNT_CONFIRM_EMAIL_ON_GET = True
LOGIN_URL = 'http://localhost:8000/users/login'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;ACCOUNT_CONFIRM_EMAIL_ON_GET&lt;/code&gt; is to allow the website to verify the user when the user opens the link received in the email. Then, we want the user to be redirected to the &lt;code&gt;LOGIN_URL&lt;/code&gt; after verification, so we specified our &lt;code&gt;LOGIN_URL&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Sign up and Sign in Endpoints
&lt;/h4&gt;

&lt;p&gt;We will add the registration, login, and log-out endpoints first. Navigate to the &lt;code&gt;users&lt;/code&gt; app folder and open the &lt;code&gt;urls.py&lt;/code&gt; file inside the folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/users/
nano urls.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following imports inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path, re-path
from dj_rest_auth.registration.views import RegisterView, VerifyEmailView
from dj_rest_auth.views import LoginView, LogoutView
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As shown in the code above, &lt;code&gt;RegisterView&lt;/code&gt; and &lt;code&gt;LoginView&lt;/code&gt; are in the &lt;code&gt;registration&lt;/code&gt; module of &lt;code&gt;dj-rest-auth&lt;/code&gt;. Add the endpoints to the views in the urlpatterns list as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path, re_path
from dj_rest_auth.registration.views import RegisterView, VerifyEmailView
from dj_rest_auth.views import LoginView, LogoutView

urlpatterns = [
    path('register/', RegisterView.as_view()),
    path('login/', LoginView.as_view()),
    path('logout/', LogoutView.as_view()),

    path('verify-email/',
         VerifyEmailView.as_view(), name='rest_verify_email'),
    path('account-confirm-email/',
         VerifyEmailView.as_view(), name='account_email_verification_sent'),
    re_path(r'^account-confirm-email/(?P&amp;lt;key&amp;gt;[-:\w]+)/$',
         VerifyEmailView.as_view(), name='account_confirm_email'),
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the code above, we have added endpoints for registering users, logging in, and logging out. We have also added 3 endpoints to handle the email verification process of the user registration.&lt;/p&gt;

&lt;p&gt;After a successful signup request, &lt;code&gt;dj-rest-auth&lt;/code&gt; reaches out to the &lt;code&gt;verify-email/&lt;/code&gt; endpoint which processes the email verification and ensures that an email is sent via the &lt;code&gt;account-confirm-email/&lt;/code&gt; endpoint to the email address supplied by the user. A URL is sent along with the email message. The URL sent consists of the &lt;code&gt;re_path&lt;/code&gt; to &lt;code&gt;account-confirm-email/&lt;/code&gt; and a unique key. The user can then verify the email address with the URL. &lt;code&gt;re_path&lt;/code&gt; allows us to use regular expressions in our URL.&lt;/p&gt;

&lt;p&gt;However, we want the verification process to be automatic once the user opens the URL received in the email. So, we will specify an endpoint to receive the unique key of &lt;code&gt;account-confirm-email&lt;/code&gt; then verify the user.&lt;/p&gt;

&lt;p&gt;Navigate to the users application and open the &lt;code&gt;urls.py&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/users/
nano urls.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, add the following path to the beginning of the &lt;code&gt;urlpatterns&lt;/code&gt; list before the &lt;code&gt;register&lt;/code&gt; endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;urlpatterns = [
    path('account-confirm-email/&amp;lt;str:key&amp;gt;/', ConfirmEmailView.as_view()),
    ...
    ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After verification, the user will be directed to the &lt;code&gt;LOGIN_URL&lt;/code&gt; which we had earlier specified in the &lt;code&gt;settings.py&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;You might want to check in Django admin to see if your domain is localhost or the default example.com. Navigate to the root directory of the project to use the &lt;code&gt;manage.py&lt;/code&gt; script. Then create a superuser on the command-line with the following commands and follow the prompt to supply a username, e-mail address, and password for a superuser account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject
python manage.py createsuperuser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go to &lt;a href="http://127.0.0.1:8000/admin" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/admin&lt;/a&gt; and login with the credentials of the new superuser that you just created. Navigate to the Sites menu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AqZ4BHHQOjx29YKaS" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AqZ4BHHQOjx29YKaS" alt="img" width="533" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the site there to edit it. You may change the domain name to &lt;code&gt;127.0.0.1:8000&lt;/code&gt; and the display name to &lt;code&gt;localhost&lt;/code&gt; if they are not:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A_VEh1Iv25XSqLOxy" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A_VEh1Iv25XSqLOxy" alt="img" width="533" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Changing the domain above to localhost will ensure that the e-mails that users will receive from us bear the localhost name and not the default &lt;code&gt;example.com&lt;/code&gt; or any other. When you deploy to production, ensure that the display name is the name of the site and not the default &lt;code&gt;example.com&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Adding Password Reset Feature
&lt;/h4&gt;

&lt;p&gt;Now, we will allow our users to perform password reset when they forget their passwords. We will be adding the &lt;code&gt;password-reset&lt;/code&gt;, and the &lt;code&gt;password-reset-confirm'&lt;/code&gt; endpoints in the global &lt;code&gt;urls.py&lt;/code&gt; file of the project for them to be active.&lt;/p&gt;

&lt;p&gt;Navigate to the project’s directory and open the &lt;code&gt;urls.py&lt;/code&gt; file of the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/drfauthproject/
nano urls.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import &lt;code&gt;PaswordResetView&lt;/code&gt; and &lt;code&gt;PasswordResetConfirmView&lt;/code&gt; from &lt;code&gt;dj-rest-auth&lt;/code&gt; views to the file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
from dj_rest_auth.views import PasswordResetView, PasswordResetConfirmView
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, add the following endpoints to the list of &lt;code&gt;urlpatterns&lt;/code&gt; as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;urlpatterns = [
    ...
    path('password-reset/', PasswordResetView.as_view()),
        path(‘password-reset-confirm/&amp;lt;uidb64&amp;gt;/&amp;lt;token&amp;gt;/',
         PasswordResetConfirmView.as_view(), name='password_reset_confirm'),  
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;password-reset&lt;/code&gt; endpoint is where the user makes the request to reset their password. &lt;code&gt;dj-rest-auth&lt;/code&gt; calls unto &lt;code&gt;password-reset-confirm&lt;/code&gt; endpoint to which sends an email to the email address of the user. The email message body contains the &lt;code&gt;password-reset-confirm&lt;/code&gt; that has a unique key to verify only that email address. When the user opens the &lt;code&gt;password-reset-confirm&lt;/code&gt; URL in the email message, they will be redirected to a new page to supply a new password for their account.&lt;/p&gt;

&lt;p&gt;The full code of the main &lt;code&gt;urls.py&lt;/code&gt; file of the project now becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.contrib import admin
from django.urls import path, include, re_path
from students import views
from dj_rest_auth.views import PasswordResetView, PasswordResetConfirmView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/students/', include('students.urls')),
    path(('users/'), include('users.urls')),

    path('password-reset/', PasswordResetView.as_view()),
    path(‘password-reset-confirm/&amp;lt;uidb64&amp;gt;/&amp;lt;token&amp;gt;/',
         PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Email Backend Configuration
&lt;/h4&gt;

&lt;p&gt;We need to set up the configuration for our email backend server so we can send verification emails to the users.&lt;/p&gt;

&lt;p&gt;Navigate to the &lt;code&gt;settings.py&lt;/code&gt; file and open it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/drfauthproject/drfauthproject/
nano settings.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following code to the &lt;code&gt;settings.py&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'email@gmail.com'
EMAIL_HOST_PASSWORD = ********
EMAIL_PORT = 587
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code, we specified the Django service to be used for doing email in our app. We also defined the &lt;code&gt;EMAIL_HOST&lt;/code&gt; as the Gmail email server. We added our email address and password as &lt;code&gt;EMAIL_HOST_USER&lt;/code&gt; and &lt;code&gt;EMAIL_HOST_PASSWORD&lt;/code&gt; respectively. Replace the value of the &lt;code&gt;EMAIL_HOST_USER&lt;/code&gt; and &lt;code&gt;EMAIL_HOST_PASSWORD&lt;/code&gt; with your Gmail email address and password.&lt;/p&gt;

&lt;p&gt;Please note that we have put the values for the configuration settings in our &lt;code&gt;settings.py&lt;/code&gt; file because we are still in the development stage and we test on our localhost. During production, make sure you put the above configuration inside your &lt;code&gt;.env&lt;/code&gt; environment variables so that they would be secret and would not be available to the public.&lt;/p&gt;

&lt;p&gt;Next, sign in to your Gmail account and allow less secure apps in your Gmail account here, &lt;a href="https://myaccount.google.com/lesssecureapps" rel="noopener noreferrer"&gt;Less secure apps access&lt;/a&gt;. This will prevent Google from blocking access to your Gmail account when you want to use it to send confirmation emails to users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A3qva8MbFHBtoS6_z" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A3qva8MbFHBtoS6_z" alt="img" width="533" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have set up our authentication endpoints and email backend server configuration, we will test the endpoints.&lt;/p&gt;

&lt;p&gt;Now, navigate to &lt;a&gt;127.0.0.1:8000&lt;/a&gt; and you will see the endpoints listed out as shown in the picture below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AZaHsKDXLhve7RMdn" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AZaHsKDXLhve7RMdn" alt="img" width="533" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 — Testing Authentication with the Browsable API
&lt;/h2&gt;

&lt;p&gt;Django REST Framework ships with the &lt;a href="https://www.django-rest-framework.org/topics/browsable-api/" rel="noopener noreferrer"&gt;Browsable API&lt;/a&gt; which has a good and simple interface for interacting with APIs. We shall make use of the browsable API to test our newly created REST API. If you navigate to any of the endpoints that we created, you will see the browsable API. For example, navigate to &lt;a href="http://127.0.0.1:8000/api/students/" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/api/students/&lt;/a&gt; to see how the browsable API looks like. it should look like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AKloUa7A_mVp29eBu" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AKloUa7A_mVp29eBu" alt="img" width="533" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, we cannot access the HTTP actions and resources provided by the student list endpoint because we haven’t been authenticated. We need to provide login details in order to be able to use the students app endpoints. But before login, we need to register a student. Now, let us register to create a new student instance. We shall do this through the register endpoint. Navigate to &lt;a href="http://127.0.0.1:8000/users/register/" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/users/register/&lt;/a&gt; to see the page looking like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2ArvUFS75q8SDSroxi" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2ArvUFS75q8SDSroxi" alt="img" width="533" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, you should get a response, &lt;code&gt;Verification e-mail sent.&lt;/code&gt; with the HTTP response code &lt;code&gt;201 Created&lt;/code&gt; as thus:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AglR2-M5gU48reqj0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AglR2-M5gU48reqj0" alt="img" width="533" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user would receive an e-mail like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2Abg6MQVj_RqI4A6ne" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2Abg6MQVj_RqI4A6ne" alt="img" width="533" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the user opens the URL they received via email, they will be redirected to the login endpoint which looks like the following on the browsable API:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A0FKhzTGsubSuTbd4" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A0FKhzTGsubSuTbd4" alt="img" width="533" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, login with the login credentials that you registered with. Upon successful authentication, you should get a &lt;code&gt;200 OK&lt;/code&gt; response, two tokens, and the user details and as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AmteaKks2gVuTA3ts" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AmteaKks2gVuTA3ts" alt="img" width="533" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Along with the details of the user returned upon login, we have 2 tokens returned. These are the access and refresh tokens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Access token:&lt;/strong&gt; this is the token that allows you to have access to the API. It has a short life span before it expires.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refresh token:&lt;/strong&gt; consists of the information that will enable you to get a new access token when the previous one has expired.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you navigate to the student list endpoint now at &lt;a href="http://127.0.0.1:8000/api/students/" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/api/students/&lt;/a&gt;, you should be able to access the endpoint since you have been authenticated. The browsable API endpoint should look like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AqcaOGPcDKCZsNQkw" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AqcaOGPcDKCZsNQkw" alt="img" width="533" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Input the first name, last name, email, and classroom of a sample student, you should get a &lt;code&gt;HTTP 201 Created&lt;/code&gt; response and the new student added shown in the list. It will like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2Aco7vwO338MpL38uD" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2Aco7vwO338MpL38uD" alt="img" width="533" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, because we used the &lt;code&gt;ListCreateAPIView&lt;/code&gt; generic view, we get a list of students on this endpoint, we also have options to create a new student.&lt;/p&gt;

&lt;p&gt;Now, let us check the details of the particular student added, go to the endpoint &lt;a href="http://127.0.0.1:8000/api/students/1" rel="noopener noreferrer"&gt;http://127.0.0.1:8000/api/students/1&lt;/a&gt;. &lt;code&gt;1&lt;/code&gt; is the primary key of the student that goes into the &lt;code&gt;StudentDetail&lt;/code&gt; path in the &lt;code&gt;urlpatterns&lt;/code&gt; list of the students app. It should look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AcO1ZnN3Daziqaw3C" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AcO1ZnN3Daziqaw3C" alt="img" width="533" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because we used the &lt;code&gt;RetrieveUpdateDestroyAPIView&lt;/code&gt; generic view, we can view the details of a particular student (retrieve), we can edit the details of that student (update) and we can delete that student (destroy).&lt;/p&gt;

&lt;p&gt;Next, let us test the Password reset endpoint Navigate to &lt;a&gt;127.0.0.1:8000/password-reset/&lt;/a&gt; on your browser. It should look like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A0cqwtZFt6EgMRfm6" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A0cqwtZFt6EgMRfm6" alt="img" width="533" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Input the e-mail address. You should get a &lt;code&gt;detail&lt;/code&gt; message as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AG3jB6aaDI67fLn3c" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2AG3jB6aaDI67fLn3c" alt="img" width="533" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user will receive an email with a URL in their inbox. The e-mail message will look like the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A6tdZUvDknhGWa43O" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2A6tdZUvDknhGWa43O" alt="img" width="533" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the user opens the URL in the email body, they would be required to supply a new password with the &lt;code&gt;uid&lt;/code&gt; and &lt;code&gt;token&lt;/code&gt; values in the URL as shown in the browsable endpoint below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2Auai9peg3aF-aAyKD" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F533%2F0%2Auai9peg3aF-aAyKD" alt="img" width="533" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the user opens the URL they received in the e-mail, they will be redirected to &lt;code&gt;password-reset-confirm&lt;/code&gt; page to supply a new password and the uid and token values. To handle this part, you will need to configure your client-side app to get the &lt;code&gt;uid&lt;/code&gt; and &lt;code&gt;token&lt;/code&gt; parameters from the link in the email body when the user opens it. You can check how to do this with React, a JavaScript framework for frontend apps in this &lt;a href="https://stackoverflow.com/questions/40769136/django-rest-auth-reset-password-uid-and-token" rel="noopener noreferrer"&gt;Stackoverflow discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can get the full code of this project on &lt;a href="https://github.com/J-rayX/drfauthproject" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We have been able to learn how to setup authentication for Django REST APIs. We also implemented &lt;code&gt;smptp&lt;/code&gt; with Gmail for the verification of e-mail addresses used to register. We implemented endpoints for users to register, login, logout, verify emails, and reset passwords in cases where they forget their passwords.&lt;/p&gt;

&lt;p&gt;Hopefully, you should be able to implement authentication and authorization in your Django projects with RESTful APIs. You may go and integrate client-side apps with React.js, Vue.js, Angular.js, and other frontend frameworks and libraries. You would however need to implement the cross-origin resource sharing (CORS) headers in your Django backend to effectively serve responses to requests from the client-side apps. You may use the &lt;code&gt;django-cors-headers&lt;/code&gt; tool for this. Follow the good straightforward &lt;a href="https://pypi.org/project/django-cors-headers/" rel="noopener noreferrer"&gt;documentation of the django-cors-headers&lt;/a&gt; on how to install and use the module.&lt;/p&gt;

&lt;p&gt;Thanks for patiently reading through this article. Please do not hesitate to share your opinions and ask questions. You may connect with me on Twitter &lt;a href="https://twitter.com/JKaylight" rel="noopener noreferrer"&gt;@jkaylight&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>github</category>
    </item>
    <item>
      <title>2020 2020: My Review</title>
      <dc:creator>JekayinOluwa Olabemiwo</dc:creator>
      <pubDate>Thu, 14 Jan 2021 13:07:13 +0000</pubDate>
      <link>https://dev.to/entuziaz/2020-2020-my-review-5b76</link>
      <guid>https://dev.to/entuziaz/2020-2020-my-review-5b76</guid>
      <description>&lt;p&gt;I survived!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
