2016-03-19 4 views
0

Ich arbeite an einem alten Projekt von mir, und ich entschied mich, Python 3, speziell 3.4 zu testen.Migration von Python 2.7 auf 3.4 Token Generator Codierung

Ich baue im Pyramid-Framework und ich muss eine randomisierte für die Authentifizierung Zwecke generieren. Zuvor habe ich einfach ein zufälliges Bit zur Benutzer-ID hinzugefügt und alles war in Ordnung, aber mit Python 3 habe ich einige Probleme mit der Codierung.

Dies ist, wie ich verwendet, es zu tun:

from base64 import b64encode, b64decode 
from Crypto.Hash import HMAC, SHA 

def create_token(request, username): 

    r = uuid4().hex + b64encode(json.dumps({'username': username})) 

    sig = HMAC.new(secret, r.encode('UTF-8'), SHA).hexdigest() 
    return u"{}{}".format(sig, r) 

Aber jetzt bekomme ich den Fehler:

File "/security.py", line 30, in create_token 
    r = uuid4().hex + b64encode(json.dumps({'username': username})) 
    File "/.pyenv/versions/3.4.0/lib/python3.4/base64.py", line 63, in b64encode 
    encoded = binascii.b2a_base64(s)[:-1] 
TypeError: 'str' does not support the buffer interface 

So habe ich versucht, den Benutzernamen codiert, und ich bekomme

TypeError: b'admin' is not JSON serializable 

Also der Encoder will Bytes und JSON wollen Strings, wie kann ich das in Python 3 machen?

+1

Ihr Traceback stimmt nicht mit Ihrer veröffentlichten Funktion überein. Zum Beispiel gibt es in Ihrem geposteten Code keine Benutzer-ID. –

+0

Benutzer-ID wurde in Benutzername geändert. – Niel

+1

Das stimmt jedoch nicht mit Ihrem Traceback überein. Die Zeile 'userid' im Traceback sieht aus, als wäre sie Teil einer größeren Wörterbuchanweisung über mehrere Zeilen hinweg. –

Antwort

2

JSON benötigt Zeichenfolgen und die Codierung zu JSON erzeugt eine Zeichenfolge, aber b64ecode() erfordert Bytes. Encode die Ausgabe von json.dumps():

encoded_json = json.dumps({'username': username}) 
r = uuid4().hex + b64encode(encoded_json.encode('utf8')).decode('ascii') 

Beachten Sie, dass die b64encode() Funktion Bytes zu erzeugt, so dass Sie diese entschlüsseln müßten, wenn man will dies mit dem UUID hex verketten.

+0

Nun, es hat alles geklappt, aber jetzt bekomme ich einen weiteren Fehler: 'TypeError: Kann 'Bytes' Objekt nicht implizit in str konvertieren. Aber es gibt keine Bytes in der Sig, Secret ist eine Zeichenkette. Hier ist ein Pastebin http://pastebin.com/JAXunsG0 – Niel

+0

@Niel: Your 'Secret' muss bytes auch; Dieser Fehler zeigt an, dass dies nicht der Fall ist. –

+0

Das ist perfekt! Vielen Dank. – Niel