Proteja aplicativos baseados em nuvem com OAuth 2.0 e OpenID Connect
Um guia completo para proteger seus aplicativos em nuvem com OAuth 2.0 e OpenID Connect e como oferecer uma ótima experiência ao usuário com autenticação e autorização.
Introdução
Aplicativos baseados em nuvem são a tendência hoje em dia. Embora o tipo de aplicativo varie (web, mobile, desktop, etc.), todos eles têm um backend em nuvem que fornece serviços como armazenamento, computação e bancos de dados. Na maioria das vezes, esses aplicativos precisam autenticar usuários e autorizá-los a acessar certos recursos.
Embora seja possível criar mecanismos caseiros de autenticação e autorização, a segurança tornou-se uma das principais preocupações ao desenvolver aplicativos em nuvem. Felizmente, nossa indústria possui padrões testados em batalhas como OAuth 2.0 e OpenID Connect para nos ajudar a implementar autenticação e autorização seguras.
Este post tem as seguintes suposições:
- Você tem uma compreensão básica do desenvolvimento de aplicativos (web, mobile, ou qualquer outro tipo).
- Você já ouviu falar dos conceitos de autenticação e autorização.
- Você já ouviu falar sobre OAuth 2.0 e OpenID Connect.
Sim, "ouvir falar" é suficiente para os itens 2 e 3. Este post usará exemplos do mundo real para explicar conceitos e ilustrar o processo com diagramas. Vamos começar!
OAuth 2.0 vs. OpenID Connect
Se você está familiarizado com OAuth 2.0 e OpenID Connect, também pode continuar lendo porque abordaremos alguns exemplos do mundo real nesta seção; se você é novo nesses padrões, também é seguro continuar, pois vamos apresentá-los de maneira simples.
OAuth 2.0
OAuth 2.0 é uma estrutura de autorização que permite a um aplicativo obter acesso limitado a recursos protegidos em outro aplicativo em nome de um usuário ou do próprio aplicativo. A maioria dos serviços populares como Google, Facebook e GitHub usam OAuth 2.0 para login social (por exemplo, "Entrar com Google").
Por exemplo, você tem um aplicativo web MyApp que deseja acessar o Google Drive do usuário. Em vez de pedir ao usuário para compartilhar suas credenciais do Google Drive, MyApp pode usar OAuth 2.0 para solicitar acesso ao Google Drive em nome do usuário. Aqui está um fluxo simplificado:
Neste fluxo, MyApp nunca vê as credenciais do Google Drive do usuário. Em vez disso, recebe um token de acesso do Google que permite acessar o Google Drive em nome do usuário.
Em termos de OAuth 2.0, MyApp é o cliente, Google é tanto o servidor de autorização quanto o servidor de recursos por simplicidade. No mundo real, geralmente temos servidores de autorização e de recursos separados para oferecer uma experiência de single sign-on (SSO). Por exemplo, o Google é o servidor de autorização e pode ter vários servidores de recursos como Google Drive, Gmail e YouTube.
Observe que o fluxo de autorização real é mais complexo do que isso. OAuth 2.0 possui diferentes tipos de concessão, escopos e outros conceitos que você deve estar ciente. Vamos deixar isso de lado por enquanto e seguir para o OpenID Connect.
OpenID Connect (OIDC)
OAuth 2.0 é ótimo para autorização, mas você pode notar que ele não tem uma maneira de identificar o usuário (ou seja, autenticação). OpenID Connect é uma camada de identidade sobre o OAuth 2.0 que adiciona capacidades de autenticação.
No exemplo acima, MyApp precisa saber quem é o usuário antes de iniciar o fluxo de autorização. Observe que há dois usuários envolvidos aqui: o usuário do MyApp e o usuário do Google Drive. Neste caso, MyApp precisa conhecer o usuário do próprio aplicativo.
Vamos ver um exemplo direto, assumindo que os usuários podem entrar no MyApp usando nome de usuário e senha:
Como estamos autenticando o usuário do nosso próprio aplicativo, normalmente não há necessidade de pedir permissão como o Google fez no fluxo do OAuth 2.0. Enquanto isso, precisamos de algo que possa identificar o usuário. OpenID Connect introduz os conceitos como ID token e endpoint userinfo para nos ajudar com isso.
Você pode notar que o provedor de identidade (IdP) é um novo participante autônomo no fluxo. É o mesmo que o servidor de autorização no OAuth 2.0, mas para maior clareza, usamos o termo IdP para mostrar que ele é responsável por autenticação de usuário e gerenciamento de identidade.
Quando seu negócio cresce, você pode ter vários aplicativos que compartilham o mesmo banco de dados de usuários. Assim como o OAuth 2.0, o OpenID Connect permite que você tenha um único servidor de autorização que pode autenticar usuários para vários aplicativos. Se o usuário já está logado em um aplicativo, não precisa digitar suas credenciais novamente quando outro aplicativo redirecioná-lo para o IdP. O fluxo pode ser feito automaticamente sem interação do usuário. Isso é chamado single sign-on (SSO).
Novamente, este é um fluxo altamente simplificado e há mais detalhes sob o capô. Por enquanto, vamos seguir para a próxima seção para evitar sobrecarga de informação.
Tipos de aplicativos
Na seção anterior, usamos aplicativos web como exemplos, enquanto o mundo é mais diverso do que isso. Para um provedor de identidade, a linguagem de programação exata, estrutura ou plataforma que você usa não importa muito. Na prática, uma diferença notável é se o aplicativo é um cliente público ou um cliente privado (confiável):
- Cliente público: Um cliente que não pode manter suas credenciais confidenciais, o que significa que o proprietário do recurso (usuário) pode acessá-las. Por exemplo, um aplicativo web rodando em um navegador (por exemplo, single-page application).
- Cliente privado: Um cliente que tem a capacidade de manter suas credenciais confidenciais sem expô-las aos (proprietários de recursos) usuários. Por exemplo, um aplicativo web rodando em um servidor (por exemplo, aplicativo web do lado do servidor) ou um serviço API.
Com isso em mente, vamos ver como OAuth 2.0 e OpenID Connect podem ser usados em diferentes tipos de aplicativos.
"Aplicativo" e "cliente" podem ser usados de forma intercambiável no contexto deste post.
Aplicativos web rodando em um servidor
O aplicativo roda em um servidor e serve páginas HTML para os usuários. Muitas estruturas web populares como Express.js, Django e Ruby on Rails se enquadram nesta categoria; e estruturas backend-for-frontend (BFF) como Next.js e Nuxt.js também estão incluídas. Esses aplicativos possuem as seguintes características:
- Como um servidor apenas permite acesso privado (não há como usuários públicos verem o código do servidor ou as credenciais), ele é considerado um cliente privado.
- O fluxo geral de autenticação do usuário é o mesmo que discutimos na seção "OpenID Connect".
- O aplicativo pode usar o ID token emitido pelo provedor de identidade (ou seja, o provedor OpenID Connect) para identificar o usuário e exibir conteúdo específico do usuário.
- Para manter o aplicativo seguro, geralmente ele usa o fluxo de código de autorização para a autenticação do usuário e para obter tokens.
Enquanto isso, o aplicativo pode precisar acessar outros serviços de API internos em uma arquitetura de microsserviços; ou é um aplicativo monolítico que precisa de controle de acesso para diferentes partes do aplicativo. Vamos discutir isso na seção "Proteja sua API".
Aplicativos de página única (SPAs)
O aplicativo roda no navegador de um usuário e se comunica com o servidor via APIs. React, Angular e Vue.js são estruturas populares para construir SPAs. Esses aplicativos possuem as seguintes características:
- Como o código do aplicativo é visível para o público, ele é considerado um cliente público.
- O fluxo geral de autenticação do usuário é o mesmo que discutimos na seção "OpenID Connect".
- O aplicativo pode usar o ID token emitido pelo provedor de identidade (ou seja, o provedor OpenID Connect) para identificar o usuário e exibir conteúdo específico do usuário.
- Para manter o aplicativo seguro, geralmente ele usa o fluxo de código de autorização com PKCE (Prova de Chave para Troca de Código) para a autenticação do usuário e para obter tokens.
Geralmente, SPAs precisam acessar outros serviços de API para busca e atualização de dados. Vamos discutir isso na seção "Proteja sua API".
Aplicativos móveis
O aplicativo roda em um dispositivo móvel (iOS, Android, etc.) e se comunica com o servidor via APIs. Na maioria dos casos, esses aplicativos têm as mesmas características que SPAs.