2

Gibt es eine Möglichkeit, cherrypy so zu konfigurieren, dass UTF-8-kodierte Authentifizierungszeichenfolgen korrekt dekodiert werden? CherryPy entschlüsselt Basic Auth mit ISO-8859-1

aktualisieren

Es ist Einschränkung in issue #1680 dokumentiert wissen.

Bis das Problem behoben ist, erkennt CherryPy UTF-8-codierte Basic-Auth-Daten nicht.

Original-Problem

Ich habe Probleme mit basic-auth mit Namen/Passwörter Umlaute verwenden. Es scheint keine Möglichkeit zu geben, den http-Client dazu zu bringen, ISO-8859-1 (welcher cherrypy würde verstehen) name: password oder cherrypy zu konfigurieren, um den Authentifizierungsstring mit utf-8 zu dekodieren.

Verwendung von Python 3.6 und CherryPy 13.1.0:

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() 

curl Aufruf mit den folgenden Argumenten:

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

der folgenden Ausgabe von der cherrypy Konsole geben:

[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))" 

Getestet mit curl 7.56.1 (i686-pc-cygwin) auf cygwin und curl 7.19.7 (x86_64-redhat-linux-gnu) auf redhat6 . Ich habe es auch mit google-chrome 63.0.3239.108 mit genau den gleichen Ergebnissen getestet.

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 

diesen Code verwenden gibt mir korrekte Ergebnisse mit Google-Chrom und curl. Aber es wird nicht funktionieren mit (als Beispiel) Firefox 57.0.2 (32-Bit) unter Windows 10, die ISO-8851-15-codierte Zeichenfolge sendet.

Auch das behebt nicht den cherrypy.request.login Wert.

+0

Hallo, bitte ein Problem in der Github Repo, so dass es im Rahmen selbst aussortiert werden konnte. Es gab viele Unicode-unfreundliche Sachen in der Codebase, die im Laufe der Zeit repariert wurden, aber es gibt immer noch Raum für Verbesserungen. https://github.com/cherrypy/cherrypy/issues/new – webKnjaZ

+0

@webKnjaZ Okay, ich bin dabei. Wird das Problem verlinken, sobald ich es dort gepostet habe. Es scheint, Bugs sind ** nicht ** offtopic bei Stackoverflow. – MadMike

+0

Sie haben Recht. Es ist nicht offtopic hier, aber muss noch in ustream verfolgt werden, da es den Fix-Prozess beeinflussen könnte. – webKnjaZ

Antwort

1

Wie @webKnjaZ in den Kommentaren genehmigt hat, ist dies ein Fehler, der entweder in CherryPy oder cheroot aufgelöst werden muss.

Ich betrachte die Frage als beantwortet. Weiterer Fortschritt der betreffende Bug kann auf dem entsprechenden CherryPy-Issue verfolgt werden.