Como gerar um header Basic Auth
- Preencha Usuário e Senha.
- Deixe o Charset em UTF-8, a menos que o servidor seja antigo e espere ISO-8859-1 (Latin-1).
- Copie o resultado com Copiar header para a linha completa
Authorization: Basic …, ou com Copiar só o token para a parte em Base64. - Em Código pronto para usar, ajuste a URL para o seu endpoint e copie o trecho do seu cliente. Inverter envia o header ao decodificador para uma conferência.
O que o header contém
A autenticação Basic é definida na RFC 7617. O cliente junta os dois valores com dois-pontos, codifica os bytes em Base64 e os envia em um header:
| Usuário | Senha | Valor do header |
|---|---|---|
Aladdin | open sesame | Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
deploy | hunter2 | Basic ZGVwbG95Omh1bnRlcjI= |
josé | pässwörd | Basic am9zw6k6cMOkc3N3w7ZyZA== (UTF-8) |
josé | pässwörd | Basic am9z6Tpw5HNzd/ZyZA== (Latin-1) |
As duas últimas linhas mostram por que o charset importa: o mesmo texto gera bytes diferentes, então um servidor que espera a outra codificação vê uma senha errada. Um servidor que quer UTF-8 pode dizer isso no desafio: WWW-Authenticate: Basic realm="api", charset="UTF-8".
O Base64 aqui é só um formato de transporte. Qualquer um que copie o header pode transformá-lo de volta na senha com o decodificador de Basic Auth, e é por isso que Basic auth só deve ser usada com HTTPS. Base64 não é criptografia trata disso em mais detalhes.
Caracteres sobre os quais a ferramenta avisa
- Dois-pontos no usuário. A RFC 7617 proíbe. O servidor divide no primeiro dois-pontos, então parte do usuário iria parar na senha.
- Caracteres de controle, como tabulações ou quebras de linha, que não são permitidos em credenciais Basic.
- Caracteres que não existem no Latin-1 quando esse charset está selecionado, por exemplo emoji ou cirílico. Eles são trocados por
?, o que nunca é o que você quer. - Não ASCII em UTF-8. Correto segundo a RFC, mas servidores legados podem ler de outro jeito, então teste antes.
Dois-pontos na senha são permitidos, já que só o primeiro separa os dois valores.
Como enviar Basic auth pelo código
Os trechos na ferramenta são gerados com os seus valores e com as aspas certas para cada linguagem. As versões simples são assim:
curl -u 'deploy:hunter2' https://api.example.com/
import requests
r = requests.get("https://api.example.com/",
auth=("deploy".encode("utf-8"), "hunter2".encode("utf-8")))
O exemplo em Python passa bytes de propósito. Quando o requests recebe valores str, ele os codifica como Latin-1, então uma senha com € ou ł falharia; com bytes, ele envia exatamente o UTF-8 que você escolheu.
No JavaScript do navegador, monte o header você mesmo: o fetch recusa URLs com user:pass@, e o btoa() lança erro com caracteres fora do Latin-1, então codifique a string em bytes UTF-8 antes do Base64. O trecho de fetch gerado contorna as duas coisas embutindo o token pronto. O guia de Base64 em JavaScript explica o passo do UTF-8, e a página de Node.js mostra a versão com Buffer.
Quando a requisição continua devolvendo 401
Confira primeiro o header WWW-Authenticate da resposta. Se ele disser Bearer, a API espera um token e nunca vai aceitar credenciais Basic. Se disser Basic, decodifique o header que você realmente enviou (com curl -v ele aparece como > Authorization: Basic …) e compare com o que esperava; espaços sobrando ou uma quebra de linha no final copiada de um gerenciador de senhas são culpados comuns. Proxies usam um header próprio, Proxy-Authorization, com o mesmo formato.
Perguntas frequentes
Como o header de Basic auth é montado?
Junte o usuário e a senha com dois-pontos, codifique essa string em bytes UTF-8, codifique os bytes em Base64 e coloque Basic na frente. Aladdin e open sesame dão Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==.
A autenticação Basic é segura?
Só via HTTPS. O Base64 não esconde nada, então qualquer um que leia a requisição decodifica a senha em um segundo. Com TLS, o header é criptografado junto com o resto da requisição.
A senha pode ter dois-pontos?
Pode. O servidor divide no primeiro dois-pontos, então tudo depois dele pertence à senha. É o usuário que não pode conter dois-pontos.
Por que minha senha com caracteres não ASCII falha em alguns servidores?
A RFC 7617 permite que servidores peçam UTF-8, mas os mais antigos decodificam o header como ISO-8859-1. test:123£ é dGVzdDoxMjPCow== em UTF-8 e dGVzdDoxMjOj em Latin-1. Experimente o outro Charset ou fique só no ASCII.