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

标签: c#python-3.xapihmac

解决方案


推荐阅读