私はこの問題で頭を壁にぶつけてきました。同様の投稿や記事を読みました。ほとんどの人は、Tomcat の server.xml ファイルで URIEncoding を UTF-8 に設定することを提案していますが、ここでは違いがないようです。
Tomcat 7 でホストされているテスト環境にデプロイされた ReSTful Web サービスがあります。Tomcat は Java 6 を使用するように構成されていますが、マシンには Java 7 もインストールされています。そこでホストされているサービスに対して基本認証テストを実行すると、ログインに失敗し、元の資格情報に Unicode 文字が含まれていると HTTP ステータス 401 の応答を受け取ります。資格情報に ASCII のみが含まれている場合、基本認証は正常に機能します。基本認証をまったく使用せずにログインすることもできます-私のサービスはカスタムログインヘッダーとRFC 2047をサポートしています。そのアプローチを使用すると、資格情報にUnicodeが含まれているかどうかは関係なく、ログインは問題になりません.
具体的には、「問題」は、ユーザー名が UTF-8 で 2 回エンコードされていることです。ログ ファイルが ANSI エンコードされているロガー (別の問題) にバグがあります。ログ ファイルを UTF-8 に変換すると、文字が正しく表示されます。しかし、この場合、問題のあるユーザー名は必要以上に長く、ファイルが UTF-8 に変換されると、(変換される前に) 本来あるべきように見えます。例えば:
- 悪い (BASIC AUTH): SampleUser-â¢ð£Ž´ê龱</li>
- 良い (RFC 2047): SampleUser-¢𣎴ê龱 -> SampleUser-¢ê龱</li>
ここでの本当のキッカーは、Tomcat 7 (Java 6) の独自のインスタンスをローカルで実行していて、それに対して問題を再現できないことです。2 つの Tomcat の conf ディレクトリを比較したところ、同じように見えます。基本認証が一方の環境で機能し、他方の環境では機能しない理由がわかりません。私は自分のマシンからテストを実行しているので、テスト方法(JUnit/JSystem)の不一致によるものではありません。
私が知っていることは次のとおりです。
- 特権に関して話しているユーザーの種類は関係ありません。ユーザー名の Unicode が問題の要因です。
- リクエストが XML 経由で送信されるか JSON 経由で送信されるかは問題ではありません。私のサービスは、両方のタイプのシリアル化をサポートしています。
- Accept charset と content-type (該当する場合) は両方とも、リクエストで UTF-8 に設定されます。
- Java システム プロパティは、両方の環境で同じです。
次の記事は、RFC 2047 と基本認証を組み合わせる可能性を示唆しているため、私にとって非常に興味深いものです。基本的な認証文字列自体には ASCII しか含まれていないため (base-64 でエンコードされているため)、これが必要になるとは思いませんでした。そうだとしても、ある Tomcat サーバーでそのようなことが必要で、別のサーバーでは必要ないのはなぜですか? この組み合わせアプローチを追求することは、根本的な問題に対処していないように感じます。
- http://www.mentby.com/Group/tomcat-user/basic-authentication-failed-with-multibyte-username.html
- HTTP 基本認証にはどのエンコーディングを使用すればよいですか?
試すことや再確認することについての提案を前もって感謝します。テスト環境は私に限られています - 私は時間外に「それで遊ぶ」ことしかできません.