<?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: Robertino</title>
    <description>The latest articles on DEV Community by Robertino (@robertinoc_dev).</description>
    <link>https://dev.to/robertinoc_dev</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%2F426331%2Fa2be3362-f2b1-451a-a866-62bfece02f4d.png</url>
      <title>DEV Community: Robertino</title>
      <link>https://dev.to/robertinoc_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robertinoc_dev"/>
    <language>en</language>
    <item>
      <title>February 2025 Updates: What's New in Auth0</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Wed, 12 Mar 2025 18:12:05 +0000</pubDate>
      <link>https://dev.to/auth0/february-2025-updates-whats-new-in-auth0-1jak</link>
      <guid>https://dev.to/auth0/february-2025-updates-whats-new-in-auth0-1jak</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post published on &lt;a href="https://auth0.com/blog/february-2025-updates-whats-new-in-auth0/" rel="noopener noreferrer"&gt;Auth0 Blog&lt;/a&gt;. Written by Ana Cidre.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Discover the latest releases, updates, events, and all things developer-related from Auth0!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the ever-evolving world of application development, managing identity is no small feat. But with the right tools, you can streamline your security and user management like never before. In this recap, we’ll dive into the latest updates from Auth0, showcasing how we’re enhancing your development experience with new features, integrations, and updates that bring both simplicity and power to the forefront.&lt;/p&gt;

&lt;p&gt;Let’s explore the key updates you’ll want to know about and see how they can help you streamline your identity management, bolster security, and deliver more powerful, user-centric applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updates You Don’t Want to Miss
&lt;/h2&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%2Fhy9wdp76gcllwpv20cg1.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%2Fhy9wdp76gcllwpv20cg1.png" alt="Auth0 Next.js SDK" width="600" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Next.js SDK v4 (GA) Released
&lt;/h3&gt;

&lt;p&gt;If you’re a &lt;strong&gt;Next.js&lt;/strong&gt; developer, this update will significantly enhance your workflow. With &lt;strong&gt;Next.js SDK v4&lt;/strong&gt;, now fully compatible with &lt;strong&gt;Next.js 15&lt;/strong&gt; and &lt;strong&gt;React 19&lt;/strong&gt;, you can take advantage of cutting-edge features like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Middleware-Based Authentication&lt;/strong&gt;: A streamlined approach that makes authentication management easier and reduces maintenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved Security&lt;/strong&gt;: Encrypted cookies replace outdated logic, bringing your app's security up to date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Session Management&lt;/strong&gt;: Features like rolling sessions and custom database support ensure a smoother user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This update is designed to help you take full advantage of the latest web development advancements without sacrificing security or performance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Advanced Customizations for Universal Login (Early Access)
&lt;/h3&gt;

&lt;p&gt;For customers who want to take their Universal Login experience to the next level, we’ve launched Advanced Customizations for Universal Login (ACUL) in Early Access. ACUL enables you to create fully custom, client-rendered versions of each Universal Login screen. With ACUL, you get full control over every pixel of the login and signup screens.&lt;/p&gt;

&lt;p&gt;Supported flows include Single Step Signup/Login, ID First Signup/Login with various authentication methods (password, passwordless, passkeys, etc.), and more.&lt;/p&gt;

&lt;p&gt;This is just the beginning, with more features and a new configuration UI coming in the months ahead. &lt;a href="https://auth0.com/docs/customize/login-pages/advanced-customizations" rel="noopener noreferrer"&gt;Check out the online documentation&lt;/a&gt; for all the details, and start building today!&lt;/p&gt;

&lt;h3&gt;
  
  
  Okta Universal Logout Integration Now Supported in Auth0
&lt;/h3&gt;

&lt;p&gt;For teams using &lt;strong&gt;Okta&lt;/strong&gt; to manage their workforce identity, we’re rolling out &lt;a href="https://auth0.com/blog/okta-universal-logout-integration-now-supported-in-auth0/" rel="noopener noreferrer"&gt;Universal Logout&lt;/a&gt; integration with Auth0. This update means you no longer need to build a global token revocation endpoint. Instead, when Okta detects a change in risk, it will automatically revoke sessions and refresh tokens.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It’s a simple &lt;strong&gt;integration&lt;/strong&gt; with minimal configuration, but the &lt;strong&gt;security&lt;/strong&gt; benefits are huge, making it easier for you to ensure your applications are always up-to-date and protected.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Custom Token Exchange – Early Access
&lt;/h3&gt;

&lt;p&gt;We’re thrilled to announce&lt;a href="https://auth0.com/docs/custom-token-exchange-early-access" rel="noopener noreferrer"&gt; Custom Token Exchange&lt;/a&gt; in Early Access. This OAuth grant-type feature allows you to exchange security tokens for other tokens, such as access tokens and offers flexibility using Actions for custom logic.&lt;/p&gt;

&lt;p&gt;This new feature enables advanced use cases like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrating users to Auth0&lt;/li&gt;
&lt;li&gt;Integrating external IDPs&lt;/li&gt;
&lt;li&gt;Exchanging Auth0 tokens for different audiences&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Custom Token Exchange&lt;/strong&gt; provides the flexibility you need to handle sophisticated integrations where regular federation and OIDC flows aren’t feasible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  More cool features we have shipped to improve your experience:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimised TOTP Enrollment for Mobile Devices:&lt;/strong&gt; We’ve made the process of enrolling in TOTP (Time-Based One-Time Password) on mobile devices more intuitive. Check out &lt;a href="https://auth0.com/docs/secure/multi-factor-authentication/auth0-guardian#temporary-one-time-passwords" rel="noopener noreferrer"&gt;&lt;strong&gt;Auth0 Temporary OTP&lt;/strong&gt;&lt;/a&gt; for more details!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Email OTP Verification – Email OTP(One Time Password) Verification:&lt;/strong&gt; is now Generally Available (GA), providing an additional layer of security during signup and password reset. This feature requires &lt;strong&gt;Universal Login&lt;/strong&gt; and can be enabled by changing the &lt;strong&gt;Verification Method&lt;/strong&gt; from Verification Link to OTP in your connection settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Usage Metrics Dashboard for Auth0 FGA:&lt;/strong&gt; We’re introducing the &lt;strong&gt;Usage Metrics Dashboard&lt;/strong&gt; for &lt;strong&gt;Auth0 Fine-Grained Authorization (FGA)&lt;/strong&gt;. This new tool gives teams deep visibility into their authorization usage, enabling more efficient monitoring and management of monthly active users, total number of tuples, and monthly average requests per second.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New Private Cloud Region in India:&lt;/strong&gt; We’ve expanded our Private Cloud availability by adding a new region in Hyderabad. This follows the Mumbai AWS region in India, providing additional flexibility, reduced latency, and improved data residency options for Auth0 customers in the region.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deprecations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Node.js 12 and 16 Extensibility Runtimes Deprecation:&lt;/strong&gt; We’re phasing out the Node.js 12 and 16 runtimes for extensibility integrations, such as Actions, Rules, Hooks, Custom Database Connections, and Custom Social Connections. If you’re using these runtimes, we strongly recommend migrating to Node.js 22, which is our recommended runtime for all new and existing extensibility integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unwarranted Session Removal After User Updates (Deprecated):&lt;/strong&gt; In a bid to improve the user experience, we’ve deprecated the automatic invalidation of user sessions when performing database connection user updates with unchanged email or &lt;code&gt;email_verified&lt;/code&gt; attributes. This change will ensure that the session invalidation behavior aligns more closely with the email verification flows. &lt;/p&gt;

&lt;h2&gt;
  
  
  Community and Events
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Partnering with LangChain and LlamaIndex
&lt;/h3&gt;

&lt;p&gt;As Generative AI (GenAI) applications become more powerful, securing these systems becomes essential. The "&lt;a href="https://auth0.com/blog/auth-for-genai/" rel="noopener noreferrer"&gt;Auth for GenAI&lt;/a&gt;" initiative is here to help developers integrate strong authentication and authorization into their GenAI applications, ensuring sensitive data is protected when interacting with external APIs and data sources.&lt;/p&gt;

&lt;p&gt;We’re thrilled to announce our partnerships with &lt;a href="https://auth0.com/blog/building-a-secure-rag-with-python-langchain-and-openfga/" rel="noopener noreferrer"&gt;LangChain&lt;/a&gt; and &lt;a href="https://auth0.com/blog/genai-llamaindex-js-fga/" rel="noopener noreferrer"&gt;LlamaIndex&lt;/a&gt;—two leading frameworks in the GenAI space. Together, we’re demonstrating how Auth0 can seamlessly integrate with these tools to secure your AI applications.&lt;/p&gt;

&lt;p&gt;Key aspects of our collaboration include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework-Specific SDKs&lt;/strong&gt; to simplify the integration of Auth0’s authentication and authorization solutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Informative Developer Content&lt;/strong&gt; that offers best practices, guides, and examples for secure GenAI app development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-Grained Access Control&lt;/strong&gt; using &lt;strong&gt;Auth0 FGA (Fine-Grained Authorization)&lt;/strong&gt;, which ensures that AI applications can securely access external data sources and APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This partnership is a great step toward building secure, scalable, and compliant AI applications. We’re excited to collaborate with &lt;strong&gt;LangChain&lt;/strong&gt; and &lt;strong&gt;LlamaIndex&lt;/strong&gt;, and provide developers with the tools and resources they need to build the next generation of secure AI-powered systems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Together, we’re building the future of secure &lt;strong&gt;Generative AI&lt;/strong&gt;. Let’s innovate and secure the AI applications of tomorrow!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://auth0.com/blog/building-a-secure-rag-with-python-langchain-and-openfga/" rel="noopener noreferrer"&gt;Building a Secure RAG with Python, LangChain, and OpenFGA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://auth0.com/blog/genai-llamaindex-js-fga/" rel="noopener noreferrer"&gt;Build a Secure RAG Agent Using LlamaIndex and Okta FGA on Node.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;At Auth0, we’re passionate about engaging with the developer community and sharing insights at events worldwide. Whether we’re speaking at conferences, hosting workshops, or simply connecting with like-minded developers, we’re excited to be part of the conversations shaping the future of identity and security. Here’s a look at where we’ve been recently and where you can catch us next!&lt;/p&gt;

&lt;h4&gt;
  
  
  Where Were We?
&lt;/h4&gt;

&lt;p&gt;In the past few weeks, we’ve had the privilege of attending some amazing events and meeting incredible developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.jfokus.se/talks/1839" rel="noopener noreferrer"&gt;JFokus&lt;/a&gt; – February 3-6&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.developerweek.com/" rel="noopener noreferrer"&gt;Developer Week&lt;/a&gt; – February 11-13&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://devworldconference.com/" rel="noopener noreferrer"&gt;DevWorld Amsterdam&lt;/a&gt; – February 27-28&lt;/li&gt;
&lt;/ul&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%2Fsk5cr009kzw8kjbl7eov.jpg" 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%2Fsk5cr009kzw8kjbl7eov.jpg" alt="Events" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s been a blast connecting with the community, and if you joined us at any of these events, we hope you had a chance to chat with the team and explore what’s new with Auth0.&lt;/p&gt;

&lt;p&gt;Looking ahead, we’ve got a busy schedule and can’t wait to meet more of you at these upcoming events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://allthingsopen.ai/" rel="noopener noreferrer"&gt;All Things Open AI&lt;/a&gt; – March 17-18&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tech.eu/event/2025/summit-london/" rel="noopener noreferrer"&gt;Tech.eu Summit&lt;/a&gt; – March 25-26&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure to swing by our booth if you’ll be at any of these events, we’d love to talk all things identity, security, and the future of AI-powered applications!&lt;/p&gt;

&lt;p&gt;That’s all for this month! We’re committed to keeping you updated with the latest and greatest features to help you build secure, scalable applications. Stay tuned for more in March!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Power of Parquet</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Tue, 28 Jan 2025 13:09:04 +0000</pubDate>
      <link>https://dev.to/auth0/the-power-of-parquet-ahi</link>
      <guid>https://dev.to/auth0/the-power-of-parquet-ahi</guid>
      <description>&lt;h2&gt;
  
  
  Learn about what Parquet is and how its columnar storage and encoding techniques can help you.
&lt;/h2&gt;



&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://www.linkedin.com/in/joncarl/" rel="noopener noreferrer"&gt;Jon Carl&lt;/a&gt;, Staff Software Engineer at Auth0.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine you are tasked with choosing how to store a large analytical data set that needs to be easily queryable. Billions of rows with over 75 columns. What would you come up with? &lt;/p&gt;

&lt;p&gt;Maybe you reach for a popular cloud database technology such as &lt;a href="https://aws.amazon.com/redshift/" rel="noopener noreferrer"&gt;Amazon RedShift&lt;/a&gt;, &lt;a href="https://www.snowflake.com/" rel="noopener noreferrer"&gt;Snowflake&lt;/a&gt;, or &lt;a href="https://cloud.google.com/sql" rel="noopener noreferrer"&gt;Google Cloud SQL&lt;/a&gt;. Maybe you think &lt;a href="https://www.microsoft.com/en-us/microsoft-365/access" rel="noopener noreferrer"&gt;Microsoft Access&lt;/a&gt; is all you need. Maybe you decide the tried and true &lt;a href="https://www.postgresql.org/" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt; is the best fit. Or maybe you opt for any of the other hundreds of databases out there.&lt;/p&gt;

&lt;p&gt;Someone made the decision for you: each row will be a JSON object on a line in a gzipped file. Some files will have many lines and others will have few lines. To query the data you’ll need to use something that can scan many of these files and read all of the JSON. You still have some part in the decision by choosing what to use for querying. You settle on &lt;a href="https://aws.amazon.com/athena/" rel="noopener noreferrer"&gt;Amazon Athena&lt;/a&gt; which is built on top of &lt;a href="https://prestodb.io/" rel="noopener noreferrer"&gt;Apache Presto&lt;/a&gt; and allows you to query the data using SQL.&lt;/p&gt;

&lt;p&gt;You like the SQL interface, but using gzipped JSON files as the underlying storage is not exactly fast. If you could change the format, what would you choose?&lt;/p&gt;

&lt;p&gt;At Auth0 we recently transitioned our edge logs from gzipped JSON to a format called&lt;a href="https://parquet.apache.org/" rel="noopener noreferrer"&gt; Parquet&lt;/a&gt;. A little background on our data set: the network edge of Auth0 processes over 60 billion requests a month. The logs for these requests arrive from our edge networking partner in gzipped JSON files and is roughly 1 TB of data a day.&lt;/p&gt;

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

&lt;p&gt;At its core, Apache Parquet is a file format which stores data in columns instead of rows. A parquet file is not meant to be read completely from beginning to end. Instead there is metadata at the end of the file which contains information that a reader can use to selectively read portions of the file they are interested in. The less data you have to read, the quicker your reading can be.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Let’s look at an example: I want to calculate the 90th percentile of the request duration column in the data set.&lt;/p&gt;

&lt;h4&gt;
  
  
  JSON
&lt;/h4&gt;

&lt;p&gt;With JSON, the query engine has to read each file in its entirety. For each row it has to read the JSON object at least until it finds the request duration column. Or maybe it has to read the entire JSON object before picking the column out. (This isn’t a JSON parsing blog post, so we won’t investigate further.)&lt;/p&gt;

&lt;h4&gt;
  
  
  Parquet
&lt;/h4&gt;

&lt;p&gt;With Parquet, the query engine reads the metadata in each file. From there, the engine learns where the column values are stored in the file and reads only that data. This is not only faster than reading the entire file, it’s also cheaper in Athena which bills by bytes scanned.&lt;/p&gt;

&lt;p&gt;You could also have Parquet store metadata in one file and reference multiple other files for column locations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Encoding
&lt;/h3&gt;

&lt;p&gt;Let’s look deeper at how Parquet uses different encoding techniques to make reads efficient.&lt;/p&gt;

&lt;h4&gt;
  
  
  Dictionary Encoding
&lt;/h4&gt;

&lt;p&gt;When a column has many of the same values, a dictionary can be built and used to refer to those values. We have a status code column in our logs which refers to the status code returned to the client. Status codes are well known and fit well in a dictionary. The distinct values in the column are assigned an index and then that index is used to refer to the values. &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%2F3kevatm6kj92eamawpmr.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%2F3kevatm6kj92eamawpmr.png" alt="Parquet 01" width="720" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When reading a column there is less to read, and when compressing the data there is less data. Thus, a higher level of compression is achieved. But dictionary encoding does not always make sense; if a column has high cardinality for example, it would not gain much from dictionary encoding.&lt;/p&gt;

&lt;h4&gt;
  
  
  Run Length Encoding (RLE)
&lt;/h4&gt;

&lt;p&gt;Another option is Run Length Encoding (RLE), which can further reduce the size of the column. While dictionary encoding tackles distinct values, RLE tackles consecutive repeated values. When a column has consecutive repeated values, the number of repetitions is encoded followed by the value being repeated. The same status code example can be used here: across hundreds and thousands of rows, the status codes have low cardinality and thus consecutive repeated values are common.&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%2Ffmf5746blvzp3udvudit.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%2Ffmf5746blvzp3udvudit.png" alt="Parquet 02" width="500" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As with dictionary encoding, this means less to read and high compression. RLE is also normally combined with dictionary encoding as they complement each other well.&lt;/p&gt;

&lt;h4&gt;
  
  
  Delta Encoding
&lt;/h4&gt;

&lt;p&gt;The last encoding we will look at is delta encoding, which stores the deltas between consecutive values instead of their full form. We have a duration column which stores the duration of a request in milliseconds. Delta encoding would take the full value of the first item, and then every value after that would be the delta. &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%2Fxjtx91943iv66hna9gd9.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%2Fxjtx91943iv66hna9gd9.png" alt="Parquet 03" width="439" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The smaller the deltas, the more effective delta encoding. Another example for delta encoding would be timestamps stored as millisecond precision 64-bit values. We have multiple requests coming per second, and would have a relatively small delta between values.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can You Get Started With Parquet?
&lt;/h2&gt;

&lt;p&gt;As you can see, Parquet is much more than a format which stores data in columns with metadata. The way it encodes each column, how it uses types to store data more efficiently, or how it handles repeated values are all examples of how purposefully Parquet has been built. There was a lot of thought put into Parquet, and moving to it from JSON was amazing.&lt;/p&gt;

&lt;p&gt;Parquet sounds great, and there are some really cool features to nerd out on, but how can you start using it today? The good news is you don’t need to know all of its inner workings. You don’t need to choose encodings, get into the nitty gritty of how columns are packaged and stored, or have a beefy fleet of DB machines. We started exploring Parquet using DuckDB and grew from there. We had a data set we would run multiple queries on and it was faster for us to first convert it to Parquet and then query it instead of continually querying JSON. For an example dataset it’s as simple as starting DuckDB in your command line and loading an example dataset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;COPY(
  SELECT * FROM
  read_json('https://github.com/grounded042/airports-dataset/raw/226a54bb19535ea8c5e6175a591446e67c4ab44c/airports.json')
) TO 'airports.parquet' (FORMAT PARQUET, COMPRESSION ZSTD);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see the 20 countries with the most airports, you can use the following query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT COUNT(*) as count, iso_country FROM 'airports.parquet' GROUP BY iso_country ORDER BY count DESC LIMIT 20;

┌───────┬─────────────┐
│ count │ iso_country │
│ int64 │   varchar   │
├───────┼─────────────┤
│ 31567 │ US          │
│  7206 │ BR          │
│  3563 │ JP          │
│  3126 │ CA          │
│  2677 │ AU          │
│  2594 │ MX          │
│  1683 │ RU          │
│  1656 │ FR          │
│  1452 │ GB          │
│  1402 │ KR          │
│  1335 │ DE          │
│   942 │ AR          │
│   918 │ IT          │
│   731 │ CO          │
│   726 │ PH          │
│   713 │ CN          │
│   652 │ ZA          │
│   632 │ PG          │
│   625 │ IN          │
│   617 │ ID          │
├───────┴─────────────┤
│ 20 rows   2 columns │
└─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start small with your own JSON data and grow as needed. For us we grew into a Lambda which converts files as they land in S3, but we wouldn’t have gotten there without first exploring things via DuckDB.&lt;/p&gt;

&lt;p&gt;To take things further, DuckDB has a great blog post which gives you first hand experience with Parquet:&lt;a href="https://duckdb.org/2021/06/25/querying-parquet.html" rel="noopener noreferrer"&gt; https://duckdb.org/2021/06/25/querying-parquet.html&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What Are Modern Access Controls and How Are They Implemented?</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Mon, 27 Jan 2025 19:03:35 +0000</pubDate>
      <link>https://dev.to/auth0/what-are-modern-access-controls-and-how-are-they-implemented-22a7</link>
      <guid>https://dev.to/auth0/what-are-modern-access-controls-and-how-are-they-implemented-22a7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://www.linkedin.com/in/stevenjarvis/" rel="noopener noreferrer"&gt;Steve Jarvis&lt;/a&gt;, Principal Engineer at Auth0.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Examining the importance of access controls, models for authorization, and how to implement these core components of security.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Access Controls?
&lt;/h2&gt;

&lt;p&gt;Access controls are the mechanisms that manage access to resources. To determine whether someone (or something, like another computer) has access to a resource, an access control system really needs to know two things: 1) who they are, and 2) what they’re allowed to do. These two verifications are generally separate considerations, namely authentication and authorization.&lt;/p&gt;

&lt;p&gt;Access controls in the digital world are similar to those in the physical world. For example, before you board an airplane, someone at the airport verifies your identity by examining your passport (authentication) and boarding pass, which demonstrates your permission to be on the plane (authorization).&lt;/p&gt;

&lt;h2&gt;
  
  
  How Modern Access Control Works
&lt;/h2&gt;

&lt;p&gt;Physical security is important, but for the rest of this article, we’ll focus on digital security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;p&gt;Before a system can make any decisions on access, it must verify a user’s identity. This verification often relies on an identity provider (IdP) that handles the process of authentication. Upon successful authentication, the IdP ultimately issues an assertion of the user’s identity. &lt;/p&gt;

&lt;p&gt;For heightened security, there may be additional factors evaluated by the IdP during authentication, like geographic location, device characteristics, whether the request originates from a trusted network, or a second factor presented by the user.&lt;/p&gt;

&lt;p&gt;With the help of a dedicated IdP, the application doesn’t need to worry about any of the authentication details, including the enforcement of multiple factors (MFA). The applications let the IdP do all the work and simply verify the final assertion—typically SAML or a JWT—to know the identity has been verified.&lt;/p&gt;

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

&lt;p&gt;Once a user’s identity is established, the access control system evaluates what that user can or cannot do. This can be modeled with different types of access controls, but best practices today include role-based access control (RBAC), attribute-based access control (ABAC), and relationship-based access control (ReBAC). One thing all mature models have in common is a way to enforce least privilege, the set of permissions that allows the user to do what they need to do, but nothing more.&lt;/p&gt;

&lt;h4&gt;
  
  
  RBAC
&lt;/h4&gt;

&lt;p&gt;RBAC assigns users to roles and roles to resource permissions. The system starts out simple and easy to establish, but as a system grows in scale and complexity, maintaining the right role assignments and permissions becomes more challenging. &lt;/p&gt;

&lt;p&gt;This is because, as resources and levels of privilege are added to the model, an organization is faced with difficult tradeoffs between an explosion in the number of roles and assignments on one hand and too few, coarse, overly-permissive roles on the other.&lt;/p&gt;

&lt;h4&gt;
  
  
  ABAC
&lt;/h4&gt;

&lt;p&gt;ABAC can be thought of as the next step beyond RBAC, once an organization has outgrown role-based access. In ABAC, all users and resources in the system are assigned attributes, and a set of rules defines the authorization policies between those attributes. &lt;/p&gt;

&lt;p&gt;Defining attributes and the rules evaluating them requires a greater initial investment, but once established it can grow efficiently. Incorporating additional resources or new sets of permissions involves simply adding new attributes and rules, without the direct couplings that exist from user to role and role to resource, as in RBAC. That’s not to imply this growth is without challenges of its own, though, as correlating users, resources, and their attributes often requires data from multiple sources, and there still is overhead to manage the attributes.&lt;/p&gt;

&lt;h4&gt;
  
  
  ReBAC
&lt;/h4&gt;

&lt;p&gt;ReBAC is authorization based on the relationships between a user, a resource, and that resource’s relationship to other resources. You can think of ReBAC as a superset of both RBAC and ABAC (as long as the attributes can be expressed as relationships), as you can also implement both in ReBAC.&lt;/p&gt;

&lt;p&gt;ReBAC is an extremely powerful model, offering great granularity of control, but that granularity often comes at the cost of maintaining many objects and rules, as well as needing to do frequent authorization checks, which can result in a frustratingly slow user experience. &lt;a href="https://www.okta.com/products/fine-grained-authorization/" rel="noopener noreferrer"&gt;Okta’s Fine Grained Authorization (FGA)&lt;/a&gt; addresses these challenges by making authorization changes fully programmable and scaling seamlessly to ensure low-latency, even at tens of thousands of authorizations per second across millions of resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Implement Access Controls?
&lt;/h2&gt;

&lt;p&gt;Access controls are how we can ensure that only the right people have the expected access to protected resources. They’re the means to knowing who is allowed to perform which actions on what resources, with the end of knowing that your customer data, sensitive systems, and intellectual property are secure. Malicious actors are an ever-lurking threat in today’s world, constantly watching for opportunities to gain access to other systems. Strong access controls not only minimize the possibility that an untrusted, ill-intentioned user gains access, they also offer preparedness if such an event does happen. Additionally, access controls provide guardrails to help your employees and customers work confidently, demonstrate adherence to critical compliance frameworks, and the ability to respond efficiently in an audit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limit the Likelihood and Impact of Malicious Actors
&lt;/h3&gt;

&lt;p&gt;In some of the worst cases, an untrusted user could gain access to the system. How do access controls help if a malicious user finds a foothold? Whether via a software vulnerability or a session takeover of a trusted user, the malicious user ends up operating behind some other identity in the system, with all the rights and privileges they have granted. The more tightly the authorization controls map to a minimal set of permissions, the greater chance the malicious user’s impact is also minimal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limit the Scope of Innocent Mistakes
&lt;/h3&gt;

&lt;p&gt;It’s not all about blocking malicious use, though. We’ve probably all experienced a moment of panic when we’ve accidentally deleted a document, hit “send” on an email before we meant to, or had a cat jump on the keyboard while you were writing a DM to your boss. Without a mature access model focused on enforcing the least amount of privilege required, there’s the unnecessary risk that such an innocent mistake has an outsized impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compliance and Audit
&lt;/h3&gt;

&lt;p&gt;Many compliance frameworks include provisions about how to maintain access to resources. It’s important to demonstrate that access to resources is well-controlled, documented, and adheres to principles of least privilege. &lt;/p&gt;

&lt;p&gt;Since our world is always changing, it’s also common to need regular updates to a system’s users and resources. A well-designed model can pay dividends in efficiency and accuracy in the long term, as additions, deletions, and changes need to be continually applied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implement Access Controls Now
&lt;/h2&gt;

&lt;p&gt;A modern access control model is paramount for a modern business’ security, efficiency, and trustworthiness. The factors to consider in authentication and the ideal authorization model will vary for different organizations, but the need to implement a system that can grow and evolve is universal. &lt;/p&gt;

&lt;p&gt;Okta can help establish mature access controls for your customers and workforce. If you’re building an access control solution for your workforce or business partners, learn more at &lt;a href="https://www.okta.com/workforce-identity/" rel="noopener noreferrer"&gt;Workforce Identity&lt;/a&gt;. If you’re building access controls for your customers, learn more at &lt;a href="https://www.okta.com/customer-identity/access-management/" rel="noopener noreferrer"&gt;Customer Identity&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can Okta provide industry-leading ReBAC?&lt;/strong&gt;&lt;br&gt;
A: Check out &lt;a href="https://auth0.com/fine-grained-authorization" rel="noopener noreferrer"&gt;Okta Fine Grained Authorization&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Okta Workforce do both RBAC and ABAC?&lt;/strong&gt;&lt;br&gt;
A: Yes, it can.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can these access models be maintained as infrastructure as code&lt;/strong&gt;&lt;br&gt;
A: Workforce Identity Cloud and Customer Identity Cloud offer Terraform providers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://auth0.com/docs/deploy-monitor/auth0-terraform-provider" rel="noopener noreferrer"&gt;https://auth0.com/docs/deploy-monitor/auth0-terraform-provider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.okta.com/docs/guides/terraform-landing-page/main" rel="noopener noreferrer"&gt;https://developer.okta.com/docs/guides/terraform-landing-page/main&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What about the other authorization models, like Hierarchical, Discretionary Access Control, and Mandatory Access Control?&lt;/strong&gt;&lt;br&gt;
A: These models may work well in some contexts (for example, Mandatory Access Control is very popular in government environments). But for most use cases, they end up not meeting the principle of least privilege (with either too much or too little access permitted), being too complex to maintain, or are supplemental to one of the above primary models.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want to learn more about Access Control, just continue reading the &lt;a href="https://a0.to/devto-access-control-paradigms" rel="noopener noreferrer"&gt;post on the Auth0 Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>security</category>
      <category>identity</category>
      <category>control</category>
    </item>
    <item>
      <title>Test Authorization in ASP.NET Core Web APIs With the `user-jwts` Tool</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Fri, 23 Dec 2022 14:20:25 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/test-authorization-in-aspnet-core-web-apis-with-the-user-jwts-tool-4fbb</link>
      <guid>https://dev.to/robertinoc_dev/test-authorization-in-aspnet-core-web-apis-with-the-user-jwts-tool-4fbb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/andrea-chiarelli/" rel="noopener noreferrer"&gt;Andrea Chiarelli&lt;/a&gt; for Auth0 Blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How to use the new user-jwts tool to test a protected ASP.NET Core Web API without involving an authorization server.
&lt;/h3&gt;

&lt;p&gt;Testing a protected Web API is not an easy task. At the very least, you need to configure an authorization server, such as your &lt;a href="https://auth0.com/docs/get-started/auth0-overview/create-tenants" rel="noopener noreferrer"&gt;Auth0 tenant&lt;/a&gt;, configure your app, and get specific access tokens for your authorization scenarios. This implies several back and forths between your development environment and the Auth0 dashboard (or any other authorization server backend), which may be time-consuming, error-prone, and require an Internet connection, of course. The &lt;code&gt;user-jwts&lt;/code&gt; tool, included with the .NET CLI version 7.0, simplifies this Web API testing approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet the &lt;code&gt;user-jwts&lt;/code&gt; Tool
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;user-jwts&lt;/code&gt; tool allows you to generate tokens customized for your needs and test your ASP.NET Core Web API without the need for a real authorization server. It's a CLI tool integrated with the .NET CLI starting from &lt;a href="https://dotnet.microsoft.com/en-us/download/dotnet/7.0" rel="noopener noreferrer"&gt;version 7.0 of the .NET SDK&lt;/a&gt;, so make sure you have this version installed on your machine.&lt;/p&gt;

&lt;p&gt;The tool simplifies the interactive testing process of your protected API. Its general syntax is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet user-jwts &lt;span class="o"&gt;[&lt;/span&gt;options] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can pass commands to the tool to specify how to manage your JWT tokens and options to work with projects or solutions. In the following sections, you will learn the main commands you may need for testing your ASP.NET Core Web API. For a complete reference to the commands and options available, check out the &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/security/authentication/jwt-authn" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up Your Project
&lt;/h2&gt;

