2

utf-8でエンコードされた認証文字列を正しくデコードするようにcherrypyを設定する方法はありますか? CherryPyはISO-8859-1でBasic Authをデコードします

更新

それはissue #1680に記載の制限を知っているのです。

問題が解決するまで、CherryPyはUTF-8でエンコードされた基本認証データを認識しません。

元の問題

私はウムラウト文字を使用して名前/パスワードで基本認証を使用して問題があります。 http-clientにISO-8859-1(cherrypyは理解しにくい)という名前:passwordを発行するか、またはcherrypyがutf-8を使って認証文字列をデコードするように設定する方法はないようです。 Pythonの3.6とCherryPyは13.1.0を使用して

[28/Dec/2017:15:52:57] ENGINE Bus STARTING 
[28/Dec/2017:15:52:57] ENGINE Serving on http://127.0.0.1:8080 
[28/Dec/2017:15:52:57] ENGINE Bus STARTED 
realm: 'MY_REALM', username: 'Céline', password: 'motörhead' 
127.0.0.1 - C\xc3\x83\xc2\xa9line [28/Dec/2017:15:53:18] "GET/HTTP/1.1" 200 52 "" "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))" 
:CherryPyにコンソールから次のような出力が得られます

curl -u 'Céline:motörhead' -i -X GET http://127.0.0.1:8080/ 

:次の引数を持つカール呼び出し

import cherrypy 

class SimpleWebpage(object): 
    @cherrypy.expose 
    def index(self): 
     return "<html><head></head><body>Authenticated</body></html>" 

def dummy_validate(realm, username, password): 
    print("realm: {realm!r}, username: {username!r}, password: {password!r}".format_map(locals())) 
    return True 

cherrypy.tree.mount(SimpleWebpage(), '/', 
        {'/': {'tools.auth_basic.checkpassword': dummy_validate, 
          'tools.auth_basic.on': True, 
          'tools.auth_basic.realm': 'MY_REALM',}}) 

cherrypy.config.update({'tools.sessions.on': True,}) 

cherrypy.engine.autoreload.unsubscribe() 
cherrypy.engine.start() 
cherrypy.engine.block() 

cygwin上のcurl 7.56.1(i686-pc-cygwin)とredhat6上のcurl 7.19.7(x86_64-redhat-linux-gnu)でテスト済み。私はgoogle-chrome 63.0.3239.108と同じ結果を試しました。このコードの意志を使用して

Kludge

def decode_utf8(s): 
    s_bytes = bytes([ord(c) for c in s]) 
    return s_bytes.decode('utf-8') 

def dummy_validate(realm, username, password): 
    username = decode_utf8(username) 
    password = decode_utf8(password) 
    print("realm: {realm!r}, username: {username!r}, password: {password!r}".format_map(locals())) 
    return True 

私のグーグル・クロムやカールで正しい結果が得られます。しかし、ISO-8851-15でエンコードされた文字列を送信するWindowsのFirefox 57.0.2(32ビット)では(例として)動作しません。

また、これはcherrypy.request.login値を修正しません。

+0

こんにちは、githubリポジトリに問題を提出して、フレームワーク自体でソートできるようにしてください。コードベースには、Unicodeにはあまり面倒なことがたくさんありましたが、時間の経過とともに修正されましたが、改善の余地はまだあります。 https://github.com/cherrypy/cherrypy/issues/new – webKnjaZ

+0

@webKnjaZさて、私はそれをしています。すぐに問題をリンクします。バグは、stackoverflowで** offtopicではないようです。 – MadMike

+0

あなたは正しいです。ここでは不可解ですが、修復プロセスに影響を与える可能性があるため、それでもなおustreamで追跡する必要があります。 – webKnjaZ

答えて

1

@webKnjaZはコメントで承認されていますが、これはCherryPyまたはcherootで解決する必要があるバグです。

私はその質問を答えたと考えます。関連バグは、対応するCherryPy-Issueで追跡することができます。

関連する問題