<?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: Pablo Quezada</title>
    <description>The latest articles on DEV Community by Pablo Quezada (@pqzada).</description>
    <link>https://dev.to/pqzada</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%2F924620%2F7ad2e2bf-26d6-49f8-b3f9-69ab19ce679d.jpeg</url>
      <title>DEV Community: Pablo Quezada</title>
      <link>https://dev.to/pqzada</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pqzada"/>
    <language>en</language>
    <item>
      <title>Creating a Backstage.io App with Google SSO Authentication</title>
      <dc:creator>Pablo Quezada</dc:creator>
      <pubDate>Mon, 12 Sep 2022 01:39:52 +0000</pubDate>
      <link>https://dev.to/pqzada/creating-a-backstageio-app-with-google-sso-authentication-2jlm</link>
      <guid>https://dev.to/pqzada/creating-a-backstageio-app-with-google-sso-authentication-2jlm</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;Before you continue&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Before you continue with this article, you &lt;strong&gt;MUST&lt;/strong&gt; make sure that all the Backstage.io prerequisites are installed in you local environment.&lt;/p&gt;

&lt;p&gt;All the details can be found here: &lt;a href="https://backstage.io/docs/getting-started/#prerequisites" rel="noopener noreferrer"&gt;https://backstage.io/docs/getting-started/#prerequisites&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Also! you can find the source of this app in my github account: &lt;a href="https://github.com/pqzada/backstage-demo-app" rel="noopener noreferrer"&gt;https://github.com/pqzada/backstage-demo-app&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Creating a new Backstage.io App&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;To create a new Backstage.io App you must run 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;npx @backstage/create-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This it’s going to ask you for the app name. In this exercise, we are going to use &lt;strong&gt;backstage-demo-app&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;? Enter a name &lt;span class="k"&gt;for &lt;/span&gt;the app &lt;span class="o"&gt;[&lt;/span&gt;required] backstage-demo-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may take a while… just be patient.&lt;/p&gt;

&lt;p&gt;If it asks you for a database, select &lt;strong&gt;PostgreSQL&lt;/strong&gt;. If don’t, that’s ok. We will configure it in the next section.&lt;/p&gt;

&lt;p&gt;When the installation is done, you should enter the app folder and run the dev environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backstage-demo-app &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; yarn dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;Database configuration&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Now that our Backstage.io App is created and running, we are going to create a PostgreSQL container with docker and complete the configuration in our App.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: If you already have PostgreSQL installed in your local environment, you can skip the next section and go to the PostgreSQL configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Creating a PostgreSQL container with Docker&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To avoid having to install the database in our local environment, we are going to create a docker container with the last image available for Postgres.&lt;/p&gt;

&lt;p&gt;Go to the root of your application and create a &lt;code&gt;docker-compose.yaml&lt;/code&gt; file. Then paste the following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=postgres&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;5432:5432'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db:/var/lib/postgresql/data&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the container 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;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything it’s ok, then the response should be like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Starting backstage-demo-app_db_1 ...done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Configuration of PostgreSQL in our Backstage Demo App&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Stop out Backstage Demo App (&lt;code&gt;CTRL + C&lt;/code&gt;) and go to the root directory using the terminal. Execute the following command to start the PostgreSQL client configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add &lt;span class="nt"&gt;--cwd&lt;/span&gt; packages/backend pg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit the &lt;code&gt;app-config.yaml&lt;/code&gt; file and set your PostgreSQL configuration using the data from the previous steps (look in the &lt;code&gt;docker-compose.yaml&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Search for the &lt;strong&gt;backend &amp;gt; database&lt;/strong&gt; section and replace the content with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pg&lt;/span&gt;
  &lt;span class="na"&gt;connection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5432&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start Backstage again.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Google SSO configuration&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;To enable Google SSO in our Backstage Demo App we must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create OAuth credentials for our app&lt;/li&gt;
