Skip to main content

Fluxo de autorização e autenticação

Visão geral

O fluxo de autorização e autenticação do PKCE é uma abordagem avançada para garantir a segurança em aplicativos que utilizam OAuth 2.0 para autenticação.

Diferentemente do fluxo padrão de autorização do OAuth 2.0, o PKCE inclui o code challenge gerado pelo cliente e um code verifier armazenado localmente. Esses elementos trabalham em conjunto para garantir que apenas o aplicativo cliente autorizado possa trocar o código de autorização por um token de acesso.

Em resumo, o fluxo PKCE é uma solução robusta e eficaz para proteger aplicativos contra ataques como interceptação de código e ataques de código malicioso.

Como funciona


Como funciona o fluxo do código de autorização

  1. O usuário acessa a aplicação
  2. A aplicação redireciona o usuário para o ID Magalu com as informações necessárias nos parâmetros da URL
  3. O Usuário digita suas credenciais de acesso: email e senha ou autenticação por OTP
  4. ID Magalu valida as credenciais
  5. ID Magalu apresenta a tela de consentimento ao usuário com informações da aplicação, permissões solicitadas
  6. Após a autenticação e o consentimento realizado, o ID Magalu realiza um redirecionamento de retorno para a aplicação com o code como parâmetro da URL
  7. A aplicação solicita a troca do code pelo token de acesso do usuário, informando o code verifier da aplicação
  8. A aplicação armazena o token na sessão do usuário e redireciona para a área interna da aplicação

Pré-requisitos

Antes de iniciar é necessário ter criado sua aplicação através do CLI MGC. Para isso, siga as etapas deste guia.

Como implementá-lo

Criando o Code Verifier

O code verifier é uma chave criptograficamente aleatória e codificada em Base64 que eventualmente será enviada ao solicitar o token de acesso.

// Dependency: Node.js crypto module
// https://nodejs.org/api/crypto.html#crypto_crypto
function base64URLEncode(str) {
return str
.toString("base64")
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=/g, "");
}
var verifier = base64URLEncode(crypto.randomBytes(32));

Criando o Code Challenge

O code challenge é gerado a partir do code verifier e tem como objetivo garantir que apenas o aplicativo autorizado possa trocar o código de autorização por um token de acesso. Ele aumenta a segurança protegendo contra ataques de interceptação de código.

// Dependency: Node.js crypto module
// https://nodejs.org/api/crypto.html#crypto_crypto
function sha256(buffer) {
return crypto.createHash("sha256").update(buffer).digest();
}
var challenge = base64URLEncode(sha256(verifier));

Parâmetros

CampoDescrição
client_idCódigo retornado pelo CLI ao cadastrar sua aplicação
redirect_uriA URL em seu aplicativo para o qual você gostaria que o ID Magalu redirecionasse os usuários após eles serem autenticados.
scopeopenid profile
response_typecode
code challengeDesafio gerado a partir do code_verifier
stateUma string alfanumérica que seu aplicativo adiciona à solicitação inicial que o ID Magalu inclui ao redirecionar de volta para seu aplicativo.
https://id.magalu.com/login?
response_type=code&
code_challenge={codeChallenge}&
code_challenge_method=S256&
client_id={yourClientId}&
redirect_uri={yourCallbackUrl}&
scope={scope}&
state={state}

Resposta

Se tudo correr bem, o ID Magalu realizará um redirecionamento para sua aplicação com o código de autorização incluído no final do URL:

Location: {yourCallbackUrl}?code={authorizationCode}&state=xyzABC123

Solicitar tokens

Agora que você possui o código de autorização, deverá trocá-lo pelo token de acesso.

curl --request POST \
--url 'https://id.magalu.com/oauth/token' \
--header 'content-type: application/x-www-form-urlencoded' \
--data grant_type=authorization_code \
--data 'client_id={yourClientId}' \
--data 'code_verifier={yourGeneratedCodeVerifier}' \
--data 'code={yourAuthorizationCode}' \
--data 'redirect_uri={https://yourApp/callback}'

A resposta da requisição terá o seguinte conteúdo:

{
"access_token": $ACCESS_TOKEN,
"token_type": "Bearer",
"expires_in": $EXPIRATION,
"refresh_token": $REFRESH_TOKEN,
"scope": $SCOPES,
"created_at": $CREATED_AT,
"id_token": $ID_TOKEN
}
CampoDescrição
access_tokenToken que demonstra as autorizações que o usuário efetuou através do consentimento a sua aplicação.
token_typeBearer
expires_inIndica o tempo de duração do token
refresh_tokenToken utilizado para efetuar a atualização do accessToken após a expiração
scopeEscopos autorizados pelo usuário para sua aplicação
created_atData de criação do token
id_tokenToken que demonstra informações do usuário autenticado