c# - 将 API 身份验证算法从 C# 转换为 Python
问题描述
目标
我正在尝试将用 C# 编写的 API 身份验证算法转换为 Python。似乎我的代码就在那里,但是当我尝试使用 API 进行身份验证时,我收到 400 status_code 错误,这让我相信请求语法有问题。我的想法是生成 HMACSHA256 签名是一个问题。授权标头的格式为:amx AccessKey:Signature:Timestamp
Timestamp 是纪元时间,签名是 HMAC,使用 Access Key 和 Secret Key 生成。
出于显而易见的原因,我已经更改了密钥、api 密钥和请求 url,但是当我打印 URL 时,一切看起来都应该正常工作。我错过了什么?
C#
这是当前可以正常工作的 C# 代码。
public string GenerateAuthString(){
string requestSignatureBase64String = string.Empty;
string signatureRawData = String.Format("{0}:{1}", _requestAccessKey, _requestTimestamp);
var secretKeyByteArray = Encoding.UTF8.GetBytes(_requestSecretKey);
byte[] signature = Encoding.UTF8.GetBytes(signatureRawData);
using (HMACSHA256 hmac = new HMACSHA256(secretKeyByteArray)){
byte[] signatureBytes = hmac.ComputeHash(signature);
requestSignatureBase64String = Convert.ToBase64String(signatureBytes);
}
string auth_string = "amx " + _requestAccessKey + ":" + requestSignatureBase64String + ":" + _requestTimestamp;
return (auth_string);
}
Python
这是我正在处理的 Python 代码。
import requests
import time
import hmac
import hashlib
import base64
def generate_auth():
requestAccessKey = '1a2b3c4'
requestSecretKey = '5c6b738'
requestTimestamp = int(time.time())
strTimestamp = str(requestTimestamp)
requestSignatureBase64String = ''
signatureRawData = '{} {}'.format(requestAccessKey, requestTimestamp)
secretKeyByteArray = bytearray(requestSecretKey, 'utf-8')
signature = bytearray(signatureRawData, 'utf-8')
# HMAC SHA256 Computation
signature = base64.b64encode(hmac.new(secretKeyByteArray, signature, digestmod=hashlib.sha256).digest())
signatureStr = str(signature)
authString = 'amx ' + requestAccessKey + ':' + signatureStr + ':' + strTimestamp
return(authString)
# Call function generating authentication string
auth = generate_auth()
r = requests.get('https://api.testing.online', params=auth)
print(r.url)
解决方案
推荐阅读
- python - Python selenium webdriver:列表索引超出范围最多5个元素
- python - 如果在转换为数据框之前检测到,Python pandas 将删除页眉和页脚记录
- isabelle - 伊莎贝尔:函数没有代码方程
- swiftui - SwiftUI Menu - 菜单实际打开时的操作
- docker - 将docker(compose)图像semver标签记录到fluentd?
- javascript - 在 Google Log 功能之后但在用户登录之前调用 history.push
- python-3.8 - python-AIML 0.9.3 带有日期标签的日期格式
- amazon-web-services - 进行 terraform 更改时,Autoscaling 实例的更改会发生什么变化
- angular - Angular-文件下载的最佳实践
- javascript - ChildProcessError:超出标准输出最大缓冲区长度