Skip to main content

Authorization Code com PKCE

Sumário

Fluxo

A autenticação Authorization Code com PKCE para a Spotify API é um processo seguro de fluxo OAuth 2.0 que envolve a geração de um code_verifier (uma string secreta e aleatória) e um code_challenge (o hash SHA-256 do code_verifier).

O code_challenge é enviado ao Spotify na primeira etapa de autorização, e na etapa final, o code_verifier original é enviado junto com o código de autorização para trocar por um access token. Este fluxo é essencial para aplicativos, especialmente mobile e desktop, onde é inseguro armazenar um segredo no cliente, pois o PKCE protege contra ataques de injeção de código de autorização.

Passo a passo da autenticação

  1. Crie uma string aleatória e criptograficamente forte, com 43 a 128 caracteres, usando caracteres A-Z, a-z, 0-9, e ~, ., _, -. Guarde este code_verifier em segurança no lado do cliente.
  2. Calcule o code_challenge: Faça o hash do code_verifier usando o método SHA-256 e codifique o resultado em base64url. Este será o code_challenge.
  3. Inicie a autorização: Redirecione o usuário para o endpoint de autorização do Spotify, incluindo o code_challenge, client_id, redirect_uri e scope (se necessário).
  4. Obtenha o authorization_code: Após o usuário aprovar a solicitação, o Spotify o redirecionará para sua redirect_uri com um authorization_code.
  5. Troque por tokens: Envie uma requisição para o endpoint de token do Spotify, incluindo o authorization_code, o code_verifier original e o client_id para obter o access token e o refresh token.
  6. Use o access token: Use o access token obtido para fazer chamadas à API da Spotify.

Resumo da segurança

  • PKCE protege contra ataques de interceptação: Se um atacante interceptar o authorization_code, ele não conseguirá usá-lo para obter um access token porque não terá o code_verifier original.
  • code_verifier é confidencial: A string original deve permanecer privada no cliente e só ser usada na troca do código pelo token.
  • code_challenge é público: Ele pode ser enviado através de canais públicos (como a URL) sem comprometer a segurança.