<?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: Matthias 🤖</title>
    <description>The latest articles on DEV Community by Matthias 🤖 (@matthias).</description>
    <link>https://dev.to/matthias</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%2F155010%2F275e06a3-0814-4de5-9d48-f3154ff9ad09.JPG</url>
      <title>DEV Community: Matthias 🤖</title>
      <link>https://dev.to/matthias</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matthias"/>
    <language>en</language>
    <item>
      <title>Kubernetes</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Sun, 10 Nov 2019 10:24:47 +0000</pubDate>
      <link>https://dev.to/matthias/kubernetes-h3c</link>
      <guid>https://dev.to/matthias/kubernetes-h3c</guid>
      <description>&lt;p&gt;True story...&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1158764816426840064-152" src="https://platform.twitter.com/embed/Tweet.html?id=1158764816426840064"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1158764816426840064-152');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1158764816426840064&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Kubernetes is hard and definitely not for everyone.&lt;br&gt;
Even managed Kubernetes environments (e.g. Google Kubernetes Engine, Amazon Elastic Kubernetes Service, Azure Kubernetes Service or DigitalOcean Kubernetes) don't make it easier to handle.&lt;/p&gt;

&lt;p&gt;Anyway, KubeCon San Diego starts next weeks! I hope anyone who's attending will have a great time!&lt;/p&gt;

</description>
      <category>jokes</category>
    </item>
    <item>
      <title>Services for your JAMstack Application</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Thu, 07 Nov 2019 10:15:01 +0000</pubDate>
      <link>https://dev.to/matthias/services-for-your-jamstack-application-45e5</link>
      <guid>https://dev.to/matthias/services-for-your-jamstack-application-45e5</guid>
      <description>&lt;h3&gt;
  
  
  🖥 Hosting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;&lt;/strong&gt;: Deploy modern static websites with Netlify. Get CDN, Continuous deployment, 1-click HTTPS, and all the services you need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;&lt;/strong&gt;: Websites hosted directly from your GitHub repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://zeit.co/" rel="noopener noreferrer"&gt;Zeit&lt;/a&gt;&lt;/strong&gt;: Host your web projects with zero configuration, automatic SSL, and global CDN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://firebase.google.com" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt;&lt;/strong&gt;: Firebase simplifies your web hosting with tools made specifically for modern web apps. When uploading web assets, Firebase automatically pushs them to Googles global CDN and adds a free SSL certificate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🗄 CMS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://sanity.io/" rel="noopener noreferrer"&gt;Sanity&lt;/a&gt;&lt;/strong&gt;: A rather new product is Sanity. Apart from the GraphQL based API, Sanity comes with a fully customizable React based Studio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.contentful.com/" rel="noopener noreferrer"&gt;Contenful&lt;/a&gt;&lt;/strong&gt;: Contentful is how modern companies work with content. It’s content infrastructure for creating and managing content, backed by the tools for delivering it anywhere. With Contentful, developers and editors can work simultaneously and ship digital products faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://graphcms.com/" rel="noopener noreferrer"&gt;GraphCMS&lt;/a&gt;&lt;/strong&gt;: GraphCMS enables developers to build powerful content APIs in a matter of minutes, while it gives content creators all the tools they need to manage their content. The hosted content APIs can be easily consumed by websites, apps or any other platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://prismic.io/" rel="noopener noreferrer"&gt;Prismic&lt;/a&gt;&lt;/strong&gt;: With Prismic, teams of developers and marketers/editors/content managers can create websites and apps with instantly updatable content and custom design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.datocms.com/" rel="noopener noreferrer"&gt;DatoCMS&lt;/a&gt;&lt;/strong&gt;: DatoCMS serves content (e.g. articles, images) via a GraphQL-API. A feature that I didn't see in other headless CMS is the possibility to structure your content in a tree model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⒡ Functions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.netlify.com/products/functions/" rel="noopener noreferrer"&gt;Netlify Functions&lt;/a&gt;&lt;/strong&gt;: Write JavaScript or Go APIs to perform just about any backend task, scaling automatically as demand increases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://firebase.google.com/products/functions/" rel="noopener noreferrer"&gt;Firebase Cloud Functions&lt;/a&gt;&lt;/strong&gt;: Create functions that are triggered by Firebase products, such as changes to data in the Realtime Database, new user sign-ups via Auth, and conversion events in Analytics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📚 Database
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://airtable.com/" rel="noopener noreferrer"&gt;Airtable&lt;/a&gt;&lt;/strong&gt;: Airtable works like a spreadsheet but gives you the power of a database to organize anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://fauna.com/" rel="noopener noreferrer"&gt;FaunaDB&lt;/a&gt;&lt;/strong&gt;: FaunaDB is a serverless cloud database that offers fast global access to data via modern APIs like GraphQL without sacrificing data consistency. Ubiquitous, flexible and secure, FaunaDB helps modern developers build applications fearlessly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.8base.com/" rel="noopener noreferrer"&gt;8base&lt;/a&gt;&lt;/strong&gt;: Build and run cloud-based enterprise applications faster using JavaScript, GraphQL, and 8base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://firebase.google.com/products/realtime-database/" rel="noopener noreferrer"&gt;Firebase Realtime-Database&lt;/a&gt;&lt;/strong&gt;: The Firebase Realtime Database is a cloud-hosted NoSQL database that lets you store and sync data between your users in realtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.mongodb.com/cloud/atlas" rel="noopener noreferrer"&gt;MongoDB Atlas&lt;/a&gt;&lt;/strong&gt;: MongoDB Atlas is the global cloud database service for modern applications. Deploy fully managed MongoDB across AWS, Azure, or GCP.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔎 Search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.algolia.com/" rel="noopener noreferrer"&gt;Algolia&lt;/a&gt;&lt;/strong&gt;: Algolia is a powerful hosted search API. They offer clients for many languages and frameworks. I use Algolia for some projects and I can absolutely recommend it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📝 Forms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.netlify.com/products/forms" rel="noopener noreferrer"&gt;Netlify Forms&lt;/a&gt;&lt;/strong&gt;: Manage forms and submissions without any server-side code or JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://usebasin.com" rel="noopener noreferrer"&gt;Basin&lt;/a&gt;&lt;/strong&gt;: Deploy a powerful, easy-to-configure form backend without writing a single line of server side code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔐 Auth
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://auth0.com/" rel="noopener noreferrer"&gt;Auth0&lt;/a&gt;&lt;/strong&gt;: Auth0 provides a universal authentication &amp;amp; authorization platform for web, mobile and legacy applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.netlify.com/docs/identity/" rel="noopener noreferrer"&gt;Netlify Identity&lt;/a&gt;&lt;/strong&gt;: Manage signups, logins, password recovery, and more - all without rolling your own authentication service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://firebase.google.com/products/auth/" rel="noopener noreferrer"&gt;Firebase Authentication&lt;/a&gt;&lt;/strong&gt;: Firebase Authentication aims to make building secure authentication systems easy, while improving the sign-in and onboarding experience for end users. It provides an end-to-end identity solution, supporting email and password accounts, phone auth, and Google, Twitter, Facebook, and GitHub login, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.okta.com/" rel="noopener noreferrer"&gt;Okta&lt;/a&gt;&lt;/strong&gt;: Secure, scalable, and highly available authentication and user management for any app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💸 Payment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://stripe.com" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;&lt;/strong&gt;: Stripe builds the most powerful and flexible tools for internet commerce (e.g. subscription services, on-demand marketplaces or e-commerce stores).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.paypal.com/" rel="noopener noreferrer"&gt;PayPal&lt;/a&gt;&lt;/strong&gt;: Simple online payments solution that’s easy to integrate into e-commerce sites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.braintreepayments.com/" rel="noopener noreferrer"&gt;Braintree&lt;/a&gt;&lt;/strong&gt;: Braintree is a subsidiary company of PayPal. Braintree processes payments online, including credit cards, debit cards, digital wallets, PayPal, Venmo, Apple Pay, and Google Pay in a single integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🖼 Media
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://cloudinary.com/" rel="noopener noreferrer"&gt;Cloudinary&lt;/a&gt;&lt;/strong&gt;: Image, video and digital asset management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.imgix.com/" rel="noopener noreferrer"&gt;imgix&lt;/a&gt;&lt;/strong&gt;: imgix transforms, optimizes and caches your images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://uploadcare.com/" rel="noopener noreferrer"&gt;uploadcare&lt;/a&gt;&lt;/strong&gt;: Image and file hosting. Uploadcare also offers image processing.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you like my content, you might want to follow me on Twitter?! &lt;a href="https://twitter.com/fullstack_to" rel="noopener noreferrer"&gt;@fullstack_to&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@artplay" rel="noopener noreferrer"&gt;Maxim Selyuk&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/-flQuOWF18Y" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
    <item>
      <title>Useful Tools: ApacheBench (ab)</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Wed, 30 Oct 2019 07:48:47 +0000</pubDate>
      <link>https://dev.to/matthias/useful-tools-apachebench-ab-2lmo</link>
      <guid>https://dev.to/matthias/useful-tools-apachebench-ab-2lmo</guid>
      <description>&lt;p&gt;Website: &lt;a href="https://httpd.apache.org/docs/2.4/programs/ab.html" rel="noopener noreferrer"&gt;https://httpd.apache.org/docs/2.4/programs/ab.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ApacheBench (&lt;code&gt;ab&lt;/code&gt;) is a command line application for bench marking your web application. It was originally developed to test the Apache HTTP server but it is not limited to it — you can use the tool to test any web server. &lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;ApacheBench (&lt;code&gt;ab&lt;/code&gt;) is bundled in the &lt;a href="https://packages.debian.org/stretch/apache2-utils" rel="noopener noreferrer"&gt;&lt;code&gt;apache2-utils&lt;/code&gt;&lt;/a&gt; package.&lt;br&gt;
