Cloud Jasmin DesenvolvimentoOAuth2
DesenvolvimentoOAuth2
OAuth2
Voltar | Lista de artigos

Como funciona a autorização OAuth 2.0?

Última alteração a 26/08/2022

O OAuth 2.0 é um protocolo standard de autorização que permite que aplicações acedam de forma limitada à conta de um utilizador num serviço Web (HTTP).

O protocolo delega a autenticação do utilizador ao serviço que detém a conta do utilizador e autoriza o acesso de aplicações externas a essa conta do utilizador. O protocolo disponibiliza fluxos de autorização para aplicações Web, aplicações desktop e aplicações mobile.

De seguida descreve-se o funcionamento básico do protocolo na perspetiva do developer de uma aplicação.

OAuth Roles

O protocolo define 4 roles (papéis):

  • Resource owner: trata-se do utilizador que autoriza o acesso da aplicação à sua conta. Esse acesso fica limitado ao scope da autorização dada pelo utilizador.
  • Client: é a aplicação que pretende aceder à conta do utilizador.
  • Resource server: corresponde ao servidor que hospeda as contas do utilizador.
  • Authorization server: é o servidor que verifica a identidade do utilizador e atribui tokens de autorização ao cliente (a aplicação).

Do ponto de vista do developer de uma aplicação, a Web API que pretende consumir cumpre tanto o papel de resource server como o papel de authorization server. Por isso é comum combinarem-se os dois papéis e chamar-lhe de Service (serviço) ou simplesmente API.

Fluxo genérico de autorização

Tipicamente o fluxo de autorização de uma aplicação externa seguirá os seguintes passos:

  1. A aplicação solicita autorização para aceder aos recursos do utilizador.
  2. Se o utilizador já autorizou esse pedido, a aplicação recebe um authorization grant.
  3. A aplicação solicita ao authorization server um access token, apresentando a identidade do utilizador e o authorization grant.
  4. Se a identidade da aplicação estiver autenticada e o authorization grant for válido, o authorization server atribuirá um acess token à aplicação e o fluxo de autorização termina.
  5. A aplicação solicita um determinado recurso ao resource server e apresenta o access token que obteve antes.
  6. Se o access token for válido, o resource server devolverá o recurso solicitado à aplicação.

Na realidade o fluxo real de autenticação depende do tipo de authorization grant que for utilizado, no entanto, este é fluxo conceptual normal do OAuth. Adiante discutem-se os vários authorization grants disponíveis.

Authorization grant

O tipo de grant utilizado depende do método de autorização que aplicação pretender utilizar e, claro, dos métodos que a Web API suportar. Existem 4 tipos diferentes definidos no protocolo, com utilidades diferentes:

  • Authorization code: usado em aplicações server-side.
  • Implicit: usado por aplicações Web e por aplicações mobile (as que correm no dispositivo do utilizador).
  • Resource owner password credentials: usado por trusted applications, tipicamente, as aplicações que são geridas pelo próprio serviço.
  • Client credentials: utilizado para acesso por parte de APIs de outras aplicações.

Authorization code grant

Este é o tipo mais comum porque está otimizado para aplicações server-side, onde o código fonte da aplicação não está exposto e é mais fácil manter a confidencialidade do client secret.

Trata-se de um fluxo baseado em redirects, o que significa que a aplicação deve ser capaz de interagir com o agente do utilizador (o browser por exemplo) e de receber os códigos de autorização reencaminhados através desse agente.

Passo 1 – Authorization code link

Em primeiro lugar o utilizador é um link semelhante ao seguinte:

https://myserver.com/v1/oauth/authorize?response_type=code&client_id={ClientId}&redirect_uri={CallbackUrl}&scope={Scope}

Os componentes deste link são os seguintes:

  • https://myserver.com/v1/oauth/authorize: é o endpoint de autorização da API.
  • {ClientId}: identifica a aplicação.
  • {CallbackUrl}: o URL para onde o serviço deve redirecionar o utilizador depois de atribuído um authorization grant.
  • response_type=code: indica que a aplicação está a solicitar um authorization code grant.
  • {Scope}: define o nível de acesso que a aplicação está a solicitar.

Passo 2 – Autorização por parte do utilizador

Quando o utilizador abre o link anterior deve, em primeiro lugar, autenticar-se junto do serviço. Em seguida ser-lhe-á solicitado que autorize (ou negue) a aplicação a aceder ao scope solicitado. Tipicamente este passo é realizado por um formulário muito simples que descreve o que a aplicação está a pedir e deixa o utilizador escolher entre aceitar ou rejeitar esse acesso.

Passo 3 – A aplicação recebe o authorization code

Depois da autorização do utilizador (passo anterior), o serviço redireciona o agente do utilizador (o browser) para o redirect URL especificado no registo da aplicação, enviando também um authorization code.

Normalmente, a forma do URL de redirect será semelhante à seguinte:

https://myapplication.com/callback?code={AuthorizationCode}

Passo 4 – A aplicação solicita um acess token

De seguida a aplicação solicita à API um access token, passando-lhe o authorization code anterior e detalhes de autenticação, incluindo o client secret.

O post será semelhante ao seguinte:

https://myserver.com/v1/oauth/token?client_id={ClientId}&client_secret={ClientSecret}&grant_type=authorization_code&code={AuthorizationCode}&redirect_uri={CallbackUrl}

