Я пытаюсь создать веб-сервис, используя Ruby on Rails. Пользователи аутентифицируются через HTTP Basic Auth. Я хочу разрешить любые допустимые символы UTF-8 в именах пользователей и паролях.
Проблема заключается в том, что браузер изменяет символы в учетных данных Basic Auth перед отправкой их на мою службу. Для тестирования я использую 'カ タ カ ナ カ タ カ カ カ タ カ カ ナ タ タ ナ カ カ タ カ ナ カ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ ナ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Если я воспринимаю это как строку и сделать username.unpack( "ч *" ), чтобы преобразовать его в шестнадцатеричном, я получаю: "3e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a8" Это кажется о праве на 32 кандзи символов (3 байта /6 шестнадцатеричных цифр в).
Если я сделаю то же самое с именем пользователя, которое входит через HTTP Basic auth, я получаю: 'Bafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaac. Это явно намного короче. Используя плагин Firefox Live HTTP Headers, здесь отображается фактический заголовок:
Authorization: Basic q7+ryqu/q8qrv6vKq7+ryqu/q8qrv6vKq7+ryqu/q8o6q7+ryqu/q8qrv6vKq7+ryqu/q8qrv6vKq7+ryqu/q8o=
Это выглядит так: строка "bafbba...", с высоким и низким размером nibbles (по крайней мере, когда я вставляю ее в Emacs, base 64 decode, а затем переключаюсь в режим hexl). Это может быть представление UTF16 имени пользователя, но я не получил ничего, чтобы отобразить его как нечто, кроме тарабарщины.
Rails настраивает заголовок типа контента на UTF-8, поэтому браузер должен отправлять эту кодировку. Я получаю правильные данные для отправки форм.
Проблема происходит как в Firefox 3.0.8, так и в IE 7.
Итак... есть ли какой-то волшебный соус для получения веб-браузеров для отправки символов UTF-8 через HTTP Basic Auth? Я что-то неправильно делаю на принимающей стороне? HTTP Basic Auth просто не работает с символами, отличными от ASCII?