You can install it on Debian/Ubuntu platforms with &lt;code&gt;apt-get install -y apache2-utils&lt;/code&gt;.&lt;br&gt;
If you're on a macOS powered system, &lt;code&gt;ab&lt;/code&gt; is already installed, because macOS ships with Apache HTTP server.&lt;/p&gt;
&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;Suppose we want to see how fast &lt;code&gt;example.com&lt;/code&gt; can handle 100 requests (&lt;code&gt;-n 100&lt;/code&gt;), with a maximum of 10 requests (&lt;code&gt;-c 10&lt;/code&gt;) running concurrently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ab &lt;span class="nt"&gt;-n&lt;/span&gt; 100 &lt;span class="nt"&gt;-c&lt;/span&gt; 10 https://example.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ApacheBench (&lt;code&gt;ab&lt;/code&gt;) will then generate the following output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Server Software:        ECS
Server Hostname:        example.com
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Server Temp Key:        ECDH P-256 256 bits
TLS Server Name:        example.com

Document Path:          /
Document Length:        1256 bytes

Concurrency Level:      10
Time taken &lt;span class="k"&gt;for &lt;/span&gt;tests:   4.990 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      160293 bytes
HTML transferred:       125600 bytes
Requests per second:    20.04 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c"&gt;#/sec] (mean)&lt;/span&gt;
Time per request:       499.031 &lt;span class="o"&gt;[&lt;/span&gt;ms] &lt;span class="o"&gt;(&lt;/span&gt;mean&lt;span class="o"&gt;)&lt;/span&gt;
Time per request:       49.903 &lt;span class="o"&gt;[&lt;/span&gt;ms] &lt;span class="o"&gt;(&lt;/span&gt;mean, across all concurrent requests&lt;span class="o"&gt;)&lt;/span&gt;
Transfer rate:          31.37 &lt;span class="o"&gt;[&lt;/span&gt;Kbytes/sec] received

Connection Times &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)&lt;/span&gt;
              min  mean[+/-sd] median   max
Connect:      309  339  18.4    338     383
Processing:   100  108   6.3    106     129
Waiting:       99  106   6.2    104     124
Total:        410  447  22.1    446     511

