簡體   English   中英

Gravity Forms 簽名 - 從 PHP 到 Python

[英]Gravity Forms Signature - From PHP to Python

我需要將一些現有的 PHP 代碼轉換為 Python。 此作業連接到重力表單並查詢某些數據。 為了進行查詢,必須計算簽名以驗證連接。

Gravity Forms web api 在這里給出了很好的 PHP 指導。

PHP方法如下:

function calculate_signature( $string, $private_key ) {
    $hash = hash_hmac( 'sha1', $string, $private_key, true );
    $sig = rawurlencode( base64_encode( $hash ) );
    return $sig;
}

根據我對Python的理解以及php2python.com上關於hash-hmac和rawurlencoded的信息,我寫了以下內容:

import hmac, hashlib, urllib, base64
def calculate_signature(string, private_key):
    hash_var = hmac.new(private_key, string, hashlib.sha1).digest()
    sig = urllib.quote(base64.b64encode(hash_var))
    return sig

但是,這兩個簽名並不等效,因此 Gravity Forms 會返回 HTTP 403: Bad Request 響應。

我在翻譯中遺漏了什么嗎?


更新 (11/04/15)

我現在已經匹配了我的 php 和 python url。 但是,我仍然收到 403 錯誤。

php 和 python 簽名不匹配的原因與它們的calculate_signature()方法無關。

該問題是由不同的expires變量引起的。 Php 使用strtotime("+60 mins")這導致 UTC 時間從現在起 60 分鍾。 而 Python 使用datetime.date.now() + timedelta(minutes=60) 這也是從現在開始的 60 分鍾,但在您當前的時區。

我總是想計算 UTC 中的expire變量,所以我用datetime.datetime.utcnow() + timedelta(minutes=60)替換了我的 Python 計算。

您快到了。 urllib.quote不編碼斜杠,例如,像 PHP 的rawurlencode那樣。 可以使用urllib.quote_plus來達到想要的效果:

import hmac, hashlib, urllib, base64
def calculate_signature(string, private_key):
    hash_var = hmac.new(private_key, string, hashlib.sha1).digest()
    sig = urllib.quote_plus(base64.b64encode(hash_var))
    return sig

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM