<?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: Amplication</title>
    <description>The latest articles on DEV Community by Amplication (@amplicationdev).</description>
    <link>https://dev.to/amplicationdev</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%2F1001156%2Ffb3c8120-303c-40ff-a703-e9844eafdc45.jpg</url>
      <title>DEV Community: Amplication</title>
      <link>https://dev.to/amplicationdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amplicationdev"/>
    <language>en</language>
    <item>
      <title>Choosing Between Role-Based vs Claims-Based vs Permission-Based Access Control Mechanism</title>
      <dc:creator>Amplication</dc:creator>
      <pubDate>Wed, 01 Mar 2023 05:19:14 +0000</pubDate>
      <link>https://dev.to/amplication/choosing-between-role-based-vs-claims-based-vs-permission-based-access-control-mechanism-4akg</link>
      <guid>https://dev.to/amplication/choosing-between-role-based-vs-claims-based-vs-permission-based-access-control-mechanism-4akg</guid>
      <description>&lt;p&gt;With the world progressing towards cloud-native applications, the cyber threat landscape is also taking a revolutionary turn. As a result, it’s crucial to guard our applications and systems against internal and external security threats.&lt;/p&gt;

&lt;p&gt;Most security risks to an organization are caused by insufficient and improper access control that may put the company at risk for fraud, unauthorized access to data and programs, or completely shut down or corrupt the computer servers and services. Therefore, it’s essential to secure organizational resources and information by restricting access and providing only the relevant permission to the appropriate entities to access and manipulate the data in the system.&lt;/p&gt;

&lt;p&gt;This article will discuss the three primary access control mechanisms: role-based, claim-based, and permission-based access control, and provide guidance on which approach to select based on your requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Access Control?
&lt;/h2&gt;

&lt;p&gt;Access control governs who can access particular data, applications, and resources inside an organization and under what circumstances. Access control lets the right people in and leaves the wrong people out by granting the users an appropriate level of access using different mechanisms.&lt;/p&gt;

&lt;p&gt;Organizations use authentication and authorization techniques to verify users. Depending on compliance requirements and security levels, access control models such as role-based, claim-based, and permission-based access controls prevent unauthorized access to sensitive data.&lt;/p&gt;

&lt;p&gt;The following sections will review these different models, providing a comprehensive comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Role-based Access Control (RBAC)
&lt;/h2&gt;

&lt;p&gt;Role-based access control (RBAC) limits access (viewing, creating, editing, deleting) based on a user's role and responsibilities within an organization, preventing unauthorized access to critical resources. Therefore, an organization can use RBAC to allow some people, such as system administrators, to create or change files while allowing others to view them. As a result, access to sensitive information is restricted for lower-level users, tightening the organization's security measures for essential data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing RBAC
&lt;/h3&gt;

&lt;p&gt;The main steps involved in implementing RBAC are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define and determine the most sensitive resources and information that require controlled access.&lt;/li&gt;
&lt;li&gt;Logically group the employees according to the workforce's functions and relationships to identify the organization's key roles.&lt;/li&gt;
&lt;li&gt;Assign proper access rights to the roles based on their responsibilities.&lt;/li&gt;
&lt;li&gt;Conduct periodic audits to check if a role has unnecessary access to a specific system and modify access levels accordingly over time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Advantages of RBAC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flexible:&lt;/strong&gt; Any organizational structure changes can be applied quickly to users by modifying the corresponding roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less administration work:&lt;/strong&gt; Policies can be assigned to user groups instead of manually to individuals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure:&lt;/strong&gt; Utilization of the principle of least privilege reduces the risk of a data breach. Integrating third-party users is also more secure with RBAC, as we can give them strictly defined roles and permissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of RBAC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Assigning the appropriate roles can be challenging:&lt;/strong&gt; Assigning people to ill-fitting roles or creating new roles against policies may lead to security gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role explosion:&lt;/strong&gt;  Roles minimize the potential for altering the permissions for a single entity, forcing administrators to create new roles to give an entity a customized set of permissions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less scalable and less dynamic:&lt;/strong&gt; As the organization grows, RBAC may be difficult to maintain and manage due to the expansion of user categories and lack of compatibility of existing roles with the new organizational structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coarse-grained and static:&lt;/strong&gt; RBAC has fixed access rules that ignore other significant factors, such as time, location, or device, and limits access based only on a user's role.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Claims-based Access Control (CBAC)
&lt;/h2&gt;

&lt;p&gt;Organizations may utilize claims-based access control (CBAC), also known as attribute-based access control (ABAC), either as a replacement or a supplement to RBAC to provide more granular access control.&lt;/p&gt;

&lt;p&gt;CBAC restricts and provides access to critical resources based on a combination of three factors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user’s identity&lt;/li&gt;
&lt;li&gt;The user's responsibilities&lt;/li&gt;
&lt;li&gt;The context of the action performed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Attributes or claims are used to identify an entity based on its characteristics and allow you to implement rich, complex access policies more simply. For example, if a user is promoted from marketing to management, their access permission would be modified due to the change in their business attributes rather than because a system administrator explicitly changed the specific user’s role.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing CBAC
&lt;/h3&gt;

&lt;p&gt;The basics steps involved in the CBAC process are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the attributes needed to specify access rules: Three main categories of claims are based on the entity.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Subject/user claims: Characteristics of a user trying to access a resource such as a username, job title, user ID, and security clearance.&lt;/li&gt;
&lt;li&gt;Object/resource claims: Attributes of the resources such as filename, creation date, and ownership.&lt;/li&gt;
&lt;li&gt;Context/environment claims: Environmental characteristics such as time, place, type of communication, and type of device used to access a resource.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a set of rules to determine the attributes that allow user access based on the requirements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The given access to a user if the attributes match the rules specified.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Advantages of CBAC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flexible, granular policies:&lt;/strong&gt; Policies can be precisely defined, targetting specific attributes rather than the roles of the users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic access:&lt;/strong&gt; Since rules can be specified based on environmental parameters, access control can be done at runtime by evaluating the context and risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable:&lt;/strong&gt; Access can be easily given to new users without creating new policies or roles by simply assigning the attributes needed to access the resource.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure:&lt;/strong&gt; With context-sensitive rules, user privacy and resources can be protected based on the situation where access is requested.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of CBAC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Implementation is time-consuming:&lt;/strong&gt; Correctly identifying the mapping of authorization policies to attributes may consume time and resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparatively complex:&lt;/strong&gt; Granularity introduces complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Permission-based Access Control
&lt;/h2&gt;

&lt;p&gt;Conceptually, permitting users means granting access to a resource or allowing them to execute a specific operation in a system. Therefore, permission-based access control (PBAC) is a technique that defines the set of actions each user in the organization is allowed to perform on each resource.&lt;/p&gt;

&lt;p&gt;The image below illustrates how access is given to three entities using PBAC.&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%2F276dwvvnizmseaqp0t7u.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%2F276dwvvnizmseaqp0t7u.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.baeldung.com/cs/role-vs-permission-based-access-control" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing PBAC
&lt;/h3&gt;

&lt;p&gt;Enforcing PBAC is relatively straightforward compared to RBAC and CBAC. Access rules should be specified for each user as a tuple, indicating the resources and the permitted operations such as view, create, edit, and delete. Therefore, obtaining access rights to a resource means that, at the very least, the entity can read its content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of PBAC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fine granularity:&lt;/strong&gt; Permission can be defined flexibly for each entity for each resource in the system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure:&lt;/strong&gt; Since customized access levels are defined for each entity, only the least privileges will be given for all users to perform their tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages of PBAC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Less scalable:&lt;/strong&gt; When the number of users is high, managing permissions for each user individually is impractical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access is static:&lt;/strong&gt; The permissions are not specified based on the environmental context of the users accessing the resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Choose Which?
&lt;/h2&gt;

&lt;p&gt;Now that there is a clear understanding of each access control mechanism, let's compare the characteristics to identify the best use cases for each method. The table below shows a comparison of the three methods discussed.&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%2F08nfpewec3p8gpqdvjck.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%2F08nfpewec3p8gpqdvjck.png" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Considering all these differences, here's a summarized set of guidelines for choosing a well-suited access control mechanism for your organization.&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%2Fzd8qr0j781uit6wnuolr.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%2Fzd8qr0j781uit6wnuolr.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Access control is an essential step that needs to be taken to help ensure the security of your organizational resources.&lt;/p&gt;

&lt;p&gt;RBAC, CBAC, and PBAC are three popular access control mechanisms with pros and cons. This article provides guidance on selecting an access control method based on your organizational structure and resources.&lt;/p&gt;

&lt;p&gt;However, remember that these tips are highly generalized, and you might sometimes reap tremendous benefits from combining them rather than implementing a single access control mechanism.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Amplication Can Help
&lt;/h3&gt;

&lt;p&gt;Amplication provides a role-based permission model that is generated automatically with your code, saving you time setting up authentication and authorization in your app. You can create as many roles as needed and granularly set permissions per data model or specific fields for different roles. All the permissions are automatically enforced in the REST and GraphQL APIs including response filtering on specific fields.&lt;/p&gt;

&lt;p&gt;Amplication uses the &lt;code&gt;@nestjs/passport&lt;/code&gt; module as middleware to support authentication, providing a rich ecosystem of &lt;a href="https://www.passportjs.org/concepts/authentication/strategies/" rel="noopener noreferrer"&gt;strategies&lt;/a&gt; that implement various authentication mechanisms.&lt;/p&gt;

&lt;p&gt;Thank you for reading.&lt;/p&gt;

</description>
      <category>security</category>
      <category>backend</category>
    </item>
    <item>
      <title>4 Common Mistakes Made by Node.js Developers</title>
      <dc:creator>Amplication</dc:creator>
      <pubDate>Fri, 23 Dec 2022 06:39:39 +0000</pubDate>
      <link>https://dev.to/amplication/4-common-mistakes-made-by-nodejs-developers-1o97</link>
      <guid>https://dev.to/amplication/4-common-mistakes-made-by-nodejs-developers-1o97</guid>
      <description>&lt;p&gt;The growth of Node.js is tremendous. It’s clear why — Node.js helps us move fast, it has a rich packages ecosystem, it’s battle-tested and the usage of JavaScript allows businesses to go truly full-stack and cut the development lifecycle short.&lt;/p&gt;

&lt;p&gt;However, with great powers comes great responsibility (&lt;a href="https://arielweinberger.medium.com/json-web-token-jwt-the-only-explanation-youll-ever-need-cf53f0822f50"&gt;as I previously mentioned in my JWT article&lt;/a&gt;). After reflecting on the past 8 years of using Node.js, I decided to publish an article covering four common mistakes made by Node.js developers.&lt;/p&gt;

&lt;p&gt;Most of these are not Node-specific but rather back-end general. However, I will refer to concrete Node.js examples that are relevant to any developer in the ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #1 — Going live without well-defined log levels
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GRvWiOoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-assets.amplication.com/blog/4-common-mistakes-made-by-nodejs-developers/0.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GRvWiOoh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-assets.amplication.com/blog/4-common-mistakes-made-by-nodejs-developers/0.webp" alt="Log overhead" width="689" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I assume most of us are familiar with the concept of log levels (&lt;code&gt;DEBUG&lt;/code&gt;, &lt;code&gt;INFO&lt;/code&gt;, &lt;code&gt;WARN&lt;/code&gt;, &lt;code&gt;ERROR&lt;/code&gt;, etcetera).&lt;/p&gt;

&lt;p&gt;I have seen many cases where a product team is rushed to deliver a new microservice and forgets about clearly defining these log levels.&lt;/p&gt;

&lt;p&gt;There are two main drawbacks to this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It will make it a lot harder for you and your teammates to identify and tackle issues in production if the logs are flooded with irrelevant messages, such as low-level &lt;code&gt;DEBUG&lt;/code&gt; logs. These are not usually helpful for production workloads.&lt;/li&gt;
&lt;li&gt;It will dramatically increase the bill of whatever log ingestion service you use. I have seen this first-hand — going live with a new service and BOOM — a massive bump in expenses. Log ingestion services charge you by throughput and/or storage. 💸&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To tackle both points, make sure you use a logger with clearly-defined log levels. There are plenty of great logger libraries for Node.js (&lt;a href="https://www.npmjs.com/package/winston"&gt;winston&lt;/a&gt;, &lt;a href="https://www.npmjs.com/package/pino"&gt;pino&lt;/a&gt;, &lt;a href="https://www.npmjs.com/package/morgan"&gt;morgan&lt;/a&gt;) which provide you with a simple API for emitting logs of different types.&lt;/p&gt;

&lt;p&gt;Additionally, ensure you are able to configure the log level of your application at runtime via an environment variable (commonly seen is &lt;code&gt;LOG_LEVEL&lt;/code&gt;). This way you can adjust the log level according to your needs, whether you are working locally (set in your &lt;code&gt;.env&lt;/code&gt; file) or when running workloads on cloud environments (Staging, Production etcetera).&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #2 —Recklessly choosing your Dockerfile’s base image
&lt;/h2&gt;

&lt;p&gt;It is extremely common to deploy Node.js apps as containers and there are many benefits to doing so. When defining your Dockerfile, you declare the base image to use at the top of the file. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:18

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

&lt;/div&gt;



&lt;p&gt;This indicates that your image will be built based on the official Node.js version 18 image. What developers often don’t pay attention to, is the potential negative impact of this.&lt;/p&gt;

&lt;p&gt;Let’s stick to the Node 18 example. The above image is &lt;a href="https://github.com/nodejs/docker-node#nodeversion"&gt;based on the Debian operating system&lt;/a&gt;. This is a full operating system which adds a lot of overhead for a typical back-end API written in Node.js. The image size will be very large, take a long time to build, cost more to store, and more resources will be used by the container, thus affecting your scalability and performance.&lt;/p&gt;

&lt;p&gt;Solving this is quite easy — use an alternative image. It’s very common to see &lt;em&gt;alpine&lt;/em&gt; and &lt;em&gt;slim&lt;/em&gt; flavours of images. In a nutshell, these are Linux-based operating systems that are very lightweight and don’t contain many of the binaries and libraries preinstalled in a fully-featured operating system.&lt;/p&gt;

&lt;p&gt;When browsing the &lt;a href="https://hub.docker.com/_/node/tags"&gt;Node.js image tags on Docker Hub&lt;/a&gt;, we can see that both alpine and slim flavours are available. By simply making this change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:18-alpine

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

&lt;/div&gt;



&lt;p&gt;We saved a significant amount of time building the image and minimised the operating system’s overhead, thus optimising the overall performance of our containers. Additionally, the resulting image size is significantly smaller which makes it faster to build and push, and cheaper to store on a remote container registry. Win! 🥳&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tsKA-8Gq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-assets.amplication.com/blog/4-common-mistakes-made-by-nodejs-developers/1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tsKA-8Gq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-assets.amplication.com/blog/4-common-mistakes-made-by-nodejs-developers/1.webp" alt="Final image size comparison of a simple Express.js API built with different Node.js base images" width="475" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A whopping &lt;strong&gt;x5 reduced image size&lt;/strong&gt;. Now imagine the impact of this in a team that runs multiple CI pipelines for multiple services every day! 🤯&lt;/p&gt;

&lt;p&gt;Note that while this works in most cases, sometimes your app’s packages require certain low-level libraries that aren’t included in lightweight images by default. You will need to install them as a &lt;code&gt;RUN&lt;/code&gt; statement in your Dockerfile. Still, the benefits are well worth it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #3 — Not using asymmetric encryption when signing JSON Web Tokens (JWT)
&lt;/h2&gt;

&lt;p&gt;As I wrote in my article, &lt;a href="https://arielweinberger.medium.com/json-web-token-jwt-the-only-explanation-youll-ever-need-cf53f0822f50"&gt;"JSON Web Tokens (JWT) — the only explanation you will ever need&lt;/a&gt;", JSON Web Tokens are truly changing the world.&lt;/p&gt;

&lt;p&gt;It’s a fantastic tool to have when developing microservices for achieving distributed authorization.&lt;/p&gt;

&lt;p&gt;The mechanism is quite simple — you sign and verify tokens using cryptography.&lt;/p&gt;