&lt;li&gt;Set the OAuth credentials in our app-config.yaml file&lt;/li&gt;
&lt;li&gt;Add the Google Auth Provider to the Sign In page&lt;/li&gt;
&lt;li&gt;Configure Google Provider to support Sign In&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Create OAuth credentials for our app&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To log in using the Google SSO we need to create OAuth credentials first. If you don’t know how to do this, check this other article:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/pqzada/how-to-configure-the-google-authentication-provider-for-backstageio-4elg"&gt;How to configure the Google Authentication Provider for Backstage.io&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Set the OAuth credentials in our app-config.yaml file&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Open your &lt;code&gt;app-config.yaml&lt;/code&gt; and set the &lt;code&gt;auth&lt;/code&gt; config. It should end up looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;development&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;development&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;YOUR_CLIENT_ID&lt;/span&gt;
        &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;YOUR_CLIENT_SECRET&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Add the Google Auth Provider to the Sign In page&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next, we must add the provider to the Sign In page. To do this, open the &lt;code&gt;packages/app/src/App.tsx&lt;/code&gt; file, and below the last &lt;code&gt;import&lt;/code&gt; line, add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;googleAuthApiRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@backstage/core-plugin-api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SignInProviderConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SignInPage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@backstage/core-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;googleProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SignInProviderConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google-auth-provider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Google&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sign in using Google&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;apiRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;googleAuthApiRef&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;Then search for &lt;code&gt;const app = createApp({&lt;/code&gt; and below &lt;code&gt;apis,&lt;/code&gt; add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;apis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;SignInPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SignInPage&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;auto&lt;/span&gt; &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;guest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;googleProvider&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;bindRoutes&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;bind&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;At this point, we have added the&lt;code&gt;SignInPage&lt;/code&gt; component for our Google Provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Configure Google Provider to support Sign In&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Open the file &lt;code&gt;packages/backend/src/plugins/auth.ts&lt;/code&gt; and change the &lt;code&gt;createPlugin&lt;/code&gt;so it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createPlugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PluginEnvironment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createRouter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;discovery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;discovery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;tokenManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tokenManager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;providerFactories&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;defaultAuthProviderFactories&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;signIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;resolver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User profile contained no email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signInWithCatalogUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
              &lt;span class="na"&gt;entityRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important here is that we added some specific &lt;strong&gt;logic to resolve the sign in with the Google Provider&lt;/strong&gt;. So, take some time to understand it.&lt;/p&gt;

&lt;p&gt;More information about the identity resolver can be found here: &lt;a href="https://backstage.io/docs/auth/identity-resolver" rel="noopener noreferrer"&gt;https://backstage.io/docs/auth/identity-resolver&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Adding our user to the catalog&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If we check the previous code, the login it’s going to be done with the catalog (&lt;code&gt;signInWithCatalogUser&lt;/code&gt;), searching for an &lt;code&gt;entityRef&lt;/code&gt;with the &lt;code&gt;name&lt;/code&gt;. This &lt;code&gt;name&lt;/code&gt; is our email without the &lt;code&gt;@gmail.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If we try to login right now we are going to get an “&lt;strong&gt;User not found&lt;/strong&gt;” error like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F6nrhfnkie4j8fg19ipl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F6nrhfnkie4j8fg19ipl4.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6nrhfnkie4j8fg19ipl4.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is because our user doesn’t exists in the catalog. So, let’s try to add it.&lt;/p&gt;

&lt;p&gt;In the root of our app create new folder called &lt;code&gt;catalog&lt;/code&gt; and in the inside a new file called &lt;code&gt;org.yaml&lt;/code&gt;. Add this content to the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backstage.io/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Group&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;users&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;team&lt;/span&gt;
  &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backstage.io/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pqzada&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;memberOf&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, open the &lt;code&gt;app-config.yaml&lt;/code&gt; file and add this lines in the locations sections.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;locations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s"&gt;...&lt;/span&gt;
    &lt;span class="s"&gt;- type&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file&lt;/span&gt;
      &lt;span class="s"&gt;target&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;../../catalog/org.yaml&lt;/span&gt;
      &lt;span class="s"&gt;rules&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;allow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;User&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Group&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, we are telling our app that search in the &lt;code&gt;org.yaml&lt;/code&gt; for users and groups.&lt;/p&gt;

&lt;p&gt;And now if we restart our app and try to log in with our Gmail account… works OK!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fuqizqtxfe7r9kdrf83gk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fuqizqtxfe7r9kdrf83gk.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uqizqtxfe7r9kdrf83gk.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any doubts? comment below!! or reach me on Twitter: &lt;a href="https://twitter.com/pqzada" rel="noopener noreferrer"&gt;https://twitter.com/pqzada&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to configure the Google Authentication Provider for Backstage.io</title>
      <dc:creator>Pablo Quezada</dc:creator>
      <pubDate>Mon, 12 Sep 2022 01:30:58 +0000</pubDate>
      <link>https://dev.to/pqzada/how-to-configure-the-google-authentication-provider-for-backstageio-4elg</link>
      <guid>https://dev.to/pqzada/how-to-configure-the-google-authentication-provider-for-backstageio-4elg</guid>
      <description>&lt;p&gt;&lt;a href="https://media.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%2Fyiyhqy7kqeqjnvpxe14z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fyiyhqy7kqeqjnvpxe14z.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yiyhqy7kqeqjnvpxe14z.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To configure the Google Authentication Provider for &lt;a href="http://backstage.io/" rel="noopener noreferrer"&gt;Backstage.io&lt;/a&gt; we need to create the credentials in the Google Console and then use them to configure Google in your Backstage App.&lt;/p&gt;

&lt;p&gt;The general instructions can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://backstage.io/docs/auth/google/provider#create-oauth-credentials" rel="noopener noreferrer"&gt;https://backstage.io/docs/auth/google/provider#create-oauth-credentials&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article we are going to complete this configuration in GCP and then modify our Backstage App so it uses this credentials.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Creating App Credentials in GCP&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Log in to the Google Console&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;First we must go to: &lt;a href="https://console.cloud.google.com/" rel="noopener noreferrer"&gt;https://console.cloud.google.com/&lt;/a&gt; and login using our Google account.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Select or create new project&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Then we must select our project. If you don’t have one, you can create one selecting the “&lt;strong&gt;NEW PROJECT&lt;/strong&gt;” option (”&lt;strong&gt;PROYECTO NUEVO&lt;/strong&gt;” in the image). If you already have one just select it in the top left dropdown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fjx2fa3hriq4nj7v2srpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjx2fa3hriq4nj7v2srpf.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jx2fa3hriq4nj7v2srpf.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case I created a new project called “&lt;strong&gt;backstage-pqzada&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fiin0l9iaies9936d4vba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fiin0l9iaies9936d4vba.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iin0l9iaies9936d4vba.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Create credentials&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Navigate to: &lt;a href="https://console.cloud.google.com/apis/credentials" rel="noopener noreferrer"&gt;https://console.cloud.google.com/apis/credentials&lt;/a&gt;, press the “&lt;strong&gt;CREATE CREDENTIALS&lt;/strong&gt;” button and select the “&lt;strong&gt;OAuth client ID&lt;/strong&gt;” option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fio3bgk35ehh0ih4lkd8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fio3bgk35ehh0ih4lkd8b.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/io3bgk35ehh0ih4lkd8b.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this is our first time, it’s going to ask us to configure your consent screen. So, press the “&lt;strong&gt;CONFIGURE CONSENT SCREEN&lt;/strong&gt;” button and complete the form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fzeurji9b14o7dpwx97ze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fzeurji9b14o7dpwx97ze.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zeurji9b14o7dpwx97ze.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Consent Screen Configuration&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this case we are going to configure and register our app for testing mode, so select the “&lt;strong&gt;External&lt;/strong&gt;” option and press “&lt;strong&gt;CREATE&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;Next, complete with the app information. I’m going to fill only the required fields, but you must complete everything if this is not your development environment (&lt;em&gt;DevOps team should have this super clear&lt;/em&gt;). When you are done, press “&lt;strong&gt;SAVE AND CONTINUE&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fw5pw4onhsvvdm7e4rdh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fw5pw4onhsvvdm7e4rdh6.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5pw4onhsvvdm7e4rdh6.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next section, press the “&lt;strong&gt;ADD OR REMOVE SCOPES&lt;/strong&gt;” button and select:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;openid&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;auth/userinfo.email&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;auth/userinfo.profile&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ft2l7ho02jykub6pjqlx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ft2l7ho02jykub6pjqlx8.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t2l7ho02jykub6pjqlx8.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Press the “&lt;strong&gt;UPDATE&lt;/strong&gt;” button in the bottom-right corner and then “&lt;strong&gt;SAVE AND CONTINUE&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;After that we need to add test users. So, press the button “&lt;strong&gt;ADD USERS&lt;/strong&gt;” and add all the test users that you need. Then, again, “&lt;strong&gt;SAVE AND CONTINUE&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F8xk043jgxi492005i0l6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F8xk043jgxi492005i0l6.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8xk043jgxi492005i0l6.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last sections is a “&lt;strong&gt;Summary&lt;/strong&gt;”, we have an “&lt;strong&gt;EDIT&lt;/strong&gt;” link in case we need to modify something. If don’t just press the “&lt;strong&gt;BACK TO DASHBOARD&lt;/strong&gt;” button.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Create credentials (second try)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now we try to create our credentials again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fio3bgk35ehh0ih4lkd8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fio3bgk35ehh0ih4lkd8b.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/io3bgk35ehh0ih4lkd8b.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This time won’t ask for the consent screen configuration.&lt;/p&gt;

&lt;p&gt;Now we must complete the form with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application type&lt;/strong&gt;: Web application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: Any name you want&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorized JavaScript origins&lt;/strong&gt;: &lt;a href="http://localhost:3000/" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorized Redirect URIs&lt;/strong&gt;. &lt;a href="http://localhost:7007/api/auth/google/handler/frame" rel="noopener noreferrer"&gt;http://localhost:7007/api/auth/google/handler/frame&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.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%2Febyi3be3en4aratj666o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Febyi3be3en4aratj666o.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ebyi3be3en4aratj666o.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click “&lt;strong&gt;CREATE&lt;/strong&gt;”.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;OAuth client created&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Finally it’s going to show us a modal with our “&lt;strong&gt;Client ID&lt;/strong&gt;” and “&lt;strong&gt;Client Secret”&lt;/strong&gt;. Copy this values because you are going to need them in the next section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F45o1b9hp8zvtxysf6tte.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F45o1b9hp8zvtxysf6tte.png" alt="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/45o1b9hp8zvtxysf6tte.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Google Authentication Provider configuration in your Backstage App&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;This section assumes that you already have a Backstage.io App running in your local environment. If you don’t, you can find a step by step guide in this article: &lt;a href="https://dev.to/pqzada/creating-a-backstageio-app-with-google-sso-authentication-2jlm"&gt;Creating a Backstage.io App with Google SSO Authentication&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To configure the OAuth credentials in our Backstage.io App, we must open the app-config.yaml file and add the following values in the &lt;strong&gt;auth&lt;/strong&gt; section.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;development&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;development&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;YOUR_CLIENT_ID&lt;/span&gt;
        &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;YOUR_CLIENT_SECRET&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember that we must replace the “YOUR_CLIENT_ID” and “YOUR_CLIENT_SECRET” strings with the Client ID and Client Secret values from the previous section.&lt;/p&gt;

&lt;p&gt;And we are done…&lt;/p&gt;

&lt;p&gt;Any doubts? comment below!! or reach me on Twitter: &lt;a href="https://twitter.com/pqzada" rel="noopener noreferrer"&gt;https://twitter.com/pqzada&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backstage</category>
      <category>googlecloud</category>
    </item>
  </channel>
</rss>