Percentage of the requests served within a certain &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)&lt;/span&gt;
  50%    446
  66%    453
  75%    459
  80%    463
  90%    479
  95%    488
  98%    505
  99%    511
 100%    511 &lt;span class="o"&gt;(&lt;/span&gt;longest request&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can get some really useful information from it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Complete requests:      100
Failed requests:        0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These two lines tell us, that not a single request failed. Which in fact means, that your setup is capable of serving this amount of requests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Requests per second:    20.04 &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c"&gt;#/sec] (mean)&lt;/span&gt;
Time per request:       499.031 &lt;span class="o"&gt;[&lt;/span&gt;ms] &lt;span class="o"&gt;(&lt;/span&gt;mean&lt;span class="o"&gt;)&lt;/span&gt;
Time per request:       49.903 &lt;span class="o"&gt;[&lt;/span&gt;ms] &lt;span class="o"&gt;(&lt;/span&gt;mean, across all concurrent requests&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This part gives us information on the number of requests per second your application was able to fulfil.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requests per second&lt;/strong&gt; gives you an idea of how well your web application is performing. The larger the number, the better the performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time per request (mean)&lt;/strong&gt; tells you the average amount of time it took for a &lt;em&gt;concurrent group&lt;/em&gt; of requests to process (so in our case 10 requests took 499.031ms).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time per request (mean, across all concurrent requests)&lt;/strong&gt; tells you the average amount of time it took for a &lt;em&gt;single request&lt;/em&gt; to process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Connection Times &lt;span class="o"&gt;(&lt;/span&gt;ms&lt;span class="o"&gt;)&lt;/span&gt;
              min  mean[+/-sd] median   max
Connect:      309  339  18.4    338     383
Processing:   100  108   6.3    106     129
Waiting:       99  106   6.2    104     124
Total:        410  447  22.1    446     511
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These figures show you the component breakdown of each request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect&lt;/strong&gt; gives you information about the time it took to establish connection with your server (which is most typically the network latency).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Processing&lt;/strong&gt; time is the total amount of time the web application took to process and send a complete response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Waiting&lt;/strong&gt; is the time-to-first-byte after the request was sent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternatives to ApacheBench (ab)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jmeter.apache.org/" rel="noopener noreferrer"&gt;Apache JMeter&lt;/a&gt;: Apache JMeter is a Java based application for analyzing and measuring the performance of web applications. As opposed to ApacheBench, JMeter has a GUI to create load test scenarios. JMeter supports variable parameterization, assertions (response validation), plugins, configuration variables and report generation. Apart from the outdated GUI, JMeter is in any case a very good (and free) tool for creating complex load test scenarios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/alexfernandez/loadtest" rel="noopener noreferrer"&gt;loadtest&lt;/a&gt;: loadtest is an easy to use, Node.js based alternative to ApacheBench (ab).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://redmine.lighttpd.net/projects/weighttp/wiki" rel="noopener noreferrer"&gt;weighttp&lt;/a&gt;: weighttp is a lightweight and small benchmarking tool for web servers. I've never used it, though.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://artillery.io/" rel="noopener noreferrer"&gt;artillery&lt;/a&gt;: Artillery is a Node.js based load-testing toolkit. Artillery allows you to test HTTP, Socket.io, WebSockets, and AWS Kinesis. You can also emulate complex user behaviour. There is also a paid version to run distributed load tests. Unfortunately I cannot give you any further information or insights, because I did not used Artillery yet.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I hope you find this article useful and you give ApacheBench (ab) a try.&lt;br&gt;
In my opinion it is a great tool for quickly load testing your web application. If you know how to use it, you get useful results and metrics on how your web application performs.&lt;/p&gt;




&lt;p&gt;If you like my content, you might want to follow me on Twitter?! &lt;a href="https://twitter.com/fullstack_to" rel="noopener noreferrer"&gt;@fullstack_to&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>devops</category>
      <category>linux</category>
    </item>
    <item>
      <title>Switching to Zsh (the new macOS default shell)</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Mon, 14 Oct 2019 17:18:05 +0000</pubDate>
      <link>https://dev.to/matthias/switching-to-zsh-the-new-macos-default-shell-4pio</link>
      <guid>https://dev.to/matthias/switching-to-zsh-the-new-macos-default-shell-4pio</guid>
      <description>&lt;p&gt;With the release of macOS Catalina, the Z shell became the standard macOS shell.&lt;/p&gt;

&lt;p&gt;I used Bash for many years, but I am willing to switch to zsh.&lt;br&gt;
I already installed &lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;Oh My Zsh&lt;/a&gt; and added some aliases I used before.&lt;/p&gt;

&lt;p&gt;Do you have any good advices or snippets which might be helpful?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>help</category>
    </item>
    <item>
      <title>What Terminal Application do you use on macOS?</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Sat, 28 Sep 2019 11:02:36 +0000</pubDate>
      <link>https://dev.to/matthias/what-terminal-application-do-you-use-on-macos-1f5m</link>
      <guid>https://dev.to/matthias/what-terminal-application-do-you-use-on-macos-1f5m</guid>
      <description>&lt;p&gt;Some of my colleagues recently switched to &lt;a href="https://hyper.is/" rel="noopener noreferrer"&gt;Hyper&lt;/a&gt;. I'm still using &lt;a href="https://www.iterm2.com/" rel="noopener noreferrer"&gt;iTerm 2&lt;/a&gt; and I am very happy, so I don't see a reason to switch.&lt;/p&gt;

&lt;h4&gt;
  
  
  iTerm 2
&lt;/h4&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt10u1gmt8i67npsck99.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt10u1gmt8i67npsck99.png" alt="iTerm 2" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Hyper
&lt;/h4&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwb4yl42yse35lbruiaon.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwb4yl42yse35lbruiaon.png" alt="Hyper" width="720" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Thank you &lt;a class="mentioned-user" href="https://dev.to/jakewca"&gt;@jakewca&lt;/a&gt; for the screenshot!)&lt;/p&gt;

&lt;p&gt;What Terminal Application do you use on macOS? Do you use any tweaks?&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>JavaScript Import in VSCode IntelliSense</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Wed, 11 Sep 2019 11:33:34 +0000</pubDate>
      <link>https://dev.to/matthias/javascript-import-in-vscode-intellisense-26cm</link>
      <guid>https://dev.to/matthias/javascript-import-in-vscode-intellisense-26cm</guid>
      <description>&lt;p&gt;I try to set up a JavaScript project in Visual Studio Code.&lt;br&gt;
Everything works fine, except IntelliSense. In my particular case, I added &lt;em&gt;Styled Components&lt;/em&gt; and &lt;em&gt;PropTypes&lt;/em&gt;, but both packages won't get suggested as import.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2q4ia9zyj8407iufqp9q.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2q4ia9zyj8407iufqp9q.png" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I already created a &lt;code&gt;jsconfig.json&lt;/code&gt; file in my project root, but that didn't help either.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"commonjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jsx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allowSyntheticDefaultImports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node_modules"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"public"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".cache"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Is there anything else I need to configure, or do I have to install an extension?&lt;/p&gt;

&lt;p&gt;Would be awesome if anyone can help 🥳&lt;/p&gt;

</description>
      <category>help</category>
      <category>vscode</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How do you use GitHub Actions?</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Tue, 27 Aug 2019 18:16:15 +0000</pubDate>
      <link>https://dev.to/matthias/how-do-you-use-github-actions-17ec</link>
      <guid>https://dev.to/matthias/how-do-you-use-github-actions-17ec</guid>
      <description>&lt;p&gt;Today I was invited to &lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; Beta 🥳.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/E1OunoCyuhY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Does anyone use GitHub Actions already? What are your use cases?&lt;br&gt;
Do you have some good examples?&lt;/p&gt;

&lt;p&gt;Is anyone using GitHub Actions in production?&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://help.github.com/en/categories/automating-your-workflow-with-github-actions" rel="noopener noreferrer"&gt;GitHub Actions Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sdras/awesome-actions" rel="noopener noreferrer"&gt;awesome-actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://knapsackpro.com/ci_comparisons/github-actions/vs/gitlab-ci" rel="noopener noreferrer"&gt;GitHub Actions vs. GitLab CI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>devops</category>
      <category>github</category>
    </item>
    <item>
      <title>Use Auth0 to secure your NestJS application</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Tue, 20 Aug 2019 14:37:30 +0000</pubDate>
      <link>https://dev.to/matthias/use-auth0-to-secure-your-nestjs-application-mbo</link>
      <guid>https://dev.to/matthias/use-auth0-to-secure-your-nestjs-application-mbo</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; In this article, I will explain how you can protect your &lt;a href="https://nestjs.com" rel="noopener noreferrer"&gt;NestJS&lt;/a&gt; based API with &lt;a href="https://auth0.com" rel="noopener noreferrer"&gt;Auth0&lt;/a&gt;. Besides that, the Auth0 Management API is included to receive the current logged in user's profile.&lt;br&gt;
If you don't want to read the article, you can directly head over to the &lt;a href="https://github.com/fullstack-to/nestjs-auth0-jwt" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;Last week I struggled with connecting Auth0 to my NestJS project.&lt;br&gt;
I wanted to restrict certain endpoints of my API to be publicly available.&lt;br&gt;
Since I don't want to store user data and passwords on my own server, I decided to use Auth0.&lt;/p&gt;

&lt;p&gt;I have been using NestJS as a framework for my backend applications for some time now. NestJS makes it very easy for new users to start.&lt;br&gt;
It offers a mature CLI and many useful features are already available and can be integrated into the project as needed (e.g. database connections, validation, logging or http requests).&lt;/p&gt;

&lt;p&gt;I was desperate and could not find a working solution. I asked for help on Twitter and here on dev.to:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;div class="ltag__link__content"&gt;
    &lt;div class="missing"&gt;
      &lt;h2&gt;Article No Longer Available&lt;/h2&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1161644510704787458-791" src="https://platform.twitter.com/embed/Tweet.html?id=1161644510704787458"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1161644510704787458-791');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1161644510704787458&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I received some direct message where I got really useful advises.&lt;br&gt;
Unfortunately I could not make it work, so I decided to take a break for a couple of days and stop thinking about it.&lt;br&gt;
This turned out as a very good idea, eventually I was able to solve the problem 🥳.&lt;/p&gt;
&lt;h2&gt;
  
  
  Configure Auth0
&lt;/h2&gt;

&lt;p&gt;If you don't have an Auth0 account yet, you should head over to their &lt;a href="https://auth0.com/signup" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; page to create one.&lt;br&gt;
Auth0 offers a generous free tier, which offers passwordless user accounts, two social identity providers (like Google, Facebook, Twitter or GitHub) and support in their &lt;a href="https://community.auth0.com/" rel="noopener noreferrer"&gt;community&lt;/a&gt;.&lt;br&gt;
For this tutorial and smaller side projects the free plan should be adequate.&lt;/p&gt;
&lt;h3&gt;
  
  
  Create API
&lt;/h3&gt;

&lt;p&gt;When you're logged in to your dashboard, navigate to the &lt;em&gt;APIs&lt;/em&gt; section and create an new API by hitting the &lt;em&gt;Create API&lt;/em&gt; button.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zmmi9b4bwui1abg8tgp.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zmmi9b4bwui1abg8tgp.png" alt="Create API" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You are then prompted for an API name and an identifier.&lt;br&gt;
Auth0 suggests to use the url as identifier and a friendly name for you API.&lt;br&gt;
The signing algorithm should be left with the default option (RS256).&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhopd9f5dxlnujvqngkt.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhopd9f5dxlnujvqngkt.png" alt="Create API" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Create Application
&lt;/h3&gt;

&lt;p&gt;Auth0 asks for a type when you're creating a new application.&lt;br&gt;
For this example, the type doesn't matter. For a publicly available application, you might want to read more about &lt;a href="https://auth0.com/docs/applications/concepts/app-types-auth0" rel="noopener noreferrer"&gt;application types&lt;/a&gt; to choose a type that fits your purpose.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ma4g8fr6g2l72jqyptj.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ma4g8fr6g2l72jqyptj.png" alt="Create Application" width="800" height="794"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvcq7k61wiplz630458zr.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvcq7k61wiplz630458zr.png" alt="Create Application" width="800" height="692"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyn28n40ag22wze4u79og.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyn28n40ag22wze4u79og.png" alt="Create Application" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the application was created, you need to configure an allowed callback URL. A callback URL is a location to which a user can be redirected after successfully authenticating.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwd4nwro0qfhnnqsu8dc.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwd4nwro0qfhnnqsu8dc.png" alt="Add Callback URL" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Enable Auth0 Management API
&lt;/h3&gt;

&lt;p&gt;Because we also want to read the profile of an authenticated user later on, we have to activate the Auth0 Management API for the application we just created.&lt;br&gt;
The configuration for activating the Auth0 Management API can be found in the &lt;em&gt;APIs&lt;/em&gt; tab.&lt;br&gt;
Additionally the &lt;em&gt;read:users&lt;/em&gt; scope has to be selected.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0mc05tm58yqsrfmu15wf.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0mc05tm58yqsrfmu15wf.png" alt="Enable Auth0 Management API " width="800" height="772"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Login
&lt;/h3&gt;

&lt;p&gt;We will need to generate an access token to use the API later. The token is generated via the Auth0 login form.&lt;br&gt;
The login form is provided by Auth0 and accessible on your Auth0 tenant domain.&lt;br&gt;
You'll also need your Auth0 client id. Both values can be copied from your application configuration 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhmfq37g6oogwg7uen43.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhmfq37g6oogwg7uen43.png" alt="Get Variables" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Replace the values in the URL and open it in your browser.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://$AUTH0_DOMAIN/authorize?audience=http://localhost:3000&amp;amp;scope=SCOPE&amp;amp;response_type=code&amp;amp;client_id=$AUTH0_CLIENT_ID&amp;amp;redirect_uri=http://localhost:4200/login&amp;amp;state=STATE?prompt=none&lt;/code&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80q6aipwsxzloajzpanz.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80q6aipwsxzloajzpanz.png" alt="Login" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you've logged in with an SSO provider (Google is configured by default) or by using an email and password.&lt;br&gt;
The login form will then redirect you to &lt;a href="http://localhost:4200/login" rel="noopener noreferrer"&gt;http://localhost:4200/login&lt;/a&gt;, which we configured before.&lt;br&gt;
We don't care that there is no web application running, but you need to copy the value of the &lt;code&gt;code&lt;/code&gt; query parameter and save it for later.&lt;br&gt;
The &lt;code&gt;code&lt;/code&gt; is required to generate the Bearer token.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcmimdj7l080dzl9odrx.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcmimdj7l080dzl9odrx.png" alt="Login" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Upate User Metadata
&lt;/h3&gt;

&lt;p&gt;A great thing about Auth0 is, that you can attach metadata to user profiles.&lt;br&gt;
You could use user metadata to link a user profile to other services (e.g. GitHub or dev.to profile) - I am sure you will find many other use cases.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxtwubm3pibqzgzqph0e.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxtwubm3pibqzgzqph0e.png" alt="User" width="800" height="648"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxinh24487p9isy3ru5kc.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxinh24487p9isy3ru5kc.png" alt="User" width="800" height="688"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Create new NestJS Application
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @nestjs/cli
&lt;span class="nv"&gt;$ &lt;/span&gt;nest new nestjs-auth0-jwt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If everything went well, a new NestJS application was created with the following directory structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nestjs-auth0-jwt
├── src
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   └── main.ts
├── test
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── README.md
├── nest-cli.json
├── package-lock.json
├── package.json
├── tsconfig.build.json
├── tsconfig.json
└── tslint.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Run Application
&lt;/h3&gt;

&lt;p&gt;Navigate to the new directory and start the API:&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;nestjs-auth0-jwt
&lt;span class="nv"&gt;$ &lt;/span&gt;npm run start:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once the application is running, you can open your browser and head to &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv6kk3r0taqtvltm43z9.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv6kk3r0taqtvltm43z9.png" alt="Run Application" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Add dependencies
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt; @nestjs/passport passport passport-jwt jwks-rsa auth0
&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @types/passport-jwt @types/auth0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create Auth Module
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nest generate module auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create JWT Strategy
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;auth/jwt.strategy.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;passportJwtSecret&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jwks-rsa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ExtractJwt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Strategy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;VerifiedCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;passport-jwt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UnauthorizedException&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PassportStrategy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/passport&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JwtStrategy&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PassportStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Strategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;secretOrKeyProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;passportJwtSecret&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;jwksRequestsPerMinute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;jwksUri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.well-known/jwks.json`&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;

      &lt;span class="na"&gt;jwtFromRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ExtractJwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromAuthHeaderAsBearerToken&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
      &lt;span class="na"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/`&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;VerifiedCallback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UnauthorizedException&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;1: &lt;code&gt;ExtractJwt.fromAuthHeaderAsBearerToken()&lt;/code&gt;: Creates a new extractor that looks for the JSON Web Token in the authorization header with the scheme 'bearer'.&lt;/p&gt;

&lt;p&gt;2: If no payload is received, the authentication failed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Update AuthModule
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PassportModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/passport&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;JwtStrategy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./jwt.strategy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;PassportModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;JwtStrategy&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;JwtStrategy&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create API Endpoints
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ManagementClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UseGuards&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AuthGuard&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/passport&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AppService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;appService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AppService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;getHello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;UseGuards&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AuthGuard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jwt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
  &lt;span class="nf"&gt;secretEndpoint&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;this endpoint should be protected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;UseGuards&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AuthGuard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jwt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authZero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ManagementClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="c1"&gt;// 3&lt;/span&gt;
      &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_CLIENT_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_CLIENT_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;read:users update:users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;authZero&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sub&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;1: Public available API endpoint.&lt;/p&gt;

&lt;p&gt;2: &lt;code&gt;@UseGuards(AuthGuard('jwt'))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3: Create Auth0 Management API Client.&lt;/p&gt;

&lt;p&gt;4: The subject in the JWT response is identical to the Auth0 User ID. So the &lt;code&gt;sub&lt;/code&gt; property is used as &lt;code&gt;id&lt;/code&gt; parameter for the &lt;code&gt;getUser&lt;/code&gt; call, which returns the entire user profile.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use Login Code to retrieve Bearer-Token
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AUTH0_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AUTH0_CLIENT_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AUTH0_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AUTH0_CLIENT_SECRET&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CODE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "grant_type": "authorization_code",
  "client_id": "'&lt;/span&gt;&lt;span class="nv"&gt;$AUTH0_CLIENT_ID&lt;/span&gt;&lt;span class="s1"&gt;'",
  "client_secret": "'&lt;/span&gt;&lt;span class="nv"&gt;$AUTH0_CLIENT_SECRET&lt;/span&gt;&lt;span class="s1"&gt;'",
  "code": "'&lt;/span&gt;&lt;span class="nv"&gt;$CODE&lt;/span&gt;&lt;span class="s1"&gt;'",
  "redirect_uri": "http://localhost:4200"
}'&lt;/span&gt; https://&lt;span class="nv"&gt;$AUTH0_DOMAIN&lt;/span&gt;/oauth/token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"access_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9EQXpOMEZHTWpBd1FVUTJORFpETXpBMVJETXdSRUUyTjBSRE5qRXpNemRFUWtNMk5URTFNUSJ9.eyJpc3MiOiJodHRwczovL25lc3Rqcy1hdXRoMC1qd3QuYXUuYXV0aDAuY29tLyIsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTEzMDc2NzYwNTUyNTQ5MTY1ODQ5IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaWF0IjoxNTY1OTg1MzU3LCJleHAiOjE1NjYwNzE3NTcsImF6cCI6IjR0eFZVSm5ZVlRhbzRsczA2dFozRGNCdm5JVk9uY01RIn0.U3dVcaFPY5ZHlz9sntx3O2Svz_HfapBpryrUB9ipIdoIHgu_Skp40FGaLu0Fx-_Uo2GE4pfvM-XR1bQgQGyVbMhALpe2CZrKKCe9k1v4VZ_zxwhYDdV8WNr99jmbMtnm_I9rZIz3YU9dyjWlV_ktHV0bPHj1wIjBUrUc9P_EF5Vw3CeNMxlFXZ2xYldT9XdYUotJHIoJ-e_KWo0hMn_qF5xvWxD-RJIQL7G2ZxEcsmMe9JovwZoAnoqaIyutMP8g7X1UfoTGs-Fa6B1xXhtrYBms--sm_FrM5w0rjIyOuyujulPTeXO8_CbuL1Yz5kCcBsuJdXTiyTcTV9R8W0f4Rg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Run Application
&lt;/h3&gt;

&lt;p&gt;Replace the variables &lt;code&gt;${AUTH0_DOMAIN}&lt;/code&gt;, &lt;code&gt;${AUTH0_CLIENT_ID}&lt;/code&gt; and &lt;code&gt;${AUTH0_CLIENT_SECRET}&lt;/code&gt; with your previously saved values and start the NestJS application.&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AUTH0_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AUTH0_CLIENT_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AUTH0_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AUTH0_CLIENT_SECRET&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;npm run start:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Make Requests without Authentication
&lt;/h3&gt;

&lt;p&gt;Once the Application is running, use cURL to access the API endpoints &lt;code&gt;/secret&lt;/code&gt; and &lt;code&gt;/profile&lt;/code&gt;.&lt;br&gt;
You will get a 401 (Unauthorized) error because both endpoints have been marked with the &lt;code&gt;AuthGuard&lt;/code&gt; annotation and are therefore not publicly available.&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="nv"&gt;$ &lt;/span&gt;curl http://localhost:3000/secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://localhost:3000/profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Make Requests with Authentication
&lt;/h3&gt;

&lt;p&gt;Now you can run the same requests but provide the access token via the &lt;code&gt;Authorization&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;Because you previously authorized yourself, you can now address the two private endpoints &lt;code&gt;/secret&lt;/code&gt; and &lt;code&gt;/profile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/profile&lt;/code&gt; endpoint also returns your profile information from Auth0, which we received from the Auth0 Management API.&lt;/p&gt;

&lt;p&gt;The Auth0 Management API uses the &lt;code&gt;sub&lt;/code&gt; (subject) field from the JWT response to retrieve your user profile.&lt;br&gt;
For documentation reasons, the JWT response in the example application is logged to the console.&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="nv"&gt;$ &lt;/span&gt;curl http://localhost:3000/secret &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9EQXpOMEZHTWpBd1FVUTJORFpETXpBMVJETXdSRUUyTjBSRE5qRXpNemRFUWtNMk5URTFNUSJ9.eyJpc3MiOiJodHRwczovL25lc3Rqcy1hdXRoMC1qd3QuYXUuYXV0aDAuY29tLyIsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTEzMDc2NzYwNTUyNTQ5MTY1ODQ5IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaWF0IjoxNTY1OTg1MzU3LCJleHAiOjE1NjYwNzE3NTcsImF6cCI6IjR0eFZVSm5ZVlRhbzRsczA2dFozRGNCdm5JVk9uY01RIn0.U3dVcaFPY5ZHlz9sntx3O2Svz_HfapBpryrUB9ipIdoIHgu_Skp40FGaLu0Fx-_Uo2GE4pfvM-XR1bQgQGyVbMhALpe2CZrKKCe9k1v4VZ_zxwhYDdV8WNr99jmbMtnm_I9rZIz3YU9dyjWlV_ktHV0bPHj1wIjBUrUc9P_EF5Vw3CeNMxlFXZ2xYldT9XdYUotJHIoJ-e_KWo0hMn_qF5xvWxD-RJIQL7G2ZxEcsmMe9JovwZoAnoqaIyutMP8g7X1UfoTGs-Fa6B1xXhtrYBms--sm_FrM5w0rjIyOuyujulPTeXO8_CbuL1Yz5kCcBsuJdXTiyTcTV9R8W0f4Rg'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://localhost:3000/profile &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9EQXpOMEZHTWpBd1FVUTJORFpETXpBMVJETXdSRUUyTjBSRE5qRXpNemRFUWtNMk5URTFNUSJ9.eyJpc3MiOiJodHRwczovL25lc3Rqcy1hdXRoMC1qd3QuYXUuYXV0aDAuY29tLyIsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTEzMDc2NzYwNTUyNTQ5MTY1ODQ5IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaWF0IjoxNTY1OTg1MzU3LCJleHAiOjE1NjYwNzE3NTcsImF6cCI6IjR0eFZVSm5ZVlRhbzRsczA2dFozRGNCdm5JVk9uY01RIn0.U3dVcaFPY5ZHlz9sntx3O2Svz_HfapBpryrUB9ipIdoIHgu_Skp40FGaLu0Fx-_Uo2GE4pfvM-XR1bQgQGyVbMhALpe2CZrKKCe9k1v4VZ_zxwhYDdV8WNr99jmbMtnm_I9rZIz3YU9dyjWlV_ktHV0bPHj1wIjBUrUc9P_EF5Vw3CeNMxlFXZ2xYldT9XdYUotJHIoJ-e_KWo0hMn_qF5xvWxD-RJIQL7G2ZxEcsmMe9JovwZoAnoqaIyutMP8g7X1UfoTGs-Fa6B1xXhtrYBms--sm_FrM5w0rjIyOuyujulPTeXO8_CbuL1Yz5kCcBsuJdXTiyTcTV9R8W0f4Rg'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;I hope that this article will give you an idea of how you can implement an authentication provider like Auth0 in your NestJS application.&lt;/p&gt;

&lt;p&gt;It was very cumbersome for me to get Auth0 and authentication integrated in my project, but eventually I got it working and that felt really awesome.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1162067806109732864-500" src="https://platform.twitter.com/embed/Tweet.html?id=1162067806109732864"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1162067806109732864-500');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1162067806109732864&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1162068298395258880-372" src="https://platform.twitter.com/embed/Tweet.html?id=1162068298395258880"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1162068298395258880-372');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1162068298395258880&amp;amp;theme=dark"
  }



