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
- O usuário acessa a aplicação
- A aplicação redireciona o usuário para o ID Magalu com as informações necessárias nos parâmetros da URL
- O Usuário digita suas credenciais de acesso: email e senha ou autenticação por OTP
- ID Magalu valida as credenciais
- ID Magalu apresenta a tela de consentimento ao usuário com informações da aplicação, permissões solicitadas
- 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
- A aplicação solicita a troca do code pelo token de acesso do usuário, informando o code verifier da aplicação
- 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
Campo | Descrição |
---|---|
client_id | Código retornado pelo CLI ao cadastrar sua aplicação |
redirect_uri | A URL em seu aplicativo para o qual você gostaria que o ID Magalu redirecionasse os usuários após eles serem autenticados. |
scope | openid profile |
response_type | code |
code challenge | Desafio gerado a partir do code_verifier |
state | Uma 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
}
Campo | Descrição |
---|---|
access_token | Token que demonstra as autorizações que o usuário efetuou através do consentimento a sua aplicação. |
token_type | Bearer |
expires_in | Indica o tempo de duração do token |
refresh_token | Token utilizado para efetuar a atualização do accessToken após a expiração |
scope | Escopos autorizados pelo usuário para sua aplicação |
created_at | Data de criação do token |
id_token | Token que demonstra informações do usuário autenticado |