首页 > 解决方案 > 使用 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)

标签: javascriptpythonjwttoken

解决方案


推荐阅读