• Nenhum resultado encontrado

2.2 Ecossistemas tecnológicos

2.4.7 Authorization code grant

Conforme visto na Subseção 2.4.4, o authorization code é um authorization code grant typeque é utilizado para obter o access tokens, sendo otimizado para clients do tipo confidential. Como é baseado num fluxo de redirecionamento, o client deve ser capaz de interagir com o user-agent do resource owner, bem como ser capaz de receber requisições do authorization server.

Figura 2.2: Fluxo OAuth authorization code

Fonte: https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2

A Figura 2.2 ilustra o fluxo do authorization Ccde grant, cujos passos são descritos a seguir:

No passo 1, o client inicia o fluxo ao redirecionar o user-agent do resource owner para o authorization server. Nessa requisição de redirecionamento, o client informa sua identificação, os scopes solicitados e uma URI de redirecionamento que o authorization serverirá enviar para o user-agent de volta quando o acesso for concedido (ou negado).

No passo 2, o authorization server autentica o resource owner através do user-agent, e estabelece se o resource owner concedeu ou não a requisição de acesso do client.

CAPÍTULO 2. FUNDAMENTAÇÃO TEÓRICA 18

No passo 3, uma vez que o resource owner concedeu o acesso, o authorization ser- ver redireciona o user-agent de volta para o client usando a URI de redirecionamento fornecida no passo 1. Essa URI inclui um authorization code.

Os passos anteriores (1, 2 e 3) referem-se à requisição de autorização. Vamos agora explicar mais tecnicamente tal processo: a requisição de redirecionamento é realizada através de uma requisição GET ao authorization server, feita com uma URI que é cons- truída pelo client utilizando o formato “application/x-www-form-urlencoded”. Ela tem os seguintes parâmetros:

• response_type

obrigatório e deve ter o valor code por se tratar do authorization code grant;

• client_id

obrigatório e refere-se à identificação do client;

• redirect_uri

opcional e refere-se à URI de redirecionamento mencionada anteriormente.

• scope

opcional e refere-se aos scopes solicitados pelo client em relação aos recursos pro- tegidos do resource owner;

• state

opcional, com o propósito de manter o estado entre a requisição e a resposta, sendo importante para que o resource owner tenha a experiência mais fluida.

Abaixo segue um exemplo dessa requisição de redirecionamento ao authorization ser- ver“authserver.com”: GET https://authserver.com/authorize? response_type=code& client_id=s6BhdRkqt3& state=xyz& redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

Ao receber a requisição (passo 1), o authorization server a valida e assegura que todos os parâmetros requeridos estão presentes e válidos. Se a requisição for válida, o authorization server autentica o resource owner e recebe do resource owner se ele autoriza ou não o pedido de acesso do client (passo 2).

Após isso, o authorization server direciona o user-agent para a URI informada em redirect_uri usando uma resposta HTTP de redirecionamento, que inclui o authoriza- tion code(passo 3). A resposta do authorization server para o client vem na forma de uma requisição do primeiro para o segundo. Essa requisição também utiliza o formato “application/x-www-form-urlencoded” e tem os seguintes parâmetros:

CAPÍTULO 2. FUNDAMENTAÇÃO TEÓRICA 19

• code

obrigatório e refere-se ao authorization code gerado pelo authorization server;

• state

obrigatório se o parâmetro state estava presente na requisição de autorização do client(ilustrada anteriormente).

Abaixo segue um exemplo dessa requisição do authorization server para client:

GET https://client.com/endpoit/? code=SplxlOBeZQQYbYS6WxSbIA& state=xyz

No passo 4, o client requisita (informando o authorization code recebido no passo 3) o access token ao authorization server. Ao fazer essa requisição, o client autentica com o authorization server e informa a URI de redirecionamento usada para obter o authorization codepara verificação.

Essa requisição do access token ao resource server pelo client utiliza o formato “application/x- www-form-urlencoded” e tem os seguintes parâmetros:

• grant_type

obrigatório e deve ser authorization_code;

• code

obrigatório e refere-se ao authorization code recebido anteriormente do authoriza- tion server;

• redirect_uri

obrigatório se o redirect_uri foi incluído no authorization request, de forma que tais valores devem ser idênticos;

• client_id

obrigatório e refere-se à identificação do client.

Abaixo segue um exemplo dessa requisição:

POST /token HTTP/1.1 Host: server.example.com

Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code& code=SplxlOBeZQQYbYS6WxSbIA&

CAPÍTULO 2. FUNDAMENTAÇÃO TEÓRICA 20

Ao receber a requisição, o authorization server deve:

• Exigir autenticação do client se for confidential ou se o authorization grant type for client credentials;

• Autenticar o client caso as credenciais de autenticação estejam corretas;

• Caso o client seja confidential, assegurar que o authorization code foi emitido para o client; caso o client seja public, assegurar que o code foi emitido para o client_idda requisição;

• Verificar se o authorization code é valido;

• Assegurar que o parâmetro redirect_uri foi incluído no authorization request inicial e se os valores são idênticos.

No passo 5, o authorization server autentica o client, valida o authorization code e assegura que a URI de redirecionamento é compatível com a URI usada para redirecionar o client no passo 3. Se for válida, o authorization server responde de volta com o access token.

Abaixo segue uma resposta de sucesso com o access token:

HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"example", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "example_parameter":"example_value" }

Observamos que a resposta vem em formato Javascript Object Notation (JSON) e que o valor do access token está presente no atributo access_token. Além deste, podemos ter atributos extras definidos a critério do desenvolvedor.

Documentos relacionados