Neste artigo, vamos compreender os conceitos de autenticação e autorização, explorando sua aplicação em cenários de APIs. Pegue seu ☕️ e vamos nessa!
Tópicos:
- O que é autenticação?
- Garantindo que “eu” sou “eu”
- Autenticação Externa
- O que é autorização?
- Estou perdido. Por onde começar?
- Utilizando autenticação e autorização em APIs
- Conclusão
1. O que é autenticação?
Autenticação é o processo que diz quem você é. Por exemplo, em um processo de autenticação interno ou externo, eu estou garantindo que sou o Lucas Melzi, através do E-mail lucasmelzi@minhavidatech.com.br.
Este processo pode ser feito de diferentes maneiras, via usuário e senha, via e-mail e senha ou mesmo via redes sociais, os famosos “Login com Google”, “Login com Facebook” entre outros.
De qualquer forma, não importa como, o processo é sempre o mesmo, garantir que quem está dizendo que é “lucasmelzi@minhavidatech.com.br” é realmente o “Lucas Melzi”.
2. Como garantir que eu sou eu?
O primeiro passo que precisamos é garantir que uma pessoa está ligada a um e-mail ou um nome de usuário, e este processo é relativamente simples. Vamos explorar um pouco.
No caso da garantia de um e-mail ser de quem ele realmente disse que é, basta no processo de registro do usuário, enviar um e-mail com um código a ele.
3. Autenticação Externa
Outro tipo de autenticação muito comum é utilizando alguma rede social ou serviço externo. Neste modelo, você delega a responsabilidade para outro servidor, o que pode ser uma boa, já que o processo de verificação de contas do Google, Facebook ou Microsoft por exemplo são bem mais complexos e completos do que possivelmente o seu será.
Neste formato, o que fazemos é no login, gerar um token de ativação e redirecionar o usuário para uma plataforma externa.
Após autenticado, o usuário retorna para nossa plataforma com um token e assim damos andamento na requisição.
Em suma, qualquer pessoa pode fornecer este serviço, basta realizar a implementação do OIDC (Open Id Connect), um protocolo aberto de autenticação, vamos falar desse serviço em um outro artigo.
Existem servidores OIDCs prontos como o Identity Server ou o Keycloak, ambos fornecem uma ótima implementação e são completos em recursos.
Resumindo, se o site minhavagatech.com.br tivesse uma implementação do OIDC, você poderia adicionar um botão “Login com minhavagatech.com.br” em seu site.
Como o custo e risco de manter um OIDC próprio são altos, a recomendação é sempre começar do mais básico, implementando autenticação oAuth com JWT.
4. O que é autorização
Se autenticação diz quem você é, autorização diz o que você pode fazer, são os famosos roles ou perfis. Imagina que você tenha um crachá da sua empresa e esse crachá permite você abrir algumas portas e outras não. Você vai conseguir abri-la conforme seu cargo e sua permissão, básicamente é a mesma lógica com a autorização, ela diz o que você pode fazer ou melhor, quais portas você poderá abrir.
Enquanto a autenticação segue em diversas vezes uma padronização, a autorização não tem necessariamente uma regra. Cada sistema e cada API pode desenvolver uma maneira de rotular permissão a determinado usuário. Seja para acesso pessoal ou para consumo de APIs.
De qualquer forma, a ideia aqui é, sabendo que o “lucasmelzi@minhavidatech.com.br” é o “Lucas Melzi”, o que ele pode fazer dentro deste sistema?
Note que estamos falando desse sistema, pois a autorização varia muito, inclusive entre módulos, páginas e até mesmo botões.
Podem haver páginas no sistema que eu posso ver, mas não posso editar e a autorização precisa tratar tudo isto.
Na maioria dos casos também, a autorização é cumulativa ou seja, eu posso ter vários perfis como “admin”, “editor”, “visualizador” e cada um deles ter funções distintas que são acumuladas.
5. Por onde começar?
Existem modelos prontos como o Keycloak e Identity Server que são implementações do OIDC, mas também existem Frameworks em diversas linguagens que podem auxiliar nesse processo.
Porém, minha recomendação é pelo menos para fins de estudo, que você implemente manualmente um sistema de autenticação, para conhecer as entranhas e saber tudo o que está acontecendo.
Para te ajudar, desenvolvi um método em uma API chamado “test/api/auth” que recebe uma requisição e valida se existe no Header um item chamado Authorization. Você pode conferir mais clicando aqui para acessar o meu GitHub.
6. Autenticação e autorização em APIs
Como você já deve imaginar, tudo começa na API, visto que a segurança no lado do cliente é sempre fraca, todo processo deve rodar no servidor.
Armazenar um usuário e seus perfis é uma tarefa relativamente simples, incluindo ler este dados e enviar para tela, o problema está no armazenamento destes dados do outro lado.
Vou te explicar melhor: em APIs nós nunca ficamos autenticados ou autorizados, a cada requisição este processo é feito. Isto se repete para toda requisição.
Existe um motivo para isto, e até um tempo atrás, utilizávamos sessão para manter estes dados em memória e o usuário permanecer conectado.
Com a distribuição das aplicações em diferentes servidores, manter o usuário conectado não é algo viável, pois os servidores não compartilham memória.
Então imagina que você acessou o site minhavagatech.com.br agora e fez o login, o servidor armazenou seus dados de login em memória e você está agora visualizando uma aula com 10 minutos de duração.
Após terminar de ver a aula, você clica no botão concluir, porém, o servidor que você se autenticou previamente está ocupado, com muita carga. Neste momento entra em ação o Load Balancer ou balanceador de carga.
Ele rapidamente identifica que existe outro servidor do minhavagatech.com.br e que está livre, desocupado, então manda sua requisição para lá.
Como os servidores não compartilham memória, logo, você não está autenticado neste servidor e sua requisição falha com o erro 401.
Mudando o cenário para autenticação que temos hoje, onde a cada requisição você precisa se autenticar, este erro deixa de acontecer.
Neste modelo, geramos um Token de acesso, baseado em uma chave privada que só o servidor tem (ela tem que ser comum entre os servidores) e então a cada requisição, o Frontend envia este token ou qualquer serviço que esteja consumindo API deve fazer o envio.
Com o Token em mãos, como temos a chave privada, conseguimos descriptar ele e obter os valores do usuário (e quaisquer outros valores que ele tenha) e com isso, decidimos se quem está nos enviando uma requisição é “conhecido” ou não.
Você pode também armazenar os Tokens para uma maior validação, mas isto implica em pelo menos uma requisição no banco de dados a cada requisição autenticada que sua API recebe.
7. Conclusão
Neste artigo, exploramos de maneira abrangente os conceitos cruciais de autenticação e autorização, examinando como esses princípios se aplicam em cenários de APIs.
Autenticação é o processo de verificar a identidade de um usuário. Isso é crucial para garantir que a pessoa que está interagindo com um sistema é realmente quem afirma ser. O texto destacou várias abordagens para autenticação, desde as clássicas combinações de usuário e senha até métodos mais modernos, como autenticação externa por meio de serviços como Google, Facebook ou Microsoft. Além disso, introduziu o conceito de OIDC (Open Id Connect) e discutiu brevemente os servidores prontos para OIDC, como o Identity Server e o Keycloak.
Autorização, por sua vez, diz respeito às permissões e privilégios concedidos a um usuário autenticado. Enquanto a autenticação garante a identidade, a autorização define o que um usuário pode fazer uma vez autenticado. O texto comparou esse processo ao uso de crachás em um ambiente corporativo, onde cada crachá permite diferentes níveis de acesso. Essa diferenciação entre autenticação e autorização foi enfatizada, destacando que enquanto a autenticação muitas vezes segue um padrão, a autorização pode variar entre sistemas e APIs.
O texto também ofereceu orientações sobre como abordar esses conceitos. Inicialmente, recomendou a implementação manual da autenticação como uma maneira de entender profundamente o processo. Mencionou a existência de modelos prontos, como Keycloak e Identity Server, que implementam o OIDC, mas sugeriu que, para fins de aprendizado, a implementação manual pode proporcionar maior compreensão.
A seção sobre autenticação e autorização em APIs esclareceu que a segurança deve ser tratada no servidor, já que a segurança no lado do cliente é relativamente fraca. Explorou o uso de tokens de acesso como uma solução eficiente para autenticação repetida a cada requisição, em comparação com a antiga abordagem de manter a sessão ativa. Foi discutido como os tokens podem ser usados para identificar os usuários e seus níveis de permissão, com menção de possíveis trade-offs envolvidos no armazenamento desses tokens.
Em conclusão, o texto enfatizou a importância de entender profundamente os conceitos de autenticação e autorização, especialmente no contexto das APIs. Esses elementos formam a base da segurança de sistemas e aplicações modernas, permitindo a identificação confiável dos usuários e a atribuição adequada de privilégios. A abordagem sugerida foi começar pela implementação manual para adquirir conhecimento prático e, em seguida, explorar opções mais avançadas, como os servidores prontos para OIDC.
Gostaria de agradecer por ter lido até aqui e dizer que estou disponível para tirar dúvidas.
Quer aprender mais?
Estou preparando um E-book para ajudar você a entrar no mercado de tecnologia.
Desvende as áreas de atuação, aprenda técnicas e comportamentos para se destacar em entrevistas e processos seletivos. Descubra hábitos e rotinas que aceleram sua aprendizagem.
Prepare-se para o sucesso no universo da tecnologia. Clique no link abaixo e entre para a lista de espera, pois será limitado!
Quero minha primeira oportunidade