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
相关产品推荐
相关产品推荐