&lt;p&gt;The simplest form of implementation allows you to use a secret (for example, &lt;code&gt;verySecret123&lt;/code&gt; to sign tokens. You will then use the same secret to verify those tokens. This is a &lt;strong&gt;symmetric&lt;/strong&gt; signature, because the same value is used to sign the token as well as verify it.&lt;/p&gt;

&lt;p&gt;If doing this in a distributed architecture, every one of your services will need access to that secret in order to verify tokens. This increases the chance of your secret being stolen, which may result in an attacker signing fake tokens, allowing them to elevate access or impersonate and perform operations on behalf of others. This is often overlooked, and poses a serious security risk! 🚨&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5sNxL0bk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-assets.amplication.com/blog/4-common-mistakes-made-by-nodejs-developers/2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5sNxL0bk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static-assets.amplication.com/blog/4-common-mistakes-made-by-nodejs-developers/2.webp" alt="Asymmetric VS Symmetric Cryptography" width="417" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The better way to sign JWTs is using an &lt;em&gt;asymmetric&lt;/em&gt; algorithm. Instead of using a raw secret value to sign and verify the tokens, you use a keypair (for example, generated via &lt;code&gt;openssl&lt;/code&gt;). The result is a &lt;strong&gt;private key&lt;/strong&gt; used to sign tokens, and a &lt;strong&gt;public key&lt;/strong&gt; used to verify tokens.&lt;/p&gt;

&lt;p&gt;This method is significantly more secure, as it allows the signing authority (for example your Auth Service) to exclusively possess the &lt;strong&gt;private key&lt;/strong&gt; and use it to sign tokens.&lt;/p&gt;

&lt;p&gt;Any other service in your architecture that needs to accept API requests can possess the &lt;strong&gt;public key&lt;/strong&gt; and use it to verify tokens.&lt;/p&gt;

&lt;p&gt;This greatly reduces the risk of your private key being stolen and exploited to generate tokens of false identities and/or elevated privileges, by limiting the number of service with access to it.&lt;/p&gt;

&lt;p&gt;If you are curious and want to know more, I cover this in detail in &lt;a href="https://arielweinberger.medium.com/json-web-token-jwt-the-only-explanation-youll-ever-need-cf53f0822f50"&gt;my bespoke JSON Web Tokens article&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake #4 — Storing passwords without unique salting
&lt;/h2&gt;

&lt;p&gt;In general, I am strongly against storing passwords on your systems, unless this is your core business (which entails heavy regulations and auditing). It’s all fun and games until it goes wrong. 👎&lt;/p&gt;

&lt;p&gt;Regardless, many companies opt-in to store passwords on their own systems. This is also an important topic for back-end developers to be familiar with.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;➡️ Before talking about this mistake, a quick primer on password authentication…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Remember that password validation is not an "encryption-decryption" operation. You take a raw password, run it through a hashing algorithm and store it, so that &lt;code&gt;myPassword123&lt;/code&gt; becomes something like &lt;code&gt;487753b945871b5b05f854060de151d8&lt;/code&gt; which gets stored in a database. Then, upon signing in, you take the user’s input and hash it. You then compare the result hash to that stored in your database, and if it’s a match — you authenticate the user.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;➡️ Now we are aligned! There are four levels of security when it comes to storing passwords:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Storing raw passwords 😭.&lt;/strong&gt; This is an absolute no-no. In the case of a database breach, and attacker will get access to the raw passwords of all of your users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashing passwords (no salt) 😖.&lt;/strong&gt; You take a user’s password and run it through a hashing algorithm as described above, and store it in your database. This will prevent an attacker from getting access to raw passwords which is great. However, since you simply hashed the password, an attacker can utilize a &lt;a href="https://www.beyondidentity.com/glossary/rainbow-table-attack"&gt;Rainbow Table attack&lt;/a&gt; in which they compare hashed passwords against their respective raw passwords, and identify matches. Remember that running myPassword123 through a simple hashing algorithm will always produce the same result!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashing passwords + global salt 🥴.&lt;/strong&gt; This method is very similar to the above, except you add a little "salt" to the password before hashing it. So you don’t really hash &lt;code&gt;myPassword123&lt;/code&gt;, but instead you hash &lt;code&gt;myPassword123+SOME_SALT&lt;/code&gt;. This means that a common password such as &lt;code&gt;myPassword123&lt;/code&gt; will look different as a hash in your database, and will protect you from rainbow table attacks. However, if your global salt is exposed, it becomes easier for an attacker to identify common passwords stored in your database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashing passwords + unique salt per password 💪.&lt;/strong&gt; This is the most robust and standard method of storing passwords today. Every password stored in your database is hashed with a unique salt. This significantly mitigates the chance of an attacker putting their hands on the raw passwords of your users, even in the case of a database breach. Implementing this is very easy, utilising a package such as &lt;a href="https://www.npmjs.com/package/bcrypt"&gt;Bcrypt&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Again, store your users’ passwords responsibly! Use a reliable and certified service to do that if you can, then you can focus on building your core product.&lt;/p&gt;

&lt;p&gt;Folks — this is a reminder that you should always use a password manager to auto-generate passwords wherever you sign up. Never re-use the same password. You don’t know how your passwords are handled! ⚠️&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Remarks
&lt;/h2&gt;

&lt;p&gt;If you're looking to build a new backend service and want to avoid some of these common mistakes, Amplication can help. Amplication makes it &lt;a href="https://amplication.com/blog/jwt-authentication-what-is-it-and-how-do-you-use-it-with-amplication"&gt;easy to use JWT&lt;/a&gt;, handles authentication securely, and is designed to &lt;a href="https://amplication.com/enterprise"&gt;support enterprise needs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That’s all! I hope you enjoyed this article. Let me know what you think in the comments. If there are any other topics you find interesting, I’d love to know and perhaps even write about it!&lt;/p&gt;

</description>
      <category>node</category>
      <category>authentication</category>
      <category>backend</category>
    </item>
    <item>
      <title>How to Start Your Next Backend Project - Boilerplates, Starters &amp; Frameworks</title>
      <dc:creator>Amplication</dc:creator>
      <pubDate>Tue, 20 Sep 2022 07:06:18 +0000</pubDate>
      <link>https://dev.to/amplication/how-to-start-your-next-backend-project-boilerplates-starters-frameworks-5dh9</link>
      <guid>https://dev.to/amplication/how-to-start-your-next-backend-project-boilerplates-starters-frameworks-5dh9</guid>
      <description>&lt;p&gt;&lt;a href="https://amplication.com/blog/the-long-way-for-creating-a-new-backend-server" rel="noopener noreferrer"&gt;A new backend project is on the horizon, and with every new project come new challenges and opportunities.&lt;/a&gt; You can implement everything in a way that fits your needs and the project’s goals, but every decision comes with its pros and cons.&lt;/p&gt;

&lt;p&gt;Modern software development moves fast, and since your last project, the technology landscape has changed, while libraries, services, and frameworks might have improved drastically.&lt;/p&gt;

&lt;p&gt;Questions you may face include: should you build something new from scratch, leverage code from previous projects, or choose something completely different as a base?&lt;/p&gt;

&lt;p&gt;Different approaches will deliver various benefits—you might want to save yourself time, or you might choose to go for more flexibility. This article will help you to find the right direction for your given project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building your backend from scratch
&lt;/h2&gt;

&lt;p&gt;The most low-level approach is building everything from scratch. But even this has a wide range of possibilities, with some tech companies producing everything from the ground up—hardware, firmware, operating system, web servers, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You get to choose everything, meaning maximum flexibility. If you need every ounce of performance you can get, build your system with C or Rust. If you have special security requirements, choose a hardened Linux distribution or Docker image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you’re building an application from scratch, you will spend most of your time on undifferentiated heavy lifting. This covers everything from authentication, authorization, and identity management to over-sorting, filtering, data validation, and more.&lt;/p&gt;

&lt;p&gt;You will also spend a significant amount of time on non-functional requirements. To run systems in the cloud in a controlled way, you need to implement observability and error reporting.&lt;/p&gt;

&lt;p&gt;Building this all by yourself can lead to you losing focus on actual business problems very quickly, and even if not, it will still slow you down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using templates from past projects
&lt;/h2&gt;

&lt;p&gt;If you’re building the same types of backends again and again, you’re in a lucky spot. This recurrence lets you use boilerplate code from your past projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No need to start from zero; just copy the code and replace the functional parts of the system.&lt;/p&gt;

&lt;p&gt;This also lets you copy the experience encoded in the modules and libraries you’ve built over the years. You don’t need to explicitly think about what exactly you did back when; it’s all there, right in the source code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem with this approach is that you now have two codebases that are very similar but distinct. And since you copied the code, you copied the bugs as well, so you need to apply the same fixes to both of them.&lt;/p&gt;

&lt;p&gt;Furthermore, you’re copying the old versions of libraries used to build a previous system. While they might be good enough in most cases, this can lead to bugs and difficult maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using boilerplates
&lt;/h2&gt;

&lt;p&gt;This approach is like the previous one, but you &lt;a href="https://dev.to/huzaifa99/top-5-node-express-boilerplates-for-building-restful-api-s-1ehl"&gt;copy somebody else’s old project instead of your old project&lt;/a&gt;. There are many such boilerplates on GitHub that are maintained by communities. Some are very basic, like a &lt;a href="https://github.com/hagopj13/node-express-boilerplate" rel="noopener noreferrer"&gt;Node.js REST API boilerplate&lt;/a&gt;, while others are higher level and include frameworks like Express and Socket.IO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://amplication.com/blog/amplication-release-0140-shifting-gears-towards-enterprise-ready-microservices-and-modular-code" rel="noopener noreferrer"&gt;The advantage here, versus copying your own backend project, is usually that those boilerplates are made to be copied and thus easier to fit to your task.&lt;/a&gt; And since communities maintain them, you get the aggregated experience of many people, not just you or your team. The many eyes looking over these projects lead to bug fixes and library updates, meaning you can get better quality without doing any extra work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The downside of this approach is that it is more generic than your own past projects. The code will not be tailored to your needs but made for a vast number of developers. This might require you to do more integration work and adjustments. Also, you know your code, while a new boilerplate can come with a considerable amount of code, which you’ll need to learn.&lt;/p&gt;

&lt;p&gt;Then, there’s the downside of your own codebase copy—after you copy the boilerplate, you’ll have to maintain all the parts that changed from the original.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using frameworks
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.simform.com/blog/best-nodejs-frameworks/" rel="noopener noreferrer"&gt;Frameworks&lt;/a&gt; form the foundation of many modern projects. You can use them when building from scratch or get them alongside a boilerplate that sets up the basic project structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Like boilerplates, frameworks come with the experience of other developers baked in. But unlike boilerplates, they do this with a package that other people will maintain. You simply update the dependency in your project when bugs are fixed and don’t need to keep track of changes to your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frameworks prescribe some structure for your project because they are often opinionated. Your project structure will look different if you build your system with NestJS instead of Sails.js.&lt;/p&gt;

&lt;p&gt;Frameworks often have their own terminology and way of doing things as well, which might not be easy for newcomers to grasp. Sure, you know what an API endpoint and a URL are, but do you know what a resolver or a mutation is? You’ll need to learn these things to be productive with a new framework.&lt;/p&gt;

&lt;p&gt;Another factor to consider is that if you don’t copy a boilerplate for the framework you’re using, you’ll still need to write some non-functional boilerplate code yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Amplication
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://amplication.com/" rel="noopener noreferrer"&gt;Amplication&lt;/a&gt; is the fast alternative to the approaches mentioned above. It lets you, the developer, configure the data models and relations with a UI or CLI, and it generates a functional backend code with Node.js, NestJS, Prisma, Postgres, Docker files, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Amplication lets you configure role-based access control, application data models, and other configurations using a graphical data-model editor or a CLI.&lt;/p&gt;

&lt;p&gt;The generated code is pushed continuously to a Git repository. Hence, as with any code, you have complete control over the generated code, and you can &lt;a href="https://docs.amplication.com/docs/how-to/custom-code/" rel="noopener noreferrer"&gt;customize and extend the code&lt;/a&gt; as you wish.&lt;/p&gt;

&lt;p&gt;Unlike any other boilerplate solution, the code generated by Amplication includes all the specific models and DTOs your application needs, including data validation, types, and the relation between models.&lt;/p&gt;

&lt;p&gt;The code is generated with authentication, authorization, filtering, sorting, pagination, logging, and docker files—it even has formatting and linting rules.&lt;/p&gt;

&lt;p&gt;You can select between a GraphQL API, REST API, or both. Plus, you can get a fully functional admin UI for CRUD operations on all your data models, including relations.&lt;/p&gt;

&lt;p&gt;Amplication is built around well-known frameworks and libraries, so it comes with the experience of many developers, not just the Amplication team.&lt;/p&gt;

&lt;p&gt;With Amplication, you are the owner of the generated code, and you can use it and deploy it any way you like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The code generated by Amplication is highly opinionated, with a specific technology stack, which may not be a good fit for all use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;[There are many different approaches to building your new backend project.]( Depending on your requirements, you can go as deep as you like and build everything from scratch to get maximum flexibility. On the other hand, the open-source ecosystem is extensive, so there might be some boilerplate or framework out there for you to save both time and money.&lt;/p&gt;

&lt;p&gt;If you want to move fast and still be flexible in the future, Amplication is a solid alternative. It allows you to build your application by writing minimal code for the infrastructure while focusing your efforts on writing business logic from day one.&lt;br&gt;&lt;br&gt;
Read one of our &lt;a href="https://docs.amplication.com/docs/tutorials/react-todos" rel="noopener noreferrer"&gt;tutorial articles&lt;/a&gt; to get started.&lt;/p&gt;

</description>
      <category>api</category>
      <category>backenddevelopment</category>
      <category>technical</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Release 0.15.0 - Support for Microservices Architecture</title>
      <dc:creator>Amplication</dc:creator>
      <pubDate>Sat, 20 Aug 2022 07:09:02 +0000</pubDate>
      <link>https://dev.to/amplication/release-0150-support-for-microservices-architecture-5b12</link>
      <guid>https://dev.to/amplication/release-0150-support-for-microservices-architecture-5b12</guid>
      <description>&lt;p&gt;Amplication Release 0.15.0 offers support for microservices through the introduction of a Project hierarchy.&lt;/p&gt;

&lt;p&gt;The Project groups together multiple resources used and created by Amplication, enabling support for multiple use cases. This simplifies the creation of connected Services, and makes it much easier to sync with GitHub across multiple Services.&lt;/p&gt;

&lt;p&gt;These developments will be especially welcome if you work at the enterprise-level, but it will enable all developers, individually or in teams, to move into the big-time of microservices architecture.&lt;/p&gt;

&lt;p&gt;Amplication is still the same &lt;a href="https://amplication.com/" rel="noopener noreferrer"&gt;node js app development&lt;/a&gt; platform taking the donkeywork out of backend development, but the new workflow means we need to see things differently. In the past we talked about Amplication only as a tool to create the backend for your apps. We still do that, of course, but today we empower you to see and develop on a broader canvas by working with Project hierarchies.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Projects, Resources, and Services?
&lt;/h2&gt;

&lt;p&gt;Starting with Release 0.15.0, &lt;strong&gt;Projects&lt;/strong&gt; , &lt;strong&gt;Resources&lt;/strong&gt; , and &lt;strong&gt;Services&lt;/strong&gt; are key concepts that drive Amplication’s workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project
&lt;/h3&gt;

&lt;p&gt;A Project is a hierarchy within Amplication that groups together multiple resources.&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%2F2lhd085e8gc2ne70r4qo.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%2F2lhd085e8gc2ne70r4qo.png" alt="project-structure.png" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project hierarchy supports use cases that are relevant to building a microservices architecture, with or without a monorepo.&lt;/p&gt;

&lt;p&gt;As a first step, Amplication 0.15.0 includes the following resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project configuration (default)&lt;/li&gt;
&lt;li&gt;Services&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resource
&lt;/h3&gt;

&lt;p&gt;A resource is any of the elements that go into creating a project with Amplication, such as Project Configuration and Service.&lt;/p&gt;

&lt;p&gt;In future releases we will introduce many more types of resources. This is where the Project concept will really come into its own - by supporting the generation of a full microservices architecture including message brokers, storage, API gateways, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Service
&lt;/h3&gt;

&lt;p&gt;A service is the output generated by Amplication.&lt;/p&gt;

&lt;p&gt;We used to call this output an app, but this implies that it is an application installed by the user. Services do not necessarily require user involvement, and so better describes the situation when each Service is one element in a solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does Amplication's project hierarchy make your life easier?
&lt;/h2&gt;

&lt;p&gt;In addition to the the ease of creating multiple connected services, Projects make your life easier by providing the following functionality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Connecting to a single Git repo at the Project level.&lt;/strong&gt; This will save you a lot of time when configuring a big project with many services, as you won’t need to connect each service manually. But rest assured - you remain in control, with the ability to override the settings at the Service level if you want to connect a specific Service or all Services to different repositories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single commit at the Project level.&lt;/strong&gt; This will manage changes across different services in the project, generate the code for all services, and get a PR for each.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How has the Amplication interface changed?
&lt;/h2&gt;

&lt;p&gt;As you would expect, we have revamped the Amplication interface to support the new Project hierarchy and Service creation workflows. Here is a brief look at some of the changes.&lt;/p&gt;

&lt;p&gt;Go to a &lt;strong&gt;Workspace&lt;/strong&gt; and select a &lt;strong&gt;Project&lt;/strong&gt; from the list (or add a new Project).&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%2Fewfd83dffqn5ij45f1xl.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%2Fewfd83dffqn5ij45f1xl.png" alt="Untitled" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the &lt;strong&gt;Project Configuration&lt;/strong&gt; banner and use the &lt;strong&gt;Project Configuration&lt;/strong&gt; dashboard to configure your project.&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%2F3crdj56bdpz75y99hv16.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%2F3crdj56bdpz75y99hv16.png" alt="Untitled" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, from the workspace, select &lt;strong&gt;New Service&lt;/strong&gt; and configure the settings on the new &lt;strong&gt;Amplication Service Creation Wizard&lt;/strong&gt;. This new feature simplifies the process of building a Service.&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%2Fi3iy3xkjz1mvfqjcfaqe.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%2Fi3iy3xkjz1mvfqjcfaqe.png" alt="Untitled" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create Service&lt;/strong&gt; and use the Service dashboard to configure your Service.&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%2F7fj7hjgl67ulld6n9l1q.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%2F7fj7hjgl67ulld6n9l1q.png" alt="Untitled" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The service you have just created is added to your Project.&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%2Fjemu1orr46686d5w2ryf.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%2Fjemu1orr46686d5w2ryf.png" alt="Untitled" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To view code or commit on the project level, select from the &lt;strong&gt;Resource List&lt;/strong&gt; at the top of the screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens to existing apps?
&lt;/h2&gt;

&lt;p&gt;If you have apps that were created in a previous Amplication release, each app will be wrapped into a new project, with the app presented as a Service in the Project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updates to Prisma, Lerna, and other packages
&lt;/h2&gt;

&lt;p&gt;As we worked on Release 0.15.0, we performed the usual chore tasks to make sure the internals of our codebase are up to date and functioning properly.&lt;/p&gt;

&lt;p&gt;Most noticeably:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new &lt;code&gt;@amplication/nest-logger-module&lt;/code&gt; package used for logging.&lt;/li&gt;
&lt;li&gt;Updated Prisma to version 5.4.3.&lt;/li&gt;
&lt;li&gt;Enabled Nx in Lerna. In the future, we plan to perform a full Nx migration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to dig deeper, check out the &lt;a href="https://github.com/amplication/amplication/releases" rel="noopener noreferrer"&gt;GitHub Release Changelog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>opensource</category>
      <category>node</category>
    </item>
  </channel>
</rss>