&lt;/p&gt;


&lt;div class="liquid-comment"&gt;
    &lt;div class="details"&gt;
      &lt;a href="/matthias"&gt;
        &lt;img class="profile-pic" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155010%2F275e06a3-0814-4de5-9d48-f3154ff9ad09.JPG" alt="matthias profile image"&gt;
      &lt;/a&gt;
      &lt;a href="/matthias"&gt;
        &lt;span class="comment-username"&gt;Matthias 🤖&lt;/span&gt;
      &lt;/a&gt;
      &lt;span class="color-base-30 px-2 m:pl-0"&gt;•&lt;/span&gt;

&lt;a href="https://dev.to/matthias/comment/e8an" class="comment-date crayons-link crayons-link--secondary fs-s"&gt;
  &lt;time class="date-short-year"&gt;
    Aug 17 '19
  &lt;/time&gt;

&lt;/a&gt;

    &lt;/div&gt;
    &lt;div class="body"&gt;
      

&lt;p&gt;I was not able to get Auth0 authentication working in my NestJS project. I also asked for help here:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/fullstack_to" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--uSIxKaA3--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--TGkmnCxZ--%2Fc_fill%252Cf_auto%252Cfl_progressive%252Ch_150%252Cq_auto%252Cw_150%2Fhttps%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F155010%2F62c62cbe-3642-4063-b62f-d236d4733754.jpg" alt="fullstack_to image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/fullstack_to/using-jwt-authentication-auth0-with-nestjs-54oo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Using JWT-Authentication (Auth0) with NestJS 🔐&lt;/h2&gt;
      &lt;h3&gt;Matthias 🤖 ・ Aug 14 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#help&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;I was struggling with this problem for a few days, I then took a break and didn't touch my code for a day or so.&lt;br&gt;
