【问题标题】:Unicode-objects must be encoded before hashing in python3Unicode 对象必须在 python3 中散列之前进行编码
【发布时间】:2020-03-25 07:52:10
【问题描述】:

我一直在尝试制作一个与 MKM 的 API 交互的应用,但我决定不使用 OAuth1 库并自己制作标头,但我遇到了 Oauth1 需要的签名问题。整个过程(对于php)可以在here找到。

这是我目前拥有的代码(我正在通过尝试发送单个请求来测试 API,以便了解它是如何工作的)

代码:

#!/usr/bin/env python3
import requests
from urllib.parse import quote_plus as rawurlencode
import time
import string
import random
import operator
import uuid
from hashlib import sha1
from hmac import new as hmac


#check this https://stackoverflow.com/questions/27075944/oauth1-0-api-issue-with-python/32510649
def main():


    app_token = "XXXXXXXXX"
    app_secret = "XXXXXXXXX"
    access_token = "XXXXXXXXX"
    access_token_secret = "XXXXXXXXX"

    signing_key = str(app_secret+'&'+access_token_secret)

    nonce = uuid.uuid4().hex

    url = 'https://api.cardmarket.com/ws/v2.0/account'
    base_url='GET&'+rawurlencode(url)+'&'
    params = 'oauth_consumer_key=XXXXXXXXX&'+ \
    'oauth_nonce='+nonce+'&'+\
    'oauth_signature_method="HMAC-SHA1&'+\
    'oauth_timestamp='+str(int(time.time()))+'&'+\
    'oauth_token=XXXXXXXXX&'+\
    'oauth_version=1.0'
    base_string = rawurlencode(params)
    string_f = base_url+base_string
    signature = hmac(signing_key.encode('utf-8'), base_string, sha1).digest().encode('base64')[:-1]
    MyHeader = 'OAuth ' + 'realm="' + url + '", ' 
    MyHeader += 'oauth_consumer_key' + '="' + 'XXXXXXXXX' + '",'
    MyHeader += 'oauth_nonce' + '="' + nonce + '",'
    MyHeader += 'oauth_signature_method' + '="' + 'HMAC-SHA1' + '",'
    MyHeader += 'oauth_timestamp' + '="' + str(int(time.time())) + '",'
    MyHeader += 'oauth_token' + '="' + 'XXXXXXXXX' + '",'
    MyHeader += 'oauth_version' + '="' + '1.0' + '",'
    MyHeader += 'oauth_signature="' + signature +'"'

    headers = {'Authorization': MyHeader}


    response = request.get(url,headers=headers)

    print(response.json())
    #print(base_string+"\n\n")
    #print("KEY "+signing_key+"\n\n")
    #print("String final "+string_f+"\n\n")


if __name__ == "__main__":
    main()

当我使用脚本时,我会收到下一条消息:

Traceback (most recent call last):
  File "origin.py", line 58, in <module>
    main()
  File "origin.py", line 36, in main
    signature = hmac(signing_key.encode('utf-8'), base_string, sha1).digest().encode('base64')[:-1]
  File "/usr/lib/python3.6/hmac.py", line 144, in new
    return HMAC(key, msg, digestmod)
  File "/usr/lib/python3.6/hmac.py", line 84, in __init__
    self.update(msg)
  File "/usr/lib/python3.6/hmac.py", line 93, in update
    self.inner.update(msg)
TypeError: Unicode-objects must be encoded before hashing

现在,我一直在对此进行调查,并在 HMAC 构造函数上尝试了不同的方法,因此它不会失败,我什至将构造函数和 digest() 分开,以便我可以更准确地确定错误是。话虽如此,我已经没有想法了,我已经阅读了大约 100 篇关于这个特定 TypeError 的不同帖子,我真的不知道该怎么办了,这可能会是一件非常愚蠢的事情,但我真的需要你的帮助大家,老实说我有点失去理智:D

【问题讨论】:

    标签: python python-3.x oauth typeerror hmac


    【解决方案1】:

    您需要编码您的base_string,因为 hmac 使用的是字节,而不是 unicode 字符串:

    signature = hmac(signing_key.encode('utf-8'), base_string.encode(), sha1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多