Passo 5 – A aplicação recebe o acess token

Se a autorização for válida, a API responderá com uma mensagem que conterá o access token. A resposta pode ser semelhante à seguinte:

{
    "access_token":"{AccessToken}",
    "token_type":"bearer",
    "expires_in":2592000,
    "refresh_token":"{RefreshToken}",
    "scope":"{Scope}",
    "uid":100101,
    "info":{"name":"{UserName}","email":"{UserEmail}"}
}

Implicit grant

Este tipo de grant é usado tipicamente em aplicações mobile e em aplicações Web (as que correm no browser), sempre quando a confidencialidade do client secret não pode ser garantida.

Também é um fluxo baseado em redirects, ainda que o access token seja dado ao agente do utilizador para este o reenviar à aplicação, o que torna esse token mais vulnerável por poder estar exposto ao utilizador e/ou a outras aplicações do dispositivo do utilizador.

Além disso, a identidade da aplicação não é autenticada, confiando o serviço no URL de redirect especificado no momento do registo da aplicação.

O comportamento normal do fluxo é o seguinte: é solicitado ao utilizador que autorize a aplicação, depois o servidor de autenticação passa o access token ao browser do utilizador que depois o passa à aplicação.

Passo 1 – Link de autorização

Em primeiro lugar é apresentado ao utilizador um link para a autorização que solicita um token da API:

https://myserver.com/v1/oauth/authorize?response_type=token&client_id={ClientId}&redirect_uri={CallbackUrl}&scope={Scope}

Este link é essencialmente idêntica ao authorization code link (ver grant anterior), exceto pelo facto de que solicita um “token” em vez de um “code”.

Passo 2 – Autorização por parte do utilizador

Quando o utilizador abre o link anterior deve, em primeiro lugar, autenticar-se junto do serviço. Em seguida ser-lhe-á solicitado que autorize (ou negue) a aplicação a aceder ao scope solicitado. Tipicamente este passo é realizado por um formulário muito simples que descreve o que a aplicação está a pedir e deixa o utilizador escolher entre aceitar ou rejeitar esse acesso.

Passo 3 – O agente do utilizador recebe o access token com o URL de redirect

Depois da autorização do utilizador, o serviço redirecionará o browser para o URL de redirect da aplicação e incluirá no URL o access token atribuído:

https://myapplication.com/callback#token={AccessToken}

Passo 4 – O agente segue o URL de redirect

O browser seguirá esse URL, armazenando antes o access token.

Passo 5 – A aplicação envia o script para extrair o access token

A aplicação devolverá então no URL uma página Web que deve incluir uma script para extrair o access token do URL.

Passo 6 – O access token é passado à aplicação

Finalmente, o browser executará a script da página para extrair o access token e passá-lo então à aplicação.

Neste momento a aplicação estará autorizada.

Resource owner password credentials grant

Este tipo de grant requer que o utilizador disponibilize as suas credenciais de acesso ao serviço (username e password) diretamente à aplicação, que as utilizará para obter o access token.

Por motivos óbvios, trata-se de um tipo de grant que só deve ser disponibilizado pelo servidor de autorização se não for viável nenhum dos outros tipos.

O seu funcionamento é o seguinte.

Depois do utilizador fornecer as credenciais à aplicação, esta solicitará o access token ao servidor de autorização. O pedido (POST) terá uma forma semelhante à seguinte:

https://myserver.com/v1/oauth/token?grant_type=password&username={UserName}&password={Password}&client_id={ClientId}

Quando as credenciais estiverem corretas, o servidor retornará o access token à aplicação e esta estará autorizada.

Client credentials grant

Este tipo de grant fornece uma forma à aplicação de aceder à sua própria conta de serviço. O que será útil, por exemplo, quando a aplicação pretender atualizar o seu registo ou aceder aos dados da sua própria conta de serviço usando a API.

O fluxo é o seguinte.

A aplicação solicita um access token fornecendo as suas credenciais, o seu client id e o client secret ao servidor de autorização. O request poderá ter a seguinte forma:

https://myserver.com/v1/oauth/token?grant_type=client_credentials&client_id={ClientId}&client_secret={ClientSecret}

Se as credenciais estiverem corretas, o servidor retornará o access token e a aplicação estará então autorizada.

Refresh Token

Quando um access token expira, a sua utilização para fazer pedidos à API resultará num erro “Invalid Token Error”. Nesse momento, se um refresh token tiver sido incluído no momento em que o access token foi gerado, pode ser utilizado para fazer um novo token de acesso ao servidor.

Eis um exemplo de um pedido desse tipo:

https://myserver.com/v1/oauth/token?grant_type=refresh_token&client_id={ClientId}&client_secret={ClientSecret}&refresh_token={RefreshToken}
Adicionar aos favoritos ou partilhar este artigo
Esta página foi útil?
Obrigado pelo seu voto.

login para deixar a sua opinião.

Obrigado pelo seu feedback. Iremos analisá-lo para continuarmos a melhorar!
Artigos Relacionados
Quais os fluxos de autorização suportados na Web API? Scopes Limites utilização da API Quais os fluxos de autorização suportados na Web API? Como funciona a autorização OAuth 2.0?