&lt;p&gt;You will learn how to use the &lt;code&gt;user-jwts&lt;/code&gt; tool with a practical approach by testing a ready-to-use ASP.NET Core Web API. Download it by running the following command in a terminal window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/auth0-blog/glossary-aspnet-core-webapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will find the project in the &lt;code&gt;glossary-aspnet-core-webapi&lt;/code&gt; folder. Go to that folder and run the application with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, point your browser to the &lt;a href="https://localhost:5001/swagger" rel="noopener noreferrer"&gt;https://localhost:5001/swagger&lt;/a&gt; URL. You should get the following page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkn1069prwmpkllimdwi2.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%2Fkn1069prwmpkllimdwi2.png" alt="Protected ASP.NET Core Web API with Swagger UI" width="800" height="780"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Web API provides a few endpoints that allow you to manage a glossary of terms. This is a slightly modified application coming from &lt;a href="https://auth0.com/blog/permission-based-security-aspnet-webapi" rel="noopener noreferrer"&gt;this article about using permissions with ASP.NET Core Web APIs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can perform the typical &lt;a href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete" rel="noopener noreferrer"&gt;CRUD (&lt;em&gt;Create&lt;/em&gt;, &lt;em&gt;Retrieve&lt;/em&gt;, &lt;em&gt;Update&lt;/em&gt;, &lt;em&gt;Delete&lt;/em&gt;)&lt;/a&gt; operations on a list of term definitions. The endpoints are protected, and each operation requires an &lt;a href="https://auth0.com/docs/secure/tokens/access-tokens" rel="noopener noreferrer"&gt;access token&lt;/a&gt; with different permissions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The GET method on the &lt;code&gt;/api/Glossary&lt;/code&gt; and the &lt;code&gt;/api/Glossary/{term}&lt;/code&gt;  endpoints requires an access token, but it doesn't care about specific permissions.&lt;/li&gt;
&lt;li&gt;The POST and PUT methods on the &lt;code&gt;/api/Glossary&lt;/code&gt; endpoint require an access token with &lt;code&gt;create:term&lt;/code&gt; and &lt;code&gt;update:term&lt;/code&gt; permissions.&lt;/li&gt;
&lt;li&gt;The DELETE method on the &lt;code&gt;/api/Glossary/{term}&lt;/code&gt;  endpoint requires an access token with &lt;code&gt;delete:term&lt;/code&gt; permission.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The ASP.NET Core Web API application provides a Web UI for interacting with it, but in this article, we will use &lt;code&gt;curl&lt;/code&gt; to make HTTP requests just to be consistent with the CLI nature of the &lt;code&gt;user-jwts&lt;/code&gt; tool. Feel free to use the tool you prefer to make your HTTP requests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you try to call these endpoints without an access token, you will get an "unauthorized" response message. For example, assume you call the &lt;code&gt;/api/Glossary&lt;/code&gt; endpoint as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://localhost:5001/api/glossary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will get the following error message as a response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;HTTP/1.1 401 Unauthorized
Content-Length: 0
Date: Mon, 05 Dec 2022 09:28:37 GMT
Server: Kestrel
WWW-Authenticate: Bearer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This message tells you that you are not authorized to call that endpoint, and you must pass a &lt;a href="https://oauth.net/2/bearer-tokens/" rel="noopener noreferrer"&gt;bearer token&lt;/a&gt; as a credential (&lt;code&gt;WWW-Authenticate: Bearer&lt;/code&gt;).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can read &lt;a href="https://auth0.com/blog/forbidden-unauthorized-http-status-codes/" rel="noopener noreferrer"&gt;this article to learn more about the different HTTP response messages you can receive from a protected web API&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://auth0.com/blog/test-authorization-in-aspnet-core-webapi-with-user-jwts-tool/?utm_source=devto&amp;amp;utm_medium=sc&amp;amp;utm_campaign=devto" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>programming</category>
      <category>security</category>
    </item>
    <item>
      <title>How We Do Releases in Auth0’s New Private Platform</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Thu, 22 Dec 2022 19:58:43 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/how-we-do-releases-in-auth0s-new-private-platform-2j5j</link>
      <guid>https://dev.to/robertinoc_dev/how-we-do-releases-in-auth0s-new-private-platform-2j5j</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/cyril-david/" rel="noopener noreferrer"&gt;Cyril David&lt;/a&gt; for Auth0 Blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Releasing individual services today is largely a solved problem. The complexity arises when we need to factor in the combinations of services, the configs and secrets necessary for a given service version, and the underlying infrastructure supporting those services while ensuring quality, reproducibility, and determinism.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s in a Service?
&lt;/h2&gt;

&lt;p&gt;When we talk about services, we largely focus on the code — but other things we might need to account for are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Config and Secrets&lt;/li&gt;
&lt;li&gt;Database related migrations&lt;/li&gt;
&lt;li&gt;Related infrastructure dependencies for a particular service version&lt;/li&gt;
&lt;li&gt;Implicit dependencies with other services&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introducing the Concept of a Release Manifest
&lt;/h2&gt;

&lt;p&gt;Given these problem constraints, we introduced a &lt;strong&gt;release manifest&lt;/strong&gt; concept, which we define as a versioned JSON file describing a point-in-time representation of the entire Auth0 product stack, which includes: all service versions and the infrastructure version it was deployed on.&lt;/p&gt;

&lt;p&gt;Configs and secrets are also versioned for every release manifest, which are snapshotted in our config/secrets storage.&lt;/p&gt;

