2016-03-19 5 views
0

私は古いプロジェクトに取り組んでおり、Python 3、特に3.4を試してみることにしました。Python 2.7から3.4への移行トークンジェネレータのエンコーディング

私はPyramidフレームワークを構築しており、認証目的でランダム化を生成する必要があります。以前は、ユーザーIDにランダムなビットを追加しましたが、すべて正常でしたが、Python 3ではエンコーディングに問題があります。

これは私がそれを行うために使用される方法です:

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) 

しかし、今、私はエラーを取得する:

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 

だから私は、ユーザー名をエンコードしようとした、と私は

TypeError: b'admin' is not JSON serializable 
を取得

エンコーダはバイトを要求し、JSONは文字列を要求しますが、これをPython 3でどのようにすることができますか?

+1

あなたのトレースバックが投稿された機能と一致しません。たとえば、投稿されたコードには「userid」はありません。 –

+0

あなたのユーザIDをむしろ – Niel

+1

に変更しました。それでもあなたのトレースバックは一致しません。トレースバックの 'userid'行は、それが複数行にわたる大きな辞書ステートメントの一部であるように見えます。 –

答えて

2

JSONには文字列が必要で、JSONにエンコードすると文字列が生成されますが、b64ecode()にはバイトが必要です。あなたはUUIDの六角でこれを連結したい場合は、それらをデコードする必要があると思いますので、b64encode()機能は、あまりにもバイトを生成すること

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

注:json.dumps()の出力をエンコードします。

+0

それはうまくいきましたが、今戻って別のエラーが出ます: 'TypeError:バイト 'オブジェクトをstrに暗黙的に変換できません。しかし、sigにはバイトはありません。秘密は文字列です。こちらはペーストビンです。http://pastebin.com/JAXunsG0 – Niel

+0

@Niel:あなたの「秘密」はバイト単位でなければなりません。そのエラーはそうでないことを示します。 –

+0

それは完璧!どうもありがとうございました。 – Niel

関連する問題