I started again with a clean mind and could solve problem within an hour 🥳.&lt;/p&gt;

&lt;p&gt;That's why I love programming, you always have this great moments when you achieved something 💪&lt;br&gt;
And &lt;em&gt;normally&lt;/em&gt; you have this little breakthroughs every few hours or days (depending on the size of your projects). For me, that's the most motivating thing in my job!&lt;/p&gt;

&lt;p&gt;BTW: I'm writing an article on how I solved it 😉.&lt;/p&gt;



    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I also think that the NestJS documentation on &lt;a href="https://docs.nestjs.com/techniques/authentication" rel="noopener noreferrer"&gt;Authentication&lt;/a&gt; could be improved to make it easier for people to implement it right and avoid security breaches. However, I don't complain, NestJS is open source and everyone could &lt;a href="https://github.com/nestjs/docs.nestjs.com/edit/master/content/techniques/authentication.md" rel="noopener noreferrer"&gt;improve&lt;/a&gt; the documentation.&lt;/p&gt;

&lt;p&gt;If you have any questions about NestJS, Auth0 or another topic, don't hesitate to write me a DM on &lt;a href="https://twitter.com/fullstack_to" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, &lt;a href="https://dev.to/connect/@fullstack_to"&gt;dev.to&lt;/a&gt; or write me a mail: &lt;a href="//mailto:yo@fullstack.to"&gt;yo@fullstack.to&lt;/a&gt;. I'm happy to help you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.nestjs.com/" rel="noopener noreferrer"&gt;NestJS documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://auth0.com" rel="noopener noreferrer"&gt;Auth0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://auth0.com/docs/api/management/v2" rel="noopener noreferrer"&gt;Auth0 Management API documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you like my content, you might want to follow me on Twitter?! &lt;a href="https://twitter.com/fullstack_to" rel="noopener noreferrer"&gt;@fullstack_to&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@jeisblack" rel="noopener noreferrer"&gt;Jason Blackeye&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/8yYAaguVDgY" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Using JWT-Authentication (Auth0) with NestJS 🔐</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Wed, 14 Aug 2019 14:21:37 +0000</pubDate>
      <link>https://dev.to/matthias/using-jwt-authentication-auth0-with-nestjs-54oo</link>
      <guid>https://dev.to/matthias/using-jwt-authentication-auth0-with-nestjs-54oo</guid>
      <description>&lt;p&gt;I'm trying to secure my &lt;a href="https://nestjs.com" rel="noopener noreferrer"&gt;NestJS&lt;/a&gt; based API with &lt;a href="//https:/auth0.com"&gt;Auth0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It doesn't feel right what I'm doing at this moment 🥴.&lt;/p&gt;

