javascript - 使用 Python 为 API 身份验证生成令牌
问题描述
我正在尝试使用 Python 创建一个 API 应用程序。为了访问此 API,应用程序必须生成具有以下格式的令牌:<key>:<hash>:<epoch>
API的文档使用 javascript 作为如何生成令牌的示例。
您可以通过以下方式从您的密钥和秘密生成哈希;
var hash = crypto.createHmac('sha256', secret).update(key +
epoch).digest('base64');
1- Create sha256 hash from secret. 2- Update with key and epoch concatenated. 3- Return base64 representation.
然后可以将应用程序令牌添加到“授权”标头中,如下所示;
Authorization: A5-API <token>
看起来很简单,但是我的 python 代码导致了 401 错误。
{'status': 401, 'name': 'NotAuthorizedError', 'message': 'You must use a valid A5 Authorisation token'}
似乎不知何故我正在生成一个无效的令牌,但我已经经历了十几次,看不出有什么问题。
我知道这不是密钥/密钥错误的问题,因为当我在 api dev 网站上使用密钥/密钥进行测试时,生成的令牌就好了。
所以我想知道是否有人能注意到我正在使用的代码可能有问题?
谢谢!
请在下面查看我的代码(API 密钥、秘密和 url 已删除)。
import base64
import hashlib
import requests
import time
import urllib.parse
"""
auth-token example:
A5-API 5eb77cd86erb50010f57c2ce:gUrQbsIV+S9Fyq8yIzAS+cl2Q3zizQLrFMDGq7zubaI=:1590105400
"""
key = <key>
secret = <secret>
epoch = str(time.mktime(time.localtime()))[:-2]
h = hashlib.sha256(secret.encode())
h_update = (key + epoch).encode('utf-8')
h.update(h_update)
hash_encode = base64.b64encode(h.digest())
hash_decode = hash_encode.decode('utf-8')
epoch = str(time.mktime(time.localtime()))[:-2]
token = f"{key}:{hash_decode}:{epoch}"
authorization = f"A5-API {token}"
headers = {"Authorization": authorization }
url = <api url>
r = requests.get(url, headers = headers)
解决方案
推荐阅读
- javascript - 如果未包装,则JQuery将字符串的每个单词包装在span中
- ios - View Controller 卡在 Swift 中调用 unwind segue
- java - Java scheduleAtFixedRate + Thread.sleep
- scylla - scylladb:scylla_io_setup 脚本未在输出中显示推荐的 --max-io-requests 参数
- javascript - 通过单击按钮角度材料更改选项卡我收到错误
- azure - 如何从 WebPart 获取 Sharepoint 的访问令牌?
- gulp - Babel 导出聚合时抛出类型错误
- python - 对多个熊猫数据框执行相同操作的正确方法是什么?
- perl - 每行的水平绝对值
- java - Java Scanner.nextLine() 错误地将 unicode (emoji) 解析为新行