Я пытаюсь создать веб-сервис, используя Ruby on Rails. Пользователи аутентифицируют себя через HTTP Basic Auth. Я хочу разрешить любые допустимые символы UTF-8 в именах пользователей и паролях.
Проблема в том, что браузер искажает символы в учетных данных Basic Auth перед отправкой их в мой сервис. Для тестирования, я использую 'カ タ カ ナ カ タ カ ナ カ タ カ ナ カ タ カ ナ カ タ カ ナ カ タ カ ナ カ タ カ ナ カ タ カ ナ', как мое имя пользователя (понятия не имею, что это значит - AFAIK это несколько случайных символов наш QA парень придумал - пожалуйста, прости меня, если это как-то оскорбительно).
Если я воспринимаю это как строку и сделать 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 ...', где поменялись местами верхний и нижний кусочки (по крайней мере, когда я вставляю ее в Emacs, декодирование base 64, затем переключаюсь в режим hexl) Это может быть представление имени пользователя в формате UTF16, но я не получил ничего, чтобы отобразить его как что-либо кроме бреда.
Rails устанавливает заголовок типа контента в UTF-8, поэтому браузер должен отправлять в этой кодировке. Я получаю правильные данные для отправки формы.
Проблема возникает как в Firefox 3.0.8, так и в IE 7.
Итак ... есть ли волшебный соус для того, чтобы веб-браузеры отправляли символы UTF-8 через HTTP Basic Auth? Я принимаю вещи неправильно на принимающей стороне? HTTP Basic Auth просто не работает с не-ASCII символами?