[英]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.