<?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: Zaqueu Cavalcante</title>
    <description>The latest articles on DEV Community by Zaqueu Cavalcante (@zaqueucavalcante).</description>
    <link>https://dev.to/zaqueucavalcante</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%2F855588%2F1202e060-81c8-4f2f-ab1e-e4cdea9d050f.jpg</url>
      <title>DEV Community: Zaqueu Cavalcante</title>
      <link>https://dev.to/zaqueucavalcante</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zaqueucavalcante"/>
    <language>en</language>
    <item>
      <title>🔐 OAuth 2.0 + OpenID Connect (OIDC) 🪪</title>
      <dc:creator>Zaqueu Cavalcante</dc:creator>
      <pubDate>Tue, 08 Apr 2025 23:08:36 +0000</pubDate>
      <link>https://dev.to/zaqueucavalcante/oauth-20-openid-connect-oidc-3bi4</link>
      <guid>https://dev.to/zaqueucavalcante/oauth-20-openid-connect-oidc-3bi4</guid>
      <description>&lt;p&gt;O objetivo desse projeto é mostrar na prática o uso dos protocolos OAuth 2.0 e OpenID Connect.&lt;/p&gt;

&lt;p&gt;Para facilitar o entendimento, vamos supor que você quer usar uma aplicação web para desenhar diagramas, como o Draw.io.&lt;/p&gt;

&lt;p&gt;No primeiro cenário, você vai se cadastrar na aplicação, informar nome e email, confirmar seu email, definir sua senha e enfim logar no sistema. O Draw.io possui integração com o Google Drive, o que permite que você salve seus diagramas na nuvem e os acesse de qualquer lugar. Mas como você pode habilitar essa funcionalidade de maneira simples e segura? Como garantir que o Draw.io vai poder acessar apenas os arquivos que você &lt;strong&gt;autorizar&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;No segundo cenário, suponha que você não quer passar por todo o fluxo de se cadastrar no sistema, confirmar seu email, definir senha e só então logar no app. Afinal, você já está logado na sua conta Google, poderia muito bem usar ela para se &lt;strong&gt;autenticar&lt;/strong&gt; no Draw.io. Mas novamente, como isso pode ser feito, de maneira simples e segura?&lt;/p&gt;

&lt;p&gt;A seguir veremos como esses dois problemas podem ser resolvidos através dos protocolos OAuth e OIDC!&lt;/p&gt;

&lt;p&gt;Código ➜ &lt;a href="https://github.com/ZaqueuCavalcante/oauth" rel="noopener noreferrer"&gt;https://github.com/ZaqueuCavalcante/oauth&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1️⃣ Simulando o Draw.io&lt;/li&gt;
&lt;li&gt;2️⃣ Setup Inicial&lt;/li&gt;
&lt;li&gt;3️⃣ Autorização com OAuth 2.0&lt;/li&gt;
&lt;li&gt;4️⃣ Autenticação com OpenID Connect (OIDC)&lt;/li&gt;
&lt;li&gt;5️⃣ Referências&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1️⃣ Simulando o Draw.io
&lt;/h2&gt;

&lt;p&gt;Para ver na prática como esses protocolos funcionam, criei uma API em .NET bem simples, que vai simular a aplicação do Draw.io nos dois cenários descritos anteriormente. Vou me referir a essa API como DrawApp de agora em diante.&lt;/p&gt;

&lt;p&gt;Ela possui os seguintes endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;POST /users&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Cria um usuário, informando nome, email e senha&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;POST /login&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Realiza o login no sistema, informando email e senha (a autenticação é feita via Cookie)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;GET /users/data&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retorna alguns dados do usuário logado: nome, email e se a integração com o Google Drive está ativada&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;GET /oauth/google-drive&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redireciona o usuário logado para a tela de consenso do Google (onde ele pode autorizar que o DrawApp salve dados no seu Google Drive)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;POST /google-drive/files&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permite a criação de arquivos no Google Drive do usuário, caso ele tenha autorizado o acesso usando o endpoint anterior&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;GET /login/google&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redireciona o usuário para a tela de consenso do Google (onde ele pode autorizar que o DrawApp obtenha seus dados pessoais para a realização do cadastro + login)&lt;/li&gt;
&lt;/ul&gt;


