Marvel API 调用中的哈希、时间戳和密钥组合无效

Posted

技术标签:

【中文标题】Marvel API 调用中的哈希、时间戳和密钥组合无效【英文标题】:Invalid hash, timestamp, and key combination in Marvel API Call 【发布时间】:2019-04-20 18:00:51 【问题描述】:

我正在尝试构建 Marvel API 调用。

这是一个关于授权的链接: https://developer.marvel.com/documentation/authorization

我正在尝试创建一个服务器端应用程序,因此根据上面的链接,我需要一个时间戳、apikey 和哈希 url 参数。散列需要是 md5 散列形式:md5(timestamp + privateKey + publicKey) 并且 apikey url 参数是我的公钥。

这是我的代码,我在 Python 3 中发出请求,使用请求库形成请求,使用时间库形成时间戳,并使用 hashlib 库形成哈希。

#request.py: making a http request to marvel api

import requests;
import time;
import hashlib;


#timestamp
ts = time.time();
ts_str = str(float(ts));


#keys
public_key = 'a3c785ecc50aa21b134fca1391903926';
private_key = 'my_private_key';

#hash and encodings
m_hash = hashlib.md5();
ts_str_byte = bytes(ts_str, 'utf-8');
private_key_byte = bytes(private_key, 'utf-8');
public_key_byte = bytes(public_key, 'utf-8');
m_hash.update(ts_str_byte + private_key_byte + public_key_byte);
m_hash_str = str(m_hash.digest());


#all request parameters
payload = 'ts': ts_str, 'apikey': 'a3c785ecc50aa21b134fca1391903926', 'hash': m_hash_str;


#make request
r = requests.get('https://gateway.marvel.com:443/v1/public/characters', params=payload);


#for debugging
print(r.url);
print(r.json());

这是输出:

$python3 request.py
https://gateway.marvel.com:443/v1/public/characters...$URL TRUNCATED FOR READABILITY)
'code': 'InvalidCredentials', 'message': 'That hash, timestamp, and key combination is invalid'
$

我不确定究竟是什么导致组合无效。

我可以根据要求提供更多信息。任何信息,将不胜感激。谢谢!

编辑:

总的来说,我对 API 调用有点陌生。是否有任何资源可用于了解有关如何执行它们的更多信息?到目前为止,以我有限的经验,它们似乎非常具体,让每个人都能工作需要一段时间。我是一名大学生,每当我参加黑客马拉松时,我都需要很长时间才能弄清楚如何执行 API 调用。我承认我没有经验,但一般来说,找出新的 API 需要很大的学习曲线,即使对于已经完成了 10 次左右的人来说也是如此?

再次感谢您的宝贵时间:)

【问题讨论】:

我玩过你的代码,我认为m_hash.hexdigest() 可能是解决方案。我必须对ts = 1apikey = 1234 进行硬编码,以确保Marvel 示例中的哈希正确输出。另外,ts_str = str(int(ts)); int,不是浮点数? 嗨,你是对的,我也刚刚弄清楚了,这是哈希的格式 :( 感谢您的时间,赞成您的回复,因为它是正确的。现在 time.time()返回一个十进制值——我多次打印了 ts 的值,看起来它会根据秒而改变——所以只要我不在同一秒内进行多个 API 调用,整数值就可以了。如果我做,我可能不得不使用浮点值。谢谢:) 【参考方案1】:

我在访问 Marvel API 密钥时也遇到了类似的问题。对于那些仍在苦苦挣扎的人,这是我的模板代码(我在 jupyter notebook 中使用)。

# import dependencies
import hashlib  #this is needed for the hashing library
import time   #this is needed to produce a time stamp
import json   #Marvel provides its information in json format
import requests #This is used to request information from the API

#Constructing the Hash
m = hashlib.md5()   #I'm assigning the method to the variable m.  Marvel 
    #requires md5 hashing, but I could also use SHA256 or others for APIS other 
    #than Marvel's 

ts = str(time.time())   #This creates the time stamp as a string
ts_byte = bytes(ts, 'utf-8')  #This converts the timestamp into a byte 
m.update(ts_byte)  # I add the timestamp (in byte format) to the hash
m.update(b"my_private_key") #I add the private key to 
    #the hash.Notice I added the b in front of the string to convert it to byte 
    #format, which is required for md5
m.update(b"b2aeb1c91ad82792e4583eb08509f87a") #And now I add my public key to 
    #the hash
hasht = m.hexdigest()    #Marvel requires the string to be in hex; they 
    #don't say this in their API documentation, unfortunately.

#constructing the query
base_url = "https://gateway.marvel.com"  #provided in Marvel API documentation
api_key = "b2aeb1c91ad82792e4583eb08509f87a" #My public key
query = "/v1/public/events" +"?"  #My query is for all the events in Marvel Uni

#Building the actual query from the information above
query_url = base_url + query +"ts=" + ts+ "&apikey=" + api_key + "&hash=" + 
hasht
print(query_url) #I like to look at the query before I make the request to 
    #ensure that it's accurate.

#Making the API request and receiving info back as a json
data = requests.get(query_url).json()
print(data)  #I like to view the data to make sure I received it correctly

在应得的地方给予赞扬,我非常依赖这个博客。你可以去这里了解更多关于 hashlib 库的信息。 https://docs.python.org/3/library/hashlib.html

【讨论】:

【参考方案2】:

我注意到在您的终端中您的 MD5 哈希是大写的。 MD5 应该以小写形式输出。确保你转换成那个。

这是我的问题,我发送的是大写哈希。

【讨论】:

【参考方案3】:

如上所述,解决方案是哈希的格式不正确。需要为十六进制字符串,问题已解决。

【讨论】:

避免提及 cmets。将更正或解决方案附加到您的答案中。

以上是关于Marvel API 调用中的哈希、时间戳和密钥组合无效的主要内容,如果未能解决你的问题,请参考以下文章

“你必须提供一个哈希值。”使用 API 下载数据时出错(在 R 中)

如何通过哈希比较限制 API 密钥的使用

防止重放攻击最有效的方法是

在本地存储中存储会话密钥

Swift 3:将 SHA256 哈希字符串转换为 SecCertificate

Google Cloud 获取 API Key 的日志使用信息