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.
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
@webKnjaZ Okay, ich bin dabei. Wird das Problem verlinken, sobald ich es dort gepostet habe. Es scheint, Bugs sind ** nicht ** offtopic bei Stackoverflow. – MadMike
Sie haben Recht. Es ist nicht offtopic hier, aber muss noch in ustream verfolgt werden, da es den Fix-Prozess beeinflussen könnte. – webKnjaZ