&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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Fshort_api_docs.gif%3Fraw%3Dtrue" 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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Fshort_api_docs.gif%3Fraw%3Dtrue" width="760" height="451"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Estou usando o Postgres para salvar todos os dados do DrawApp. Tenho apenas duas tabelas, uma pros usuários e outra para seus tokens de acesso.&lt;/p&gt;

&lt;h2&gt;
  
  
  2️⃣ Setup Inicial
&lt;/h2&gt;

&lt;p&gt;Antes de mais nada, é razoável pensar que o DrawApp precisa estar previamente configurado no Google para que tudo isso funcione. Afinal, quando o usuário é redirecionado pra tela de consenso, o Google já conhece o DrawApp e sabe quais permissões ele deseja obter do usuário.&lt;/p&gt;

&lt;p&gt;Seguem os principais passos para realizar esse setup inicial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar projeto no Google Cloud e configurar seu nome como DrawApp&lt;/li&gt;
&lt;li&gt;Habilitar o acesso do DrawApp à API do Google Drive&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adicionar meu email como usuário de teste (para que funcione em localhost)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adicionar escopo de acesso ao Google Drive que o DrawApp vai pedir pro usuário no fluxo de autorização (OAuth 2.0)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vamos usar o escopo "drive.file", que permite &lt;strong&gt;apenas&lt;/strong&gt; a criação/edição de arquivos que o usuário utilizou no DrawApp&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Adicionar escopos para que o DrawApp tenha acesso aos dados necessários para realizar o login via conta Google (OIDC)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aqui vamos usar os escopos "openid" e "userinfo.email", que juntos retornam dados pessoais do usuário, como nome e email&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Dentro do projeto no Google Cloud, criar nossas credenciais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URI de origem            -&amp;gt; &lt;a href="http://localhost:5001" rel="noopener noreferrer"&gt;http://localhost:5001&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;URI de callback do OAuth -&amp;gt; &lt;a href="http://localhost:5001/oauth/drawapp-callback" rel="noopener noreferrer"&gt;http://localhost:5001/oauth/drawapp-callback&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;URI de callback do OIDC  -&amp;gt; &lt;a href="http://localhost:5001/oidc/drawapp-callback" rel="noopener noreferrer"&gt;http://localhost:5001/oidc/drawapp-callback&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ClientId                 -&amp;gt; Identifica o DrawApp dentro do Authorization Server (Google)&lt;/li&gt;
&lt;li&gt;ClientSecret             -&amp;gt; Autentica o DrawApp dentro do Authorization Server (Google)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Adicionei um docker-compose.yml ao repositório, caso você queira rodar o DrawApp na sua máquina também.&lt;/p&gt;

&lt;h2&gt;
  
  
  3️⃣ Autorização com OAuth 2.0
&lt;/h2&gt;

&lt;p&gt;Vamos voltar pro primeiro cenário apresentado lá no começo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você vai se cadastrar no DrawApp, informar nome e email, confirmar seu email, definir sua senha e enfim logar no sistema.&lt;br&gt;
O DrawApp possui integração com o Google Drive, o que permite que você salve seus diagramas na nuvem e os acesse de qualquer lugar.&lt;br&gt;
Mas como você pode habilitar essa funcionalidade de maneira simples e segura?&lt;br&gt;
Como garantir que o DrawApp vai poder acessar apenas os arquivos que você &lt;strong&gt;autorizar&lt;/strong&gt;?&lt;br&gt;
E indo além, como posso revogar o acesso do DrawApp ao meu Google Drive?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podemos atingir esses objetivos usando o OAuth, pois ele é um protocolo de autorização criado justamente para problemas desse tipo (Delegated Authorization).&lt;/p&gt;

