我应该使用什么编码进行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)则不能。 尝试使用系统中不支持字符的用户名/密码可能会导致行为受到破坏或(可能更糟糕)降低安全性。