我应该使用什么编码进行HTTP基本authentication?

RFC2617表示将用户名和密码编码为base64,但不要说在创buildinput到base64algorithm中的八位字节时要使用什么字符编码。

我应该假设US-ASCII或UTF8? 还是有人在某个地方解决了这个问题?

该规范可以被读为“ISO-8859-1”或“未定义”。 你的select。 众所周知,许多服务器使用ISO-8859-1(不pipe你喜不喜欢),当你发送别的东西的时候会失败。

有关更多信息和解决问题的build议,请参阅http://greenbytes.de/tech/webdav/draft-reschke-basicauth-enc-latest.html

简短的回答:iso-8859-1,除非按照RFC2047(MIME)使用编码字。

更长的解释:

RFC2617第2节 (HTTPauthentication)定义了基本凭证

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 

如果没有提及RFC2616(HTTP 1.1)的BNF定义,就不应该阅读这个规范(像上面那样):

本规范是HTTP / 1.1规范2的配套。 它使用该文档的扩展的BNF部分2.1,并且依赖于该文档中定义的非terminal以及HTTP / 1.1规范的其他方面。

RFC2616,2.1节定义了TEXT (重点介绍):

TEXT规则仅用于描述性的字段内容和值,不打算由消息parsing器解释。 只有当根据RFC 2047的规则进行编码时,* TEXT的字可以包含除ISO-8859-1以外的字符集中的字符。

 TEXT = <any OCTET except CTLs, but including LWS> 

所以它肯定是iso-8859-1,除非你根据RFC2047 (MIME pt。3 )规则检测到一些其他的编码:

 // Username: Mike // Password T€ST Mike:=?iso-8859-15?q?T€ST?= 

在这种情况下,根据iso-8859-15 ,单词中的欧元符号将被编码为0xA4 。 这是我的理解,你应该检查这些编码的单词分隔符,然后根据指定的编码解码里面的单词。 如果你不这样做,你会认为密码=?iso-8859-15?q?T¤ST?= (注意当解释为iso-8859-1时, 0xA4将被解码为¤ )。

这是我的理解,我找不到比这些RFC更明确的确认。 而且有些似乎是矛盾的。 例如,RFC2047(MIME,第3页)的4个既定目标之一是重新定义:

消息的格式允许… US-ASCII以外的字符集中的文本标题信息。

但是RFC2616(HTTP 1.1)使用默认为iso-8859-1的TEXT规则定义了一个头文件。 这是否意味着这个头文件中的每个单词都应该是一个编码词(即=?...?= form)?

也相关,目前没有浏览器这样做。 他们使用utf-8(Chrome,Opera),iso-8859-1(Safari),系统代码页(IE)或其他东西(比如Firefox中只有utf-8最重要的位)。

编辑:我刚刚意识到这个答案从服务器端的angular度来看更多的问题。

如果您对在login提示时input非ASCII字符时浏览器感兴趣,我只是尝试使用Firefox。

通过采用每个unicode值的最低有效字节,似乎懒惰地将通过转换为ISO-8859-1,例如:

 User: 豚 (\u8c5a) Password: 虎 (\u864e) 

编码相同:

 User: Z (\u005a) Password: N (\u004e) 

0x5a 0x3a 0x4e base64-> WjpO

除了RFC外,在Spring框架中BasicAuthenticationFilter类,默认是UTF-8

我相信这个select的原因是UTF-8能够编码所有可能的字符,而ISO-8859-1(或ASCII)则不能。 尝试使用系统中不支持字符的用户名/密码可能会导致行为受到破坏或(可能更糟糕)降低安全性。