&lt;p&gt;I tried to use the &lt;a href="https://docs.nestjs.com/techniques/authentication" rel="noopener noreferrer"&gt;NestJS documentation&lt;/a&gt; and also the &lt;a href="https://auth0.com/blog/full-stack-typescript-apps-part-1-developing-backend-apis-with-nestjs/" rel="noopener noreferrer"&gt;Developing Backend APIs with Nest.js&lt;/a&gt; from Auth0 but I don't know what I'm doing.&lt;/p&gt;

&lt;p&gt;Did anyone of you solved this problem already?&lt;br&gt;
Can you provide some good resources or advice?&lt;/p&gt;

&lt;p&gt;Here is my strategy implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;passportJwtSecret&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jwks-rsa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ExtractJwt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Strategy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;VerifiedCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;passport-jwt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UnauthorizedException&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PassportStrategy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/passport&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JwtStrategy&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PassportStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Strategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;secretOrKeyProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;passportJwtSecret&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;jwksRequestsPerMinute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;jwksUri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;${DOMAIN}/.well-known/jwks.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="na"&gt;jwtFromRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ExtractJwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromAuthHeaderAsBearerToken&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;${DOMAIN}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;VerifiedCallback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UnauthorizedException&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;In the controller I use an &lt;em&gt;AuthGuard&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@UseGuards(AuthGuard('jwt'))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also want to retrieve the authenticated user's metadata from Auth0. Did anyone figure out how to do that? &lt;/p&gt;

