【发布时间】:2010-10-16 16:50:16
【问题描述】:
我正在尝试使用 Ruby on Rails 构建 Web 服务。用户通过 HTTP Basic Auth 进行身份验证。我想在用户名和密码中允许任何有效的 UTF-8 字符。
问题是浏览器在将基本身份验证凭据中的字符发送到我的服务之前会对其进行处理。为了进行测试,我使用“カタカナカタカナカタカナカタカナカタカナカカカナカタカナカタカナカタカナ”作为我的用户名(不知道这是什么意思 - 如果它是冒犯的家伙,请原谅我)。 /p>
如果我把它看作一个字符串和做username.unpack(“H *”)将其转换为十六进制,我得到:“3e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a8”这似乎大约为右32个汉字字符(每3字节/ 6个十六进制数字) .
如果我对通过 HTTP 基本身份验证传入的用户名执行相同操作,我会得到: 'bafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaac'。显然要短得多。使用 Firefox Live HTTP Headers 插件,这是发送的实际标头:
Authorization: Basic q7+ryqu/q8qrv6vKq7+ryqu/q8qrv6vKq7+ryqu/q8o6q7+ryqu/q8qrv6vKq7+ryqu/q8qrv6vKq7+ryqu/q8o=
这看起来像'bafbba ...'字符串,高半字节和低半字节交换(至少当我将它粘贴到 Emacs 时,base 64 解码,然后切换到 hexl 模式)。这可能是用户名的 UTF16 表示形式,但除了乱码之外,我没有得到任何东西来显示它。
Rails 将 content-type 标头设置为 UTF-8,因此浏览器应该以该编码发送。我得到了正确的表单提交数据。
问题发生在 Firefox 3.0.8 和 IE 7 中。
那么...是否有一些神奇的方法可以让 Web 浏览器通过 HTTP Basic Auth 发送 UTF-8 字符?我在接收端处理错误吗? HTTP Basic Auth 是否不适用于非 ASCII 字符?
【问题讨论】:
-
琐事:“随机字符”并不令人反感。他们是日本人,在片假名脚本en.wikipedia.org/wiki/Katakana 中说“片假名”(8 次),这通常用于拼写非日语单词和声音。 (这很奇怪,因为“片假名”是一个日语单词,所以通常不拼成片假名:-)
-
琐事附录:我看过很多用片假名写的。最初我把它归结为那些试图写诗的人,但我只是在 Jisho 中查找它,它说它“通常是用假名写的”。
标签: ruby-on-rails http utf-8 http-headers