You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现HMAC授权GET请求遇401错误,求对照.NET/JS示例排查

问题:HMAC授权接口401错误排查

尝试通过接口从数据库获取数据,该接口要求HMAC授权。官方文档仅提供.NET和JS示例,我难以将其转换为Python实现。我对GET请求及授权相关操作经验不足,虽已生成哈希,但访问URL时始终返回401错误。我拥有用户名和密码,推测密码作为哈希的密钥。

我的Python代码

import hmac
import hashlib
import datetime
import requests

url = 'URL GIVEN'
dt=datetime.datetime.now()
dt = (dt.strftime("%Y-%m-%dT%H-%m-%S"))


newhmac = hmac.new('PASSWORD GIVEN'.encode('ascii'), None, digestmod = hashlib.md5)

digest = newhmac.hexdigest()
    
print(digest)

HEADERS = {'Authorization':'{}:{}'.format(digest, dt)}
print(HEADERS)
with requests.Session() as s:
    s.headers.update(HEADERS)
    print(s.headers)
    r = s.get(url)

print(r)

运行结果

85b199b366bb319839d96629b75aa998
{'Authorization': 'USERNAME:85b199b366bb319839d96629b75aa998:2022-11-08T18-11-02'}
{'User-Agent': 'python-requests/2.28.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'USERNAME:85b199b366bb319839d96629b75aa998:2022-11-08T18-11-02'}
<Response [401]>

官方示例代码

.NET示例

Sample .net code to produce hash:
Private Sub SignRequest(req As WebRequest, paramStr As String, ByVal ts As String)
Dim x As String = String.Format("{0}{1}", paramStr, ts)
Dim secretBytes As Byte() = ASCIIEncoding.ASCII.GetBytes(_password)
Dim hmac As New HMACMD5(secretBytes)
Dim dataBytes As Byte() = ASCIIEncoding.ASCII.GetBytes(x)
Dim computedHash As Byte() = hmac.ComputeHash(dataBytes)
Dim computedHashString As String = Convert.ToBase64String(computedHash)
req.Headers.Add("Authorization", _Username & ":" & computedHashString & ":" & ts)
End Sub

JS示例

import CryptoJS from 'crypto-js';
const { username, password } = process.env;
const formatTimestampForHash = (d = new Date()) => {
const pad2 = (str) => String(str).padStart(2, '0');
const DD = pad2(d.getUTCDate());
const MM = pad2(d.getUTCMonth() + 1);
const YYYY = d.getUTCFullYear();
const hh = pad2(d.getUTCHours());
const mm = pad2(d.getUTCMinutes());
const ss = pad2(d.getUTCSeconds());
return `${DD}${MM}${YYYY}${hh}${mm}${ss}`;
}
const stripProtocolFromUrl = (url) => {
return url
.replace(/https|http/i, '')
.replace('://', '');
}
export const createAuthHash = (url) => {
const timeStamp = formatTimestampForHash();
const formattedUrl = `${stripProtocolFromUrl(url)}${timeStamp}`;
const hash = CryptoJS.HmacMD5(
formattedUrl,
password
).toString(CryptoJS.enc.Base64);
return `${username}:${hash}:${timeStamp}`;
}

我已按示例将用户名加入Authorization头,但仍报错,怀疑哈希生成存在问题,恳请协助排查。

内容的提问来源于stack exchange,提问作者user14598232

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:10:27