Resposta curta: iso-8859-1 a menos que palavras codificadas sejam usadas de acordo com RFC2047 (MIME).
Explicação mais longa:
RFC2617, seção 2 (autenticação HTTP) define as credenciais básicas :
basic-credentials = base64-user-pass
base64-user-pass = <base64 encoding of user-pass,
except not limited to 76 char/line>
user-pass = userid ":" password
userid = *<TEXT excluding ":">
password = *TEXT
A especificação não deve ser lida sem se referir a RFC2616 (HTTP 1.1) para definições em BNF (como a acima):
Esta especificação é um complemento da especificação HTTP / 1.1 2 . Ele usa a seção BNF aumentada 2.1 desse documento e se baseia em ambos os terminais não definidos nesse documento e outros aspectos da especificação HTTP / 1.1.
RFC2616, seção 2.1 define TEXTO (grifo meu):
A regra TEXT é usada apenas para conteúdos de campo descritivos e valores que não devem ser interpretados pelo analisador de mensagens. Palavras de * TEXTO PODEM conter caracteres de conjuntos de caracteres diferentes de
ISO-8859-1 apenas quando codificadas de acordo com as regras da RFC 2047.
TEXT = <any OCTET except CTLs, but including LWS>
Portanto, é definitivamente iso-8859-1, a menos que você detecte alguma outra codificação de acordo com as regras RFC2047 (MIME pt. 3):
// Username: Mike
// Password T€ST
Mike:=?iso-8859-15?q?T€ST?=
Neste caso, o sinal do euro na palavra seria codificado de 0xA4
acordo com a iso-8859-15 . É meu entendimento que você deve verificar esses delimitadores de palavras codificadas e, em seguida, decodificar as palavras internas com base na codificação especificada. Do contrário, você pensará que a senha é =?iso-8859-15?q?T¤ST?=
(observe que 0xA4
seria decodificada para ¤
quando interpretada como iso-8859-1).
Pelo que entendi, não consigo encontrar uma confirmação mais explícita do que essas RFCs. E algumas coisas parecem contraditórias. Por exemplo, um dos 4 objetivos declarados da RFC2047 (MIME, pt. 3) é redefinir:
o formato das mensagens para permitir ... informações de cabeçalho textuais em conjuntos de caracteres diferentes de US-ASCII.
Mas então o RFC2616 (HTTP 1.1) define um cabeçalho usando a regra TEXT, cujo padrão é iso-8859-1. Isso significa que cada palavra neste cabeçalho deve ser uma palavra codificada (ou seja, a =?...?=
forma)?
Também relevante, nenhum navegador atual faz isso. Eles usam utf-8 (Chrome, Opera), iso-8859-1 (Safari), a página de código do sistema (IE) ou outra coisa (como apenas o bit mais significativo de utf-8 no caso do Firefox).
Edit: Acabei de perceber que esta resposta aborda o problema mais da perspectiva do lado do servidor.