&lt;h3&gt;
  
  
  Vamos definir alguns termos antes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resource Owner&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;O usuário, que usa o DrawApp e é dono da conta no Google Drive&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Client&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;DrawApp, a aplicação que está pedindo permissão ao usuário para acessar seus arquivos no Google Drive&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Resource Server&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Google Drive, onde estão os recursos (arquivos) do usuário&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Authorization Server&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servidor do Google que intermedia todos os fluxos&lt;/li&gt;
&lt;li&gt;Ele é o responsável pela emissão de códigos e tokens de acesso&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Scopes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;São as permissões que o DrawApp quer receber do usuário (mostradas na tela de consentimento do Authorization Server)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Redirect URI&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Callback URI (&lt;a href="http://localhost:5001/oauth/drawapp-callback" rel="noopener noreferrer"&gt;http://localhost:5001/oauth/drawapp-callback&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;O Authorization Server redireciona o usuário pra essa URI quando ele permite que o DrawApp tenha acesso ao Google Drive&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Authorization Code&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esse código é a prova que o usuário clicou em "Permitir acesso" na tela de consentimento&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Access Token&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O DrawApp utiliza o Authorization Code, juntamente com seu ClientId e ClientSecret, para obter esse token no Authorization Server&lt;/li&gt;
&lt;li&gt;O token obtido permite que o DrawApp tenha acesso ao Google Drive do usuário&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;State&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valor aleatório gerado pelo Client e validado depois na chamada de callback (ajuda a mitigar ataques de Cross-Site Request Forgery)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Segue o fluxo de registro e login no sistema
&lt;/h3&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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2F01_register_and_login.gif%3Fraw%3Dtrue" 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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2F01_register_and_login.gif%3Fraw%3Dtrue" width="914" height="742"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;0️⃣ Usuário informa nome + email ao DrawApp&lt;/p&gt;

&lt;p&gt;1️⃣ Sistema gera token para definição de senha e o envia pra email informado&lt;/p&gt;

&lt;p&gt;2️⃣ Usuário envia token + senha pro DrawApp, completando seu registro no app&lt;/p&gt;

&lt;p&gt;3️⃣ Usuário agora informa email + senha pra logar no app&lt;/p&gt;

&lt;p&gt;4️⃣ DrawApp gera um Cookie de autenticação e retorna ele pro navegador do usuário&lt;/p&gt;

&lt;h3&gt;
  
  
  Uma vez logado, agora o usuário pode habilitar a integração com o Google Drive
&lt;/h3&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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Foauth_flow.gif%3Fraw%3Dtrue" 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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Foauth_flow.gif%3Fraw%3Dtrue" width="1191" height="742"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;0️⃣ Usuário acessa o endpoint &lt;strong&gt;GET /oauth/google-drive&lt;/strong&gt; para permitir que o DrawApp possa salvar arquivos na sua conta do Google Drive&lt;/p&gt;

&lt;p&gt;1️⃣ Ao acessar esse endpoint, o DrawApp monta a seguinte url e redireciona o usuário pro Authorization Server através dela&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://accounts.google.com/o/oauth2/v2/auth?
client_id=11118065658&amp;amp;
scope=https://www.googleapis.com/auth/drive.file&amp;amp;
redirect_uri=http://localhost:5001/oauth/drawapp-callback&amp;amp;
response_type=code&amp;amp;
state=qHtkl100DwyOWVLVmctDOW47
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Significado de cada parâmetro:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- client_id: identificador do DrawApp lá no Google (obtido no Setup Inicial)
- scope: escopo que o DrawApp quer ter acesso
- redirect_uri: pra onde o Authorization Server deve redirecionar o usuário quando ele permitir o acesso
- response_type: qual tipo de resposta o DrawApp espera receber do Authorization Server (no caso, ele espera receber um Authorization Code)
- state: valor aleatório gerado pelo Client e validado depois na chamada de callback (ajuda a mitigar ataques de Cross-Site Request Forgery)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2️⃣ Agora na página de consentimento do Authorization Server, o usuário pode ver quais escopos o DrawApp quer acessar. Ao clicar em "Continuar", o Authorization Server irá gerar um Authorization Code e enviá-lo pro DrawApp ao redirecionar o usuário pra Callback URI definida no setup inicial&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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Foauth_consent_scopes.png%3Fraw%3Dtrue" 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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Foauth_consent_scopes.png%3Fraw%3Dtrue" width="1095" height="634"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A URL de callback é a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:5001/oauth/drawapp-callback?
state=qHtkl100DwyOWVLVmctDOW47&amp;amp;
code=4/0ASVgi3LdgvHEjS-wQtZpra6C9xRH0nTwGhQrP8xb4fjrRxnHe_s0fFc2SBEj7ZTrjgYurA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Significado de cada parâmetro:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- state: mesmo valor explicado anteriormente
- code: Authorization Code, a prova de que o usuário permitiu que o DrawApp tivesse acesso ao escopo drive.file do seu Google Drive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;3️⃣ Internamente, o DrawApp utiliza o Authorization Code (juntamente com ClientId + ClientSecret) para realizar uma chamada pra API do Authorization Server (&lt;a href="https://oauth2.googleapis.com/token" rel="noopener noreferrer"&gt;https://oauth2.googleapis.com/token&lt;/a&gt;), que valida todas as informações e retorna um Access Token pro DrawApp. Esse token é então salvo no banco de dados e toda vez que o usuário quiser salvar um diagrama no seu Google Drive, basta que o DrawApp envie o Access Token nas chamadas de API. Para provar que tudo funciona, chamei o endpoint &lt;strong&gt;POST /google-drive/files&lt;/strong&gt; para criar arquivos no Google Drive via DrawApp. Segue o print dos arquivos criados:&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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Fcreated_files.png%3Fraw%3Dtrue" 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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Fcreated_files.png%3Fraw%3Dtrue" width="952" height="276"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;4️⃣ Se o usuário não quiser mais permitir o acesso do DrawApp ao seu Google Drive, basta acessar sua conta Google e revogar as permissões dadas anteriormente.&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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Fauthorized_draw_app.png%3Fraw%3Dtrue" 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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Fauthorized_draw_app.png%3Fraw%3Dtrue" width="890" height="675"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  4️⃣ Autenticação com OpenID Connect (OIDC)
&lt;/h2&gt;

&lt;p&gt;Vamos voltar pro segundo cenário apresentado lá no começo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Suponha que você não quer passar por todo o fluxo de se cadastrar no sistema, confirmar seu email, definir senha e só então logar no app.&lt;br&gt;
Afinal, você já está logado na sua conta Google, poderia muito bem usar ela para se &lt;strong&gt;autenticar&lt;/strong&gt; no DrawApp.&lt;br&gt;
Mas novamente, como isso pode ser feito, de maneira simples e segura?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como acabamos de ver, o OAuth é desenhado para resolver problemas de autorização. No entanto, com algumas modificações, daria pra extendê-lo e usá-lo como um protocolo de autenticação. Assim nasce o protocolo OpenID Connect!&lt;/p&gt;

&lt;p&gt;Perceba que o OAuth não entrega pro DrawApp nenhuma informação pessoal do usuário, como nome ou email, que poderiam ser usadas para autenticá-lo. O OIDC surge como uma camada acima do OAuth, definindo um padrão para que esses dados sobre o usuário cheguem até o Client.&lt;/p&gt;

&lt;p&gt;Dessa forma, o OIDC possibilita que o usuário utilize sua conta Google para se cadastrar e logar no DrawApp de maneira automática, apenas com alguns cliques.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenID Connect passo a passo
&lt;/h3&gt;

&lt;p&gt;O fluxo do OIDC é praticamente o mesmo do OAuth, só que o DrawApp recebe um ID Token quando o usuário clica em "Continuar". Esse token é um JWT que contém diversas informações pessoais do usuário, como nome e email. Com esses dados, o DrawApp consegue cadastrar e logar o usuário automaticamente.&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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Foidc_flow.gif%3Fraw%3Dtrue" 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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Foidc_flow.gif%3Fraw%3Dtrue" width="1424" height="717"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;0️⃣ Usuário acessa o endpoint &lt;strong&gt;GET /login/google&lt;/strong&gt; para realizar login no DrawApp usando sua conta Google&lt;/p&gt;

&lt;p&gt;1️⃣ Ao acessar esse endpoint, o DrawApp monta a seguinte url e redireciona o usuário pro Authorization Server através dela&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://accounts.google.com/o/oauth2/v2/auth?
client_id=11118065658&amp;amp;
scope=openid profile https://www.googleapis.com/auth/userinfo.email&amp;amp;
redirect_uri=http://localhost:5001/oidc/drawapp-callback&amp;amp;
response_type=code id_token&amp;amp;
state=zMivNStaPUItbPvLrwx7fx2Jw9M8JW23i1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Significado de cada parâmetro:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- client_id: identificador do DrawApp lá no Google (obtido no Setup Inicial)
- scope: escopos que o DrawApp quer ter acesso
- redirect_uri: pra onde o Authorization Server deve redirecionar o usuário quando ele permitir o acesso
- response_type: qual tipo de resposta o DrawApp espera receber do Authorization Server (no caso, ele espera receber um Authorization Code + um ID Token)
- state: valor aleatório gerado pelo Client e validado depois na chamada de callback (ajuda a mitigar ataques de Cross-Site Request Forgery)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;2️⃣ Agora na página de consentimento do Authorization Server, o usuário pode ver quais escopos o DrawApp quer acessar. Ao clicar em "Continuar", o Authorization Server irá gerar um Authorization Code + ID Token e enviá-los pro DrawApp ao redirecionar o usuário pra Callback URI definida no setup inicial&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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Foidc.png%3Fraw%3Dtrue" 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%2Fgithub.com%2FZaqueuCavalcante%2Foauth%2Fblob%2Fmaster%2FDrawApp%2FDocs%2Foidc.png%3Fraw%3Dtrue" width="1087" height="425"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;3️⃣ Internamente, o DrawApp utiliza os dados contidos no ID Token para registrar o usuário no sistema e já realizar o login, retornando um Cookie de autenticação pro navegador. A partir desse momento, o usuário pode utilizar o OAuth para habilitar a integração do DrawApp com sua conta do Google Drive, como vimos anteriormente.&lt;/p&gt;

&lt;h2&gt;
  
  
  5️⃣ Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OAuth 2.0 and OpenID Connect (in plain English) (&lt;a href="https://youtu.be/996OiexHze0" rel="noopener noreferrer"&gt;https://youtu.be/996OiexHze0&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;An Illustrated Guide to OAuth and OpenID Connect (&lt;a href="https://youtu.be/t18YB3xDfXI" rel="noopener noreferrer"&gt;https://youtu.be/t18YB3xDfXI&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;ASP.NET Core OAuth Authorization (.NET 7 Minimal Apis C#) (&lt;a href="https://youtu.be/0uSwPdYOm9k" rel="noopener noreferrer"&gt;https://youtu.be/0uSwPdYOm9k&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;An introduction to OpenID Connect in ASP.NET Core (&lt;a href="https://andrewlock.net/an-introduction-to-openid-connect-in-asp-net-core" rel="noopener noreferrer"&gt;https://andrewlock.net/an-introduction-to-openid-connect-in-asp-net-core&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;How to secure ASP.NET Core with OAuth and JSON Web Tokens (&lt;a href="https://blog.elmah.io/how-to-secure-asp-net-core-with-oauth-and-json-web-tokens/" rel="noopener noreferrer"&gt;https://blog.elmah.io/how-to-secure-asp-net-core-with-oauth-and-json-web-tokens/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>oauth</category>
      <category>security</category>
      <category>aspnet</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