&lt;p&gt;Just to make it more concrete, here’s a hypothetical snippet:&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;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v202221.99.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"services"&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;"productpage"&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;"entity"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"productpage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"default_vcs_branch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"stacks"&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;"STACK_AUTH0"&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;"artifact"&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;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.464.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"vcs_revision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dc62808d3a75a814a0748827d74e0936669dfec9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"vcs_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/auth0/productpage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sample.jfrog.io/docker/productpage:1.464.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&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;"build_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"464"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"build_started"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2022-05-24T18:52:34.753+0000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"build_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://samplebuilds.auth0.net/job/productpage/job/main/464/"&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="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;"reviews"&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;"entity"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reviews"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"default_vcs_branch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"stacks"&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;"STACK_AUTH0"&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;"artifact"&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;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.31.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"vcs_revision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dc62808d3a75a814a0748827d74e0936669dfec9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"vcs_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/auth0/reviews"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sample.jfrog.io/docker/reviews:1.31.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&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;"build_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"build_started"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2022-05-24T18:52:34.753+0000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"build_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://samplebuilds.auth0.net/job/reviews/job/main/31/"&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="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="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;A couple of notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The version &lt;code&gt;v202221.99.0&lt;/code&gt; is based on a year/week scheme (e.g., year&lt;code&gt;2022&lt;/code&gt;, week &lt;code&gt;21&lt;/code&gt;) and just a monotonic minor version which represents an atomic change.&lt;/li&gt;
&lt;li&gt;In this example, we only have two services called &lt;code&gt;productpage&lt;/code&gt; (versioned &lt;code&gt;1.464.0&lt;/code&gt;) and &lt;code&gt;reviews&lt;/code&gt; (versioned &lt;code&gt;1.31.0&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;This file is committed within our central git ops repository, with a matching tag &lt;code&gt;v202221.99.0&lt;/code&gt; where the underlying infrastructure as code is also versioned for that specific point in time.&lt;/li&gt;
&lt;li&gt;Config/secrets aren’t versioned in git — but instead are stored separately in our config/secrets storage where we have the ability to snapshot them based on a specific version (in this case, all secrets/config have the same version &lt;code&gt;v202221.99.0&lt;/code&gt;attached as metadata).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this construct defined, we now have a baseline primitive for ensuring the properties we set out to solve initially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quality&lt;/strong&gt; — we can easily run our suites of system tests against a given version to ensure that our features work as expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility&lt;/strong&gt; — we can create as many different spaces for testing or for onboarding new customers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinism&lt;/strong&gt; — we’re guaranteed we have the same combination of service versions, config/secrets, database migrations, and infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://auth0.com/blog/how-we-do-releases-in-auth0-s-new-private-platform/?utm_source=content_synd&amp;amp;utm_medium=sc&amp;amp;utm_campaign=global_dist" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gratitude</category>
      <category>learning</category>
    </item>
    <item>
      <title>A Better Social Login: Transparency That Leads To Trust</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Mon, 19 Dec 2022 21:31:59 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/a-better-social-login-transparency-that-leads-to-trust-1cmk</link>
      <guid>https://dev.to/robertinoc_dev/a-better-social-login-transparency-that-leads-to-trust-1cmk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/swale-nunez/" rel="noopener noreferrer"&gt;Swalé Nunez&lt;/a&gt; for Auth0 Blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A Better Social Login: Transparency That Leads To Trust
&lt;/h2&gt;

&lt;p&gt;Social logins have given developers an effortless way to address several of their onboarding challenges. With a simple integration that lets users sign up and sign in to applications using social accounts, developers remove considerable friction from the process. Auth0 eased the integration process further, letting developers choose which social login provider to use. The &lt;a href="https://www.okta.com/blog/2020/08/social-login/" rel="noopener noreferrer"&gt;most prevalent&lt;/a&gt;, Facebook, was generally the default. That integration alone not only helped eliminate password management but also showed increases in conversion rates and overall user engagement. But removing friction and easing a developer’s job is just the first part of this journey. It’s also about user trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Question of Trust
&lt;/h2&gt;

&lt;p&gt;There has always been an element of trust involved in the social login relationship. But it’s changing. As the relationship between users and the applications they interact with has evolved, user expectations of that relationship have shifted as well. And trust is at the core of these expectations. A study by &lt;a href="https://blog.malwarebytes.com/security-world/2019/03/labs-survey-finds-privacy-concerns-distrust-of-social-media-rampant-with-all-age-groups/" rel="noopener noreferrer"&gt;MalwareBytes Labs&lt;/a&gt; found that 95% of internet users don’t trust social media companies with their personal data. Those who responded to the survey showed distrust across all social media platforms. The same research found that 87% of respondents didn’t feel confident sharing their personal data online. The lack of user confidence and distrust is becoming evident in how often they make use of social logins today. &lt;/p&gt;

&lt;p&gt;With users becoming more informed about data privacy and the need to become more active in protecting their online identity, they expect a privacy-first login that will give them more control over and transparency in their data. A report from &lt;a href="https://www.pewresearch.org/internet/2019/11/15/americans-and-privacy-concerned-confused-and-feeling-lack-of-control-over-their-personal-information/" rel="noopener noreferrer"&gt;PEW Research Center on Americans and their online privacy&lt;/a&gt; found that 84% of users stated they have little to no control over the data companies collect about them. As technology evolves and with the advent of blockchain technology, users are embracing the idea of having more control over their online identities, data, and transactions, and technology is evolving to help make this possible. Decentralized identity is one such approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  A User-First Approach to Online Identity
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://iuncta.io/" rel="noopener noreferrer"&gt;Iuncta&lt;/a&gt;’s user-first approach to identity and access management is built on a model emphasizing transparency that leads to trust. It prioritizes user privacy and enables user control, all consistent with its user-centered design approach. Iuncta is a social login with transparent data sharing and access to zero-party data, so users are always aware of what data is being shared, when, and with whom. A social login that gives users the control they deserve, ensuring trust, offering privacy, and establishing peace of mind.&lt;/p&gt;

&lt;p&gt;Iuncta’s decentralized identity implementation allows users to act as their own identity provider online, introducing a more transparent profile-data-sharing model. With its hybrid architecture, developers can quickly and easily offer enterprise-grade passwordless authentication with an intuitive consumer-ready experience that is supported by Iuncta’s &lt;a href="https://youtu.be/GN5VMTN_fm8" rel="noopener noreferrer"&gt;mobile app&lt;/a&gt;. The Iuncta platform enables user identity on demand, streamlining onboarding and facilitating secure and effortless digital interactions between users and developers.&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%2Fcgso1k7daitneh811fcc.jpeg" 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%2Fcgso1k7daitneh811fcc.jpeg" alt="Mobile App" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  End-to-end authentication
&lt;/h3&gt;

&lt;p&gt;The Iuncta solution manages the relationship between the developers and the users of their applications and is supported by a feature-rich cloud offering at the core of an end-to-end solution to consumer online identity management and licensing. &lt;/p&gt;

&lt;p&gt;The key elements in Iuncta’s layered implementation include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers (Client) – A minimalist module requires only a username for passwordless access.&lt;/li&gt;
&lt;li&gt;Web API/Mobile SDK – A comprehensive list of tools for seamless integration into the Iuncta cloud service offering.&lt;/li&gt;
&lt;li&gt;Cloud services – A feature-rich collection of core Iuncta ecosystem services. It is the control center for the extensive functionality list.&lt;/li&gt;
&lt;li&gt;Mobile app – A clean and intuitive user interface designed to make user interaction with the Iuncta platform natural and effortless. &lt;/li&gt;
&lt;/ul&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%2Fcblq3cll80xa0fk7v3jw.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%2Fcblq3cll80xa0fk7v3jw.png" alt="Iuncta" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Iuncta’s hybrid approach combines a consumer-friendly user experience with enterprise-grade security without lengthy development time. As an official Auth0 partner in its &lt;a href="https://marketplace.auth0.com/integrations/iuncta" rel="noopener noreferrer"&gt;Marketplace&lt;/a&gt;, the integration only takes a button click and a few simple steps for developers. With an Iuncta partner account, developers get access to the complete list of web APIs and downloadable mobile SDKs, as well as a reference guide with documentation and code samples to enable customization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://auth0.com/blog/a-better-social-login-transparency-that-leads-to-trust/?utm_source=devto&amp;amp;utm_medium=sc&amp;amp;utm_campaign=devto" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>vite</category>
      <category>help</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Shhhh... Kubernetes Secrets Are Not Really Secret!</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Fri, 16 Dec 2022 13:19:17 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/shhhh-kubernetes-secrets-are-not-really-secret-4nih</link>
      <guid>https://dev.to/robertinoc_dev/shhhh-kubernetes-secrets-are-not-really-secret-4nih</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/deepu-sasidharan/" rel="noopener noreferrer"&gt;Deepu K Sasidharan&lt;/a&gt; for Auth0 Blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Learn how to setup secure secrets on Kubernetes using Sealed Secrets, External Secrets Operator, and Secrets Store CSI driver.
&lt;/h3&gt;

&lt;p&gt;Kubernetes has become an inevitable part of the modern software infrastructure. Hence managing sensitive data on Kubernetes is also an essential aspect of modern software engineering so that you can put the security back into DevSecOps. Kubernetes offers a way to store sensitive data using the &lt;a href="https://kubernetes.io/docs/concepts/configuration/secret/" rel="noopener noreferrer"&gt;Secret&lt;/a&gt; object. While it's better than nothing, it is not really a secret, as it is just &lt;a href="https://en.wikipedia.org/wiki/Base64" rel="noopener noreferrer"&gt;base64&lt;/a&gt; encoded strings that anyone with access to the cluster or the code can decode.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt;&lt;br&gt;
Kubernetes Secrets are, by default, stored unencrypted in the API server's underlying data store (etcd). Anyone with API access can retrieve or modify a Secret, and so can anyone with access to etcd. Additionally, anyone authorized to create a Pod in a namespace can use that access to read any Secret in that namespace; this includes indirect access, such as the ability to create a Deployment.&lt;br&gt;
— &lt;a href="https://kubernetes.io/docs/concepts/configuration/secret/" rel="noopener noreferrer"&gt;Kubernetes docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem of reading secrets from the cluster can be fixed using proper &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/" rel="noopener noreferrer"&gt;RBAC&lt;/a&gt; configuration and by securing the API server, check out &lt;a href="https://developer.okta.com/blog/2021/12/02/k8s-security-best-practices" rel="noopener noreferrer"&gt;How to Secure Your Kubernetes Clusters With Best Practices&lt;/a&gt; to learn more about RBAC and cluster API security. Securing secrets on the source code is the bigger problem. Everyone who has access to the repositories containing those secret definitions can also decode them. This makes it quite tricky to manage Kubernetes secrets in Git, like every other resource.&lt;/p&gt;

&lt;p&gt;Let's see how to setup more secure secrets using the;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sealed Secrets,&lt;/li&gt;
&lt;li&gt;External Secrets Operator,&lt;/li&gt;
&lt;li&gt;Secrets Store CSI driver.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You would need a Kubernetes cluster to run the samples. I used &lt;a href="https://k3d.io/" rel="noopener noreferrer"&gt;k3d&lt;/a&gt; to create a local cluster. You can also use &lt;a href="https://kind.sigs.k8s.io/" rel="noopener noreferrer"&gt;kind&lt;/a&gt; or &lt;a href="https://minikube.sigs.k8s.io/docs/" rel="noopener noreferrer"&gt;minikube&lt;/a&gt; for this purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sealed Secrets
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/bitnami-labs/sealed-secrets" rel="noopener noreferrer"&gt;Sealed Secrets&lt;/a&gt; is an open-source Kubernetes controller and a client-side CLI tool from Bitnami that aims to solve the "&lt;strong&gt;storing secrets in Git&lt;/strong&gt;" part of the problem, using asymmetric crypto encryption. Sealed Secrets with an RBAC configuration preventing non-admins from reading secrets is an excellent solution for the entire problem.&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%2F2wsii5h6myb5t2tfenj0.jpg" 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%2F2wsii5h6myb5t2tfenj0.jpg" alt="Sealed Secrets Architecture" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works as below;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Encrypt the secret on the developer machine using a public key and the &lt;code&gt;kubeseal&lt;/code&gt; CLI. This encodes the encrypted secret into a Kubernetes Custom Resource Definition (CRD)&lt;/li&gt;
&lt;li&gt;Deploy the CRD to the target cluster&lt;/li&gt;
&lt;li&gt;The Sealed Secret controller decrypts the secret using a private key on the target cluster to produce a standard Kubernetes secret.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The private key is only available to the Sealed Secrets controller on the cluster, and the public key is available to the developers. This way, &lt;strong&gt;only the cluster can decrypt the secrets, and the developers can only encrypt them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://auth0.com/blog/kubernetes-secrets-management/?utm_source=devto&amp;amp;utm_medium=sc&amp;amp;utm_campaign=devto" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Get Started with Jetpack Compose Authentication</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Wed, 14 Dec 2022 21:25:46 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/get-started-with-jetpack-compose-authentication-2o20</link>
      <guid>https://dev.to/robertinoc_dev/get-started-with-jetpack-compose-authentication-2o20</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/joey-devilla/" rel="noopener noreferrer"&gt;Joey deVilla&lt;/a&gt; for Auth0 Blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Learn how to build a basic app using Android’s Jetpack Compose UI toolkit.
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;With nearly 3 billion users, &lt;a href="https://www.statista.com/statistics/272698/global-market-share-held-by-mobile-operating-systems-since-2009/" rel="noopener noreferrer"&gt;almost 70% of the mobile OS market share&lt;/a&gt;, and &lt;a href="https://gs.statcounter.com/os-market-share" rel="noopener noreferrer"&gt;the majority share of all user-facing operating systems worldwide&lt;/a&gt;, Android is the number one operating system in use today. As an Android developer, you have access to the world’s largest customer base, and sooner or later, you’ll write an app that requires the user to log in and out. One of the goals of this tutorial is to show you how to use Auth0 to add authentication to an Android app. You’ll also become familiar with the Auth0 dashboard and learn how to use it to register applications and manage users.&lt;/p&gt;

&lt;p&gt;Platforms evolve, and Android is no exception. However, when a platform the size of Android fundamentally changes how you do things, developers who embrace the change early gain a significant advantage. This change is happening now with &lt;a href="https://developer.android.com/jetpack/compose" rel="noopener noreferrer"&gt;Jetpack Compose&lt;/a&gt;. This tutorial’s secondary goal is to give you an “early adopter” advantage by building a simple login/logout user interface with Jetpack Compose.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Look for the 🛠 emoji if you’d like to skim through the content while focusing on the build and execution steps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Jetpack Compose
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.android.com/jetpack/compose" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2F23aumh6u8s0i%2F4JQe27JmEip0X21uRGa0sr%2Fae23bfa547ed18a019c6fd92615f1eff%2Fjetpack_compose_icon.png" alt="Jetpack Compose icon." width="250" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Released in July 2021, &lt;strong&gt;Jetpack Compose&lt;/strong&gt; (often shortened to &lt;strong&gt;Compose&lt;/strong&gt;) is a UI toolkit that thoroughly updates the process of building Android apps. Instead of XML, you use declarative Kotlin code to specify how the UI should look and behave under different states. You don’t have to worry about how the UI moves between those states — Compose takes care of that for you. You'll find Compose familiar if you’re acquainted with declarative web frameworks like React, Angular, or Vue.&lt;/p&gt;

&lt;p&gt;The Jetpack Compose approach is a significant departure from Android’s original XML UI toolkit, modeled after old desktop UI frameworks and dates back to 2008. You use a mechanism such as &lt;a href="https://wajahatkarim.com/2020/04/evolution-of-finding-views/" rel="noopener noreferrer"&gt;&lt;code&gt;findViewById()&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://developer.android.com/topic/libraries/view-binding" rel="noopener noreferrer"&gt;view binding&lt;/a&gt; to connect UI elements to code. This imperative approach is simple but requires you to define how the program moves between states and how the UI should look and behave in those states.&lt;/p&gt;

&lt;p&gt;Jetpack Compose is built with Kotlin, takes advantage of the features and design philosophy of Kotlin language, and is designed for use in applications written in Kotlin. With Compose, you no longer have to context-switch to XML when designing your app’s UI; you now do everything in Kotlin.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You’ll Build
&lt;/h2&gt;

&lt;p&gt;You’ll use Auth0 and Jetpack Compose to build a single-screen Android app that allows users to log in and out. I’ve purposely kept it as simple as possible to keep the focus on authentication.&lt;/p&gt;

&lt;p&gt;When you launch the completed app, you’ll see a greeting and a &lt;em&gt;Log In&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%2Fw9u12p91ugd8415jfpda.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%2Fw9u12p91ugd8415jfpda.png" alt="The app’s “Welcome” screen." width="400" height="871"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pressing the &lt;em&gt;Log In&lt;/em&gt; button takes the user to the &lt;a href="https://auth0.com/docs/login/universal-login" rel="noopener noreferrer"&gt;Auth0 Universal Login screen&lt;/a&gt;. It appears in a web browser view embedded in your app. Here’s what it looks like in an emulator...&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%2Fs6rb226z1z8byi1arbtt.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%2Fs6rb226z1z8byi1arbtt.png" alt="The default Auth0 Universal Login web page, as viewed in an emulator." width="400" height="871"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;...and here’s what it looks like on a device:&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%2Fm0xe89fswzmxj8ehixsr.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%2Fm0xe89fswzmxj8ehixsr.png" alt="The default Auth0 Universal Login web page, as viewed on a device." width="400" height="889"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you use Auth0 to add login/logout capability to your apps, you delegate authentication to an Auth0-hosted login page. You've probably seen this in Google web applications such as Gmail and YouTube. These services redirect you to log in using &lt;a href="https://accounts.google.com/" rel="noopener noreferrer"&gt;accounts.google.com&lt;/a&gt;. After logging in, Google returns you to the web application as a logged-in user.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you’re worried that using Auth0’s Universal Login means that your app’s login screen will be stuck with the default Auth0 “look and feel,” I have good news for you: &lt;a href="https://auth0.com/docs/universal-login/new-experience/universal-login-page-templates" rel="noopener noreferrer"&gt;you can customize it to match your app or organization’s brand identity.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Universal Login page saves you from having to code an authentication system. It gives your applications a self-contained login box with several features to provide a great user experience.&lt;/p&gt;

&lt;p&gt;If the user enters an invalid email address/password combination, it displays an error message and gives them another chance to log in:&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%2F7zg2j4g591e0y7u89usb.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%2F7zg2j4g591e0y7u89usb.png" alt="Universal Login displaying the “wrong email or password” message." width="400" height="871"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two ways to exit the Universal Login screen. There’s the “unhappy path,” where the user presses the &lt;em&gt;Cancel&lt;/em&gt; button at the upper left corner of the screen, which dismisses the Universal Login screen and returns them to the opening screen.&lt;/p&gt;

&lt;p&gt;The “happy path” out of the Universal Login appears when the user enters a valid email address/password combination. When this happens, Auth0 authenticates the user, the embedded web view and Universal Login will disappear, and control will return to the app, which will now look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmz3xexczefuk2mgjrm3d.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%2Fmz3xexczefuk2mgjrm3d.png" alt="The app in its “logged in” state, with a title that reads “You’re logged in!”." width="400" height="871"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s what changed after the user logged in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The title text at the top of the screen now says, “You’re logged in!”&lt;/li&gt;
&lt;li&gt;The name, email address, and photo associated with the user’s account appear onscreen.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;Log Out&lt;/em&gt; button appears below the user’s photo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you might expect, the user logs out by pressing the &lt;em&gt;Log Out&lt;/em&gt; button, which returns them to a slightly different version of the initial screen:&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%2Foznvj5p8zah049hbgwhi.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%2Foznvj5p8zah049hbgwhi.png" alt="The app after the user logs out, with a title that reads “You’re logged out.” and a “Log In” button." width="400" height="871"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What You’ll Need
&lt;/h2&gt;

&lt;p&gt;You’ll need the following to build the app:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. An Auth0 account
&lt;/h3&gt;

&lt;p&gt;The app uses Auth0 to authenticate users, meaning you need an Auth0 account. You can &lt;a href="https://auth0.com/signup" rel="noopener noreferrer"&gt;sign up for a free account&lt;/a&gt;, which lets you add login/logout to 10 applications, with support for 7,000 users and unlimited logins — plenty for your prototyping, development, and testing needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. An Android development setup
&lt;/h3&gt;

&lt;p&gt;To develop applications for Android, make sure you have the following, in the order given below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any computer running Linux, macOS, or Windows from 2013 or later with at least 8 GB RAM. When it comes to RAM, more is generally better.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.oracle.com/java/technologies/javase-jdk16-downloads.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Java SE Developer Kit (JDK), version 11 or later.&lt;/strong&gt;&lt;/a&gt; You can find out which version is on your computer by opening a command-line interface and entering &lt;code&gt;java --version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.android.com/studio" rel="noopener noreferrer"&gt;&lt;strong&gt;Android Studio,&lt;/strong&gt;&lt;/a&gt; version 2021.2.1 Patch 2 (also known as “Chipmunk”) or later. Jetpack Compose is a recent development, so you should use the most recent stable version of Android Studio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At least one Android SDK (Software Development Kit) platform.&lt;/strong&gt; You can confirm that you have one (and install one if you don’t) in Android Studio. Open &lt;em&gt;Tools&lt;/em&gt; → &lt;em&gt;SDK Manager&lt;/em&gt;. You’ll see a list of Android SDK platforms. Select the current SDK (&lt;strong&gt;Android 12.0 (S)&lt;/strong&gt; at the time of writing), click the &lt;em&gt;Apply&lt;/em&gt; button, and click the &lt;em&gt;OK&lt;/em&gt; button in the confirmation dialog that appears. Wait for the SDK platform to install and click the &lt;em&gt;Finish&lt;/em&gt; button when installation is complete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An Android device, real or virtual:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Using a real device:&lt;/strong&gt; Connect the device to your computer with a USB cable. Make sure that your device has Developer Options and USB debugging enabled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using a virtual device:&lt;/strong&gt; Using Android Studio, you can build a virtual device (emulator) that runs on your computer. Here’s my recipe for a virtual device that simulates a current-model inexpensive Android phone:

&lt;ol&gt;
&lt;li&gt;Open &lt;em&gt;Tools&lt;/em&gt; → &lt;em&gt;AVD Manager&lt;/em&gt; (AVD is short for “Android Virtual Device”). The &lt;em&gt;Your Virtual Devices&lt;/em&gt; window will appear. Click the &lt;em&gt;Create Virtual Device...&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;Select Hardware&lt;/em&gt; window will appear. In the &lt;em&gt;Phone&lt;/em&gt; category, select &lt;em&gt;Pixel 3a&lt;/em&gt; and click the &lt;em&gt;Next&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;System Image&lt;/em&gt; window will appear, and you’ll see a list of Android versions. Select &lt;em&gt;S&lt;/em&gt; (API 31, also known as Android 12.0). If you see a &lt;em&gt;Download&lt;/em&gt; link beside R, click it, wait for the OS to download, then click the &lt;em&gt;Finish&lt;/em&gt; button. Then click the &lt;em&gt;Next&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;Android Virtual Device (AVD)&lt;/em&gt; window will appear. The &lt;em&gt;AVD Name&lt;/em&gt; field should contain &lt;em&gt;Pixel 3a API 31&lt;/em&gt;, the two rows below it should have the titles &lt;em&gt;Pixel 3a&lt;/em&gt; (a reasonable “representative” phone, released three years ago at the time of writing) and &lt;em&gt;S&lt;/em&gt;, and in the &lt;em&gt;Startup orientation&lt;/em&gt; section, &lt;em&gt;Portrait&lt;/em&gt; should be selected. Click the &lt;em&gt;Finish&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;You will be back at the &lt;em&gt;Your Virtual Devices&lt;/em&gt; window. The list will now contain &lt;em&gt;Pixel 3a API 31&lt;/em&gt;, and that device will be available to you when you run the app.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. A little familiarity with Android/Kotlin development.
&lt;/h3&gt;

&lt;p&gt;If you’re new to Android development or the Kotlin programming language, you might find &lt;a href="https://developer.android.com/courses/android-basics-kotlin/course" rel="noopener noreferrer"&gt;&lt;em&gt;Android Basics in Kotlin&lt;/em&gt;&lt;/a&gt; to be a good introduction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://auth0.com/blog/android-authentication-jetpack-compose-part-1/?utm_source=devto&amp;amp;utm_medium=sc&amp;amp;utm_campaign=devto" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>android</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Extending CIAM to Enable Modern Healthcare Applications</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Tue, 13 Dec 2022 13:28:10 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/extending-ciam-to-enable-modern-healthcare-applications-3mbd</link>
      <guid>https://dev.to/robertinoc_dev/extending-ciam-to-enable-modern-healthcare-applications-3mbd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/alexa-jacky/" rel="noopener noreferrer"&gt;Alexa Jacky&lt;/a&gt; for Auth0 blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Customizing identity flows by stacking no-code integrations allows dev teams to innovate efficiently.
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;As healthcare delivery models evolve and digital information unlocks new possibilities, a vast array of ecosystem participants face pressure to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build and manage consolidated patient portals&lt;/strong&gt; that link patients, patient advocates, and extended healthcare teams and that extend across multiple service providers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empower patients&lt;/strong&gt; with convenient self-service options and quicker access to appointment information, test results, diagnoses, forms, documentation, and their healthcare providers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide rapid virtual care and assistance,&lt;/strong&gt; overcoming distance and time constraints and increasing accessibility of healthcare (and related) services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
From established healthcare providers to newcomers aspiring to dominate entirely new markets, the organizations best positioned to succeed will be those that are best able to implement fundamental identity capabilities and extend beyond the identity basics.&lt;/p&gt;

&lt;p&gt;All the while — and in everything they do — healthcare organizations have to comply with complex regulatory requirements (e.g., HIPAA, GDPR), which vary by jurisdiction and are often layered (i.e., state laws versus federal laws).&lt;/p&gt;

&lt;p&gt;But with developer resources already in short supply and with a healthcare organization's primary applications rightfully commanding the lion's share of attention, engineering organizations need to satisfy identity requirements as quickly — and with as little custom code to write or maintain — as possible.&lt;/p&gt;

&lt;p&gt;For example, Jay Anslow, Senior Software Engineer at &lt;a href="https://auth0.com/case-studies/babylon-health" rel="noopener noreferrer"&gt;Babylon Health, shared with us that&lt;/a&gt;, "We estimated that it would take a team of eight staff at least a year to meet our new requirements with a home-built solution. As well as the cost of having that team, it would have delayed our timeline, so we wouldn't have been able to get our functionality out the door as quickly."&lt;/p&gt;

&lt;h2&gt;
  
  
  Identity Enables the Healthcare Ecosystem
&lt;/h2&gt;

&lt;p&gt;Identity, particularly as it relates to securing sensitive data and complying with privacy regulations, has been a foundation of healthcare since long before the digital revolution — but as healthcare delivery organizations (HDOs) embraced new information formats and leveraged the Internet for collaboration, communications, service delivery, and other functions, customer identity and access management (CIAM) systems became essential elements of healthcare organizations' technology stacks.&lt;/p&gt;

&lt;p&gt;On top of the transition that was already happening, the COVID-19 pandemic "caused a seven to ten-year acceleration in consumer and digital trends," &lt;a href="https://auth0.com/case-studies/bioreference" rel="noopener noreferrer"&gt;according to Richard Schwabacher, Senior VP of Digital Health and Chief Digital Officer at BioReference&lt;/a&gt;. The result is that "Securing, transmitting, and authorizing patient access to health information digitally is now critical to the practice of medicine and core to what is needed from a modern digital health solution."&lt;/p&gt;

&lt;p&gt;And CIAM is vital to this functionality. Out of the box, leading CIAM solutions include many features that can help healthcare organizations meet new needs, allowing even small engineering teams to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://auth0.com/case-studies/bioreference" rel="noopener noreferrer"&gt;Create patient-centric experiences&lt;/a&gt;, built around each individual’s needs and preferences;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://auth0.com/case-studies/providence" rel="noopener noreferrer"&gt;Enable a vast, interconnected, and growing healthcare ecosystem&lt;/a&gt;; and&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://auth0.com/security" rel="noopener noreferrer"&gt;Simultaneously meet security, privacy, and convenience&lt;/a&gt; needs, rather than trading off between these necessary elements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But while out-of-the-box functionality is important, the real world is a complex and dynamic beast (as anyone who's ever done a year-over-year roadmap comparison understands). Being able to accommodate change and tailor identity to your unique needs — and doing both without drawing too heavily upon developers — is the difference between CIAM as a necessary component of your application stack and CIAM as an operational and competitive advantage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://auth0.com/blog/extending-ciam-to-enable-modern-healthcare-applications/?utm_source=devto&amp;amp;utm_medium=sc&amp;amp;utm_campaign=devto" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gratitude</category>
    </item>
    <item>
      <title>Secure Secrets With Spring Cloud Config and Vault</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Tue, 15 Nov 2022 13:50:29 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/secure-secrets-with-spring-cloud-config-and-vault-4890</link>
      <guid>https://dev.to/robertinoc_dev/secure-secrets-with-spring-cloud-config-and-vault-4890</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/jimena-garbarino/" rel="noopener noreferrer"&gt;Jimena Garbarino&lt;/a&gt; for Auth0 blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Storing secrets in your code is a bad idea. Learn how to use Spring Cloud Config and HashiCorp Vault to make your app more secure.
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;In 2013, GitHub released a search feature that allows users to scan code in all public repositories. A day after the release, however, they had to partially shut it down. It was speculated that the shutdown was because the feature allowed any user to search for all kinds of secrets stored in GitHub repositories. Later, in 2014, data on 50,000 Uber drivers were stolen. It seems someone got access to the company’s database using login credentials found in a GitHub public repository. Hashicorp Vault, a tool for managing secrets and encrypting data in transit, was first announced in 2015, and Spring Vault, the integration of Spring with Vault, was first released in 2017.&lt;/p&gt;

&lt;p&gt;It seems like a long time ago, right? Secrets leakage seems to remain pervasive and constant, happening to all kinds of developers—as explained by &lt;a href="https://www.ndss-symposium.org/ndss-paper/how-bad-can-it-git-characterizing-secret-leakage-in-public-github-repositories/" rel="noopener noreferrer"&gt;this study from NC State University&lt;/a&gt;. Exposed secrets lead to cyber-attacks, data loss or corruption, sensitive data breaches, and crypto-jacking (cryptocurrency mining using a victim’s cloud computer power). With tools like Hashicorp’s Vault and Spring Cloud Vault, the risk can be reduced.&lt;/p&gt;

&lt;p&gt;Nowadays, it is widely recommended never to store secret values in code. Therefore, this tutorial will demonstrate the following alternatives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using environment variables for Spring Boot secrets&lt;/li&gt;
&lt;li&gt;Secrets encryption with Spring Cloud Config&lt;/li&gt;
&lt;li&gt;Secrets management with HashiCorp’s Vault&lt;/li&gt;
&lt;li&gt;Using Spring Cloud Vault&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This tutorial was created with the following frameworks and tools:&lt;/strong&gt;&lt;br&gt; &lt;br&gt;
  ‣ &lt;a href="https://jdk.java.net/java-se-ri/17" rel="noopener noreferrer"&gt;Java OpenJDK 17&lt;/a&gt;&lt;br&gt; &lt;br&gt;
  ‣ &lt;a href="https://cli.okta.com/" rel="noopener noreferrer"&gt;Okta CLI 0.10.0&lt;/a&gt;&lt;br&gt; &lt;br&gt;
  ‣ &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;Docker 20.10.12&lt;/a&gt;&lt;br&gt; &lt;br&gt;
  ‣ &lt;a href="https://httpie.io/docs/cli/installation" rel="noopener noreferrer"&gt;HTTPie 3.2.1&lt;/a&gt;&lt;br&gt; &lt;br&gt;
  ‣ &lt;a href="https://hub.docker.com/_/vault" rel="noopener noreferrer"&gt;Vault 1.12.0&lt;/a&gt;&lt;br&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Use Environment Variables for Secrets; A Precursor to Spring Vault
&lt;/h2&gt;

&lt;p&gt;Spring Boot applications can bind property values from environment variables. To demonstrate, create a &lt;code&gt;vault-demo-app&lt;/code&gt; with OpenID Connect (OIDC) authentication using the Spring Initializr. Then add &lt;code&gt;web&lt;/code&gt;, &lt;code&gt;okta&lt;/code&gt;, and &lt;code&gt;cloud-config-client&lt;/code&gt; dependencies, some of which will be required later in the tutorial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https start.spring.io/starter.zip \
  bootVersion==2.7.4 \
  dependencies==web,okta,cloud-config-client \
  groupId==com.okta.developer \
  artifactId==vault-demo-app  \
  name=="Spring Boot Application" \
  description=="Demo project of a Spring Boot application with Vault protected secrets" \
  packageName==com.okta.developer.vault &amp;gt; vault-demo-app.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unzip the file and open the project. Modify its &lt;code&gt;src/main/java/.../Application.java&lt;/code&gt; class to add the &lt;code&gt;/&lt;/code&gt; HTTP endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.okta.developer.vault&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.SpringApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.autoconfigure.SpringBootApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.security.core.annotation.AuthenticationPrincipal&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.security.oauth2.core.oidc.user.OidcUser&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.GetMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.RestController&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@AuthenticationPrincipal&lt;/span&gt; &lt;span class="nc"&gt;OidcUser&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Welcome, %s"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFullName&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Disable the cloud configuration for the first run. Edit &lt;code&gt;application.properties&lt;/code&gt; and add the following value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;spring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cloud&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OpenID Connect authentication with Okta
&lt;/h3&gt;

&lt;p&gt;In a command line session, go to the &lt;code&gt;vault-demo-app&lt;/code&gt; root folder.&lt;/p&gt;

&lt;p&gt;Before you begin, you’ll need a free Okta developer account. Install the &lt;a href="https://cli.okta.com/" rel="noopener noreferrer"&gt;Okta CLI&lt;/a&gt; and run &lt;code&gt;okta register&lt;/code&gt; to sign up for a new account. If you already have an account, run &lt;code&gt;okta login&lt;/code&gt;. Then, run &lt;code&gt;okta apps create&lt;/code&gt;. Select the default app name, or change it as you see fit. Choose Web and press Enter.&lt;/p&gt;

&lt;p&gt;Select Okta Spring Boot Starter. Accept the default Redirect URI values provided for you. That is a Login Redirect of &lt;code&gt;http://localhost:8080/login/oauth2/code/okta&lt;/code&gt; and a Logout Redirect of &lt;code&gt;http://localhost:8080&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What does the Okta CLI do?&lt;/p&gt;

&lt;p&gt;The Okta CLI will create an OIDC Web App in your Okta Org. It will add the redirect URIs you specified and grant access to the Everyone group. You will see output like the following when it’s finished:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Okta application configuration has been written to: 
  /path/to/app/src/main/resources/application.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open &lt;code&gt;src/main/resources/application.properties&lt;/code&gt; to see the issuer and credentials for your app.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;okta.oauth2.issuer=https://dev-133337.okta.com/oauth2/default
okta.oauth2.client-id=0oab8eb55Kb9jdMIr5d6
okta.oauth2.client-secret=NEVER-SHOW-SECRETS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&amp;gt; NOTE: You can also use the Okta Admin Console to create your app. See &lt;a href="https://developer.okta.com/docs/guides/sign-into-web-app/springboot/create-okta-application/" rel="noopener noreferrer"&gt;Create a Spring Boot App&lt;/a&gt; for more information.&lt;/p&gt;

&lt;p&gt;Instead of storing Okta credentials in &lt;code&gt;application.properties&lt;/code&gt; as part of the project code, Spring Boot allows you to bind properties from environment variables. You can see this in action by starting your application with the Maven command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="no"&gt;OKTA_OAUTH2_ISSUER&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;&lt;span class="n"&gt;yourOktaIssuerURI&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
&lt;span class="no"&gt;OKTA_OAUTH2_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;&lt;span class="n"&gt;yourOktaClientId&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
&lt;span class="no"&gt;OKTA_OAUTH2_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;&lt;span class="n"&gt;yourOktaClientSecret&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;mvnw&lt;/span&gt; &lt;span class="n"&gt;spring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;boot:&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;NOTE: Copy the values of &lt;code&gt;yourOktaIssuerURI&lt;/code&gt;, &lt;code&gt;yourOktaClientId&lt;/code&gt;, and &lt;code&gt;yourOktaClientSecret&lt;/code&gt; as you will need them for configuration in the next sections. You can also just keep at hand &lt;code&gt;yourOktaClientId&lt;/code&gt; and retrieve the configuration with &lt;code&gt;okta apps config --app {yourOktaClientId}&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In an incognito window, go to &lt;code&gt;http://localhost:8080&lt;/code&gt;. Here, you should see the Okta login 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%2Fbq9x5a5bch31jrrbhmqv.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%2Fbq9x5a5bch31jrrbhmqv.png" alt="Okta login page" width="435" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the application logs, you’ll see the security filter chain initializes an OAuth 2.0 authentication flow on startup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2022-09-07 08:50:09.460  INFO 20676 --- [           main] o.s.s.web.DefaultSecurityFilterChain     : Will secure any request with
[org.springframework.security.web.session.DisableEncodeUrlFilter@6b4a4e40,
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@46a8c2b4,
org.springframework.security.web.context.SecurityContextPersistenceFilter@640d604,
org.springframework.security.web.header.HeaderWriterFilter@7b96de8d,
org.springframework.security.web.csrf.CsrfFilter@2a0b901c,
org.springframework.security.web.authentication.logout.LogoutFilter@38ac8968,
org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter@7739aac4,
org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter@36c07c75,
org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter@353c6da1,
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@7e61e25c,
org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@4f664bee,
org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter@21b51e59,
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5438fa43,
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@512abf25,
org.springframework.security.web.authentication.AnonymousAuthenticationFilter@76563ae7,
org.springframework.security.oauth2.client.web.OAuth2AuthorizationCodeGrantFilter@3e14d390,
org.springframework.security.web.session.SessionManagementFilter@4dc52559,
org.springframework.security.web.access.ExceptionTranslationFilter@51ac12ac,
org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2407a36c]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using environment variables for passing secrets to containerized applications is now considered bad practice because the environment can be inspected or logged in a number of cases. So, let’s move on to using Spring Cloud Config server for secrets storage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://auth0.com/blog/spring-vault/?utm_source=devto&amp;amp;utm_medium=sc&amp;amp;utm_campaign=devto" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>spring</category>
      <category>security</category>
    </item>
    <item>
      <title>Auth0 SDK for Single Page Applications v2.0 released!</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Fri, 11 Nov 2022 13:23:16 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/auth0-sdk-for-single-page-applications-v20-released-2jj3</link>
      <guid>https://dev.to/robertinoc_dev/auth0-sdk-for-single-page-applications-v20-released-2jj3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/juan-cruz-martinez/" rel="noopener noreferrer"&gt;Juan Cruz Martinez&lt;/a&gt; for Auth0 blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Let's explore the main features of the new Auth0 SDK for SPA release.
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;br&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The Auth0 team released the new Auth0 Single Page App SDK v2.0, and it's now available in the &lt;a href="https://www.npmjs.com/package/@auth0/auth0-spa-js" rel="noopener noreferrer"&gt;npm registry&lt;/a&gt;. It is a major new release with a focus on development and user experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The new release makes an important step towards improving usability and reducing the footprint (size) of the SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start with the New SDK
&lt;/h2&gt;

&lt;p&gt;You can follow the &lt;a href="https://auth0.com/docs/quickstart/spa/vanillajs" rel="noopener noreferrer"&gt;quick start guide&lt;/a&gt; if you build a new application or connect your SPA with Auth0 using the SDK for the first time.&lt;/p&gt;

&lt;p&gt;If you use frameworks such as React, Angular, or Vue, you can use framework-specific libraries instead. You can learn more about specific frameworks in our &lt;a href="https://auth0.com/docs/quickstart/spa" rel="noopener noreferrer"&gt;SPA guides section&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All of the mentioned improvements will be available in the next beta versions of our framework-specific SDKs. Be sure to keep an eye on them to be notified when their beta versions are available.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Migrating from v1.x
&lt;/h2&gt;

&lt;p&gt;With the improvements from v1.x, it was necessary to introduce some breaking changes. We will cover the most impactful changes in this post, but we recommend reviewing the &lt;a href="https://github.com/auth0/auth0-spa-js/blob/master/MIGRATION_GUIDE.md" rel="noopener noreferrer"&gt;migration guide&lt;/a&gt; for the details of all breaking changes and their corresponding migration path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reduced Bundle Size by 60%
&lt;/h2&gt;

&lt;p&gt;Auth0 SPA SDK V1.x shipped with built-in polyfills to compensate for the lack of native support on some browsers for features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://caniuse.com/mdn-api_abortcontroller_abortcontroller" rel="noopener noreferrer"&gt;AbortController&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caniuse.com/promises" rel="noopener noreferrer"&gt;Promise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caniuse.com/textencoder" rel="noopener noreferrer"&gt;TextEncoder &amp;amp; TextDecoder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caniuse.com/fetch" rel="noopener noreferrer"&gt;Fetch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As the above APIs are now available for most browsers, we believe there's no more need to include those polyfills. Primarily users of IE11 would require them, and with &lt;a href="https://blogs.windows.com/windowsexperience/2022/06/15/internet-explorer-11-has-retired-and-is-officially-out-of-support-what-you-need-to-know/" rel="noopener noreferrer"&gt;Microsoft dropping support for IE11&lt;/a&gt;, we believe it makes sense to capitalize on the gains and &lt;strong&gt;drop support for IE11 as of V2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By removing these polyfills, and with some small improvements on our side, we &lt;strong&gt;reduced the bundle size by an outstanding 60%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Such a reduction will allow for faster download and processing times for application users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://auth0.com/blog/auth0-spa-sdk-v2-released/?utm_source=devto&amp;amp;utm_medium=sc&amp;amp;utm_campaign=devto" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What's New in .NET 7 for Authentication and Authorization</title>
      <dc:creator>Robertino</dc:creator>
      <pubDate>Thu, 10 Nov 2022 14:29:23 +0000</pubDate>
      <link>https://dev.to/robertinoc_dev/whats-new-in-net-7-for-authentication-and-authorization-2kob</link>
      <guid>https://dev.to/robertinoc_dev/whats-new-in-net-7-for-authentication-and-authorization-2kob</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original post written by &lt;a href="https://auth0.com/blog/authors/andrea-chiarelli/" rel="noopener noreferrer"&gt;Andrea Chiarelli&lt;/a&gt; for Auth0 blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Let’s explore the new .NET 7 features for improving and simplifying authentication and authorization support in .NET applications.
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;The release of .NET 7 continues the simplification effort that began with .NET 5. Following this line, the new release provides .NET developers with a few features related to authentication and authorization that make .NET developers' lives a bit easier. Let's take a quick look at those features, which range from simplifications in authentication configuration to the addition of new authorization test tools, to improvements to Blazor's authentication support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Default Authentication Scheme
&lt;/h2&gt;

&lt;p&gt;When you configure authentication for your application, you need to register the authentication service through &lt;code&gt;AddAuthentication()&lt;/code&gt;. For example, the following is the code needed to configure &lt;code&gt;JwtBearer&lt;/code&gt; as the authentication scheme in an ASP.NET Core Web API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAuthentication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JwtBearerDefaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationScheme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddJwtBearer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JwtBearerDefaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationScheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authority&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"https://&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Domain"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
           &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IdentityModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="n"&gt;ValidAudience&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Audience"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
             &lt;span class="n"&gt;ValidIssuer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Domain"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s"&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;Although you are defining just one authentication scheme (&lt;code&gt;JwtBearerDefaults.AuthenticationScheme&lt;/code&gt;), the  &lt;code&gt;AddAuthentication()&lt;/code&gt; method requires that you specify the default scheme to use when it is not specified in your API endpoints (see &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/security/authorization/limitingidentitybyscheme?view=aspnetcore-6.0#use-multiple-authentication-schemes" rel="noopener noreferrer"&gt;this document for more details on multiple authentication schemes in ASP.NET Core&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Starting with .NET 7, the default scheme is no longer required when you define just one authentication scheme. It is automatically inferred by the framework. In practice, you can write the previous code as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAuthentication&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;//👈 no default scheme specified&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddJwtBearer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JwtBearerDefaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationScheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authority&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"https://&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Domain"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
           &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IdentityModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="n"&gt;ValidAudience&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Audience"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
             &lt;span class="n"&gt;ValidIssuer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Domain"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s"&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 case you need to restore the old behavior for any reason, you can disable the new feature using the following statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetSwitch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Microsoft.AspNetCore.Authentication.SuppressAutoDefaultScheme"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Simplified Configuration
&lt;/h2&gt;

&lt;p&gt;One of the recurrent critiques of .NET authentication and authorization is its complexity (see &lt;a href="https://www.reddit.com/r/dotnet/comments/vttrib/is_auth_way_too_hard_in_net/" rel="noopener noreferrer"&gt;this thread&lt;/a&gt; and &lt;a href="https://social.msdn.microsoft.com/Forums/en-US/4d3844d5-9175-49ba-8c2f-8257f2c67639/authentication-and-authorization-is-too-complicated-too-abstract?forum=aspdotnetcore" rel="noopener noreferrer"&gt;this one&lt;/a&gt;, for example). Actually, .NET provides developers with an articulate system for managing authentication and authorization. This system is great for the flexibility it offers, but it may be hard for a beginner to digest all the details. It may be hard even for a more experienced developer who is not used to dealing with the identity features every day.&lt;/p&gt;

&lt;p&gt;To overcome this issue, the .NET team started an initiative aiming at simplifying the authentication and authorization configuration. The .NET 7 release introduces the first step in this direction, bringing you a simplified approach to configure ASP.NET Core Web APIs authorization based on access tokens in JWT format.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Check out &lt;a href="https://auth0.com/blog/aspnet-web-api-authorization/" rel="noopener noreferrer"&gt;this article to learn how to protect your ASP.NET Core Web API&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you ever had secured an ASP.NET Core Web API with Auth0, the following code should look familiar to you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Authentication.JwtBearer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAuthentication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JwtBearerDefaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationScheme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddJwtBearer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JwtBearerDefaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthenticationScheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authority&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"https://&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Domain"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 
           &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IdentityModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TokenValidationParameters&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="n"&gt;ValidAudience&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Audience"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
             &lt;span class="n"&gt;ValidIssuer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Auth0:Domain"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
         &lt;span class="p"&gt;};&lt;/span&gt;
     &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthentication&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can directly rely on the built-in configuration system to define your Web API's authorization options. In fact, in addition to default authentication schemes, .NET 7 automatically loads the options to configure the authentication service from the new  &lt;code&gt;Authentication&lt;/code&gt; section of the &lt;code&gt;appsettings.json&lt;/code&gt; configuration file. With this new feature, the code shown earlier becomes as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Authentication.JwtBearer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddJwtBearer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;//👈 new feature&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAuthorization&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All the configuration settings are moved to the &lt;code&gt;appsetting.json&lt;/code&gt; file as follows:&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;"Logging"&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;"LogLevel"&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;"Default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Information"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Microsoft.AspNetCore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Warning"&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="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"AllowedHosts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;//👇&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;section&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Authentication"&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;"Schemes"&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;"Bearer"&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;"ValidAudiences"&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="s2"&gt;"YOUR_AUDIENCE"&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;"ValidIssuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_AUTH0_DOMAIN"&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="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="err"&gt;//👆&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;section&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;The new &lt;code&gt;Authentication&lt;/code&gt; section keeps the configuration settings for any authentication scheme supported by your application, although currently only the &lt;code&gt;JwtBearer&lt;/code&gt; scheme is supported.&lt;/p&gt;

&lt;p&gt;Notice that now you don't need anymore to call &lt;code&gt;UseAuthentication()&lt;/code&gt; and &lt;code&gt;UseAuthorization()&lt;/code&gt;. The framework takes care of automatically adding the required middleware to the request pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authorization Policies for Specific Endpoints
&lt;/h2&gt;

&lt;p&gt;ASP.NET Core allows you to specify policies to make more accurate authorization decisions based on the access token content or other advanced criteria. Usually, these policies are defined globally at the application level and attached to the endpoint definitions the policy applies to.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Take a look at &lt;a href="https://auth0.com/blog/permission-based-security-aspnet-webapi/" rel="noopener noreferrer"&gt;this article to learn how to use policies to protect ASP.NET Core Web APIs&lt;/a&gt;, for example.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Defining policies globally is pretty good for reuse. However, sometimes you may need just a specific policy for one endpoint. In this case, you can specify your policy directly on the endpoint definition.&lt;/p&gt;

&lt;p&gt;The following is an example of how you can use this new feature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/special-endpoint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"A special endpoint!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RequireAuthorization&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RequireClaim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"api:special"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://auth0.com/blog/whats-new-in-dotnet-7-for-authentication-and-authorization/?utm_source=devto&amp;amp;utm_medium=sc&amp;amp;utm_campaign=devto" rel="noopener noreferrer"&gt;Read more...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>programming</category>
      <category>security</category>
    </item>
  </channel>
</rss>