</description>
      <category>help</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>Do you use Udemy? Which courses are you enrolled in?</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Tue, 13 Aug 2019 06:08:35 +0000</pubDate>
      <link>https://dev.to/matthias/do-you-use-udemy-which-courses-are-you-enrolled-in-of0</link>
      <guid>https://dev.to/matthias/do-you-use-udemy-which-courses-are-you-enrolled-in-of0</guid>
      <description>&lt;p&gt;Do you use Udemy to learn new technologies, programming languages or other skills?&lt;/p&gt;

&lt;p&gt;How you do get the most out of your course?&lt;br&gt;
Which courses are you enrolled in?&lt;/p&gt;

&lt;p&gt;I bought the following courses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/docker-mastery/learn/" rel="noopener noreferrer"&gt;Docker Mastery: The Complete Toolset From a Docker Captain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/certified-kubernetes-application-developer/learn/" rel="noopener noreferrer"&gt;Kubernetes Certified Application Developer (CKAD)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/learn-devops-the-complete-kubernetes-course/learn/" rel="noopener noreferrer"&gt;Learn DevOps: The Complete Kubernetes Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udemy.com/complete-react-developer-zero-to-mastery/learn/" rel="noopener noreferrer"&gt;Complete React Developer in 2019 (w/ Redux, Hooks, GraphQL)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to learn Docker I can absolutely recommend the Docker Mastery course by Bret Fisher 👍&lt;/p&gt;

&lt;p&gt;Fortunately, Udemy has many offerings, so that you can often buy courses for little money 🤑.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Milestones / Reflecting things</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Tue, 06 Aug 2019 06:27:49 +0000</pubDate>
      <link>https://dev.to/matthias/milestones-reflecting-things-22n1</link>
      <guid>https://dev.to/matthias/milestones-reflecting-things-22n1</guid>
      <description>&lt;p&gt;Sometimes it is quite nice to reflect on what you have already achieved in life. Here, I only focus on tech things that I've learned since I started software development 20 years ago.&lt;/p&gt;

&lt;p&gt;There were also some technologies or programming languages which I started to learn but abandoned at some point. I marked them with this emoji: 🏚.&lt;/p&gt;

&lt;h5&gt;
  
  
  20 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;QBasic 🏚&lt;/li&gt;
&lt;li&gt;I found a QBasic IDE on some computer games magazine's disk. I was immediately caught and wanted to learn more about programming. I started by printing out source code and read it. A few weeks later I started by coding a simple quiz application.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  19 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Visual Basic 6 🏚&lt;/li&gt;
&lt;li&gt;As my parents realized that I really like computer programming, they bought me a book like &lt;em&gt;Visual Basic for Kids&lt;/em&gt;. I spent every minute learning Visual Basic. Eventually, I wrote an application that split large files into smaller chunks (floppy disk were still a thing in 2000), which was featured in a computer magazine 🥳&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  17 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Blitz BASIC, HTML and CSS&lt;/li&gt;
&lt;li&gt;Because I already was familiar with the BASIC dialect, I looked for a way to write computer games, so I discovered &lt;a href="https://en.wikipedia.org/wiki/Blitz_BASIC" rel="noopener noreferrer"&gt;Blitz BASIC&lt;/a&gt;. It was easy for me to write simple 2d graphic games. A benefit of learning Blitz BASIC was, that there was a very active and helpful community in Germany.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  15 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;PHP, MySQL and JavaScript 🏚&lt;/li&gt;
&lt;li&gt;I launched my first website fifteen years ago (a platform where anyone could upload replays of &lt;a href="https://en.wikipedia.org/wiki/Pro_Evolution_Soccer_3" rel="noopener noreferrer"&gt;Pro Evolution Soccer 3&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  14 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Linux and server administration&lt;/li&gt;
&lt;li&gt;I ordered my first virtual server to install a Counter-Strike game server and an IRC bouncer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  13 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Network administration, Active Directory&lt;/li&gt;
&lt;li&gt;I began an apprenticeship as IT administrator in late 2006. No coding was involved, I didn't really like that job, but it taught me many computer science basic which are still helpful.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  10 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Java, JavaScript, PHP, MySQL, MSSQL, C++, C#, Assembler&lt;/li&gt;
&lt;li&gt;Sounds like I learned a lot in this year. I started studying computer science after I finished my apprenticeship. It was very practical and I learned many programming languages and database systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  7 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Java, Java EE, Spring Framework, Apache Tomcat, JBoss&lt;/li&gt;
&lt;li&gt;I landed my first job as software engineer in 2012 🥳. Everything I learned so far was nice and came helpful, but when you start working, you realize that you know nothing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  6 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;AngularJS 🏚, jQuery 🏚, REST APIs&lt;/li&gt;
&lt;li&gt;Only backend coding make me go crazy. I wanted to learn some technologies where I actually was able to show what I've done. I started learning AngularJS with an online course from CodeSchool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  5 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Node.js, Docker 🐳&lt;/li&gt;
&lt;li&gt;My first contact with DevOps technologies, more precisely Docker. &lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  4 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Jenkins, REST APIs, Swift 🏚, Android 🏚&lt;/li&gt;
&lt;li&gt;I started working for a new company where I developed the backend system for a mobile application. Because I wanted to have some basic knowledge of the apps, I started to learn Swift and Android.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  3 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Docker 🐳&lt;/li&gt;
&lt;li&gt;Docker again, but this time a little more specific.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  2 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript, Angular&lt;/li&gt;
&lt;li&gt;I have again changed to a new employer. &lt;/li&gt;
&lt;li&gt;This time I learned TypeScript and because I am doing more full stack work, I also had to learn Angular.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  1 year ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes, React&lt;/li&gt;
&lt;li&gt;When Docker Cloud was shut down last year, we were looking for a new way to host our services, we decided to go with Kubernetes. I don't regret this choice so far.&lt;/li&gt;
&lt;li&gt;I also did some more front end development, React ⚛️ has replaced Angular a bit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  0.5 years ago
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;GatsbyJS ❤️, Headless CMS, JAMstack&lt;/li&gt;
&lt;li&gt;I built some websites for friends and local businesses. In my opinion static site generators and headless content management systems are the state-of-the-art nowadays.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you like my content, you might want to follow me on Twitter?! &lt;a href="https://twitter.com/fullstack_to" rel="noopener noreferrer"&gt;@fullstack_to&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@goian?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Ian Schneider&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/TamMbr4okv4?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>meta</category>
      <category>showdev</category>
    </item>
    <item>
      <title>What's your favorite sports team?</title>
      <dc:creator>Matthias 🤖</dc:creator>
      <pubDate>Tue, 30 Jul 2019 06:18:09 +0000</pubDate>
      <link>https://dev.to/matthias/what-s-your-favorite-sports-team-4hkl</link>
      <guid>https://dev.to/matthias/what-s-your-favorite-sports-team-4hkl</guid>
      <description>&lt;p&gt;Soccer ⚽️ is the major sports in Germany. I am also a big fan and regularly visit home and away matches of my favorite team Hannover 96. They currently play in the second division. I own a season ticket (which does not cost more than 170 USD) so I can visit all home matches if I want to.&lt;/p&gt;

&lt;p&gt;I also watch American Football 🏈 lately. American Football gets a lot of screen time in German TV lately, however I am not that much into the rules and tactics. My favorite teams in Football are the 49ers (I traveled to San Francisco a few times and I really like the city) and the Dallas Cowboys.&lt;/p&gt;

&lt;p&gt;What are your favorite sports teams?&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
  </channel>
</rss>
