簡體   English   中英

如何在基本字符串簽名 OAuth1 中包含查詢參數

[英]How to include query params in the base string signature OAuth1

我需要通過重力 forms API(作為插件安裝在 WordPress 服務器中)檢索一些數據。 我必須實現 OAuth 1.0。 一些可用於此類身份驗證的 ruby gem 對我來說效果不佳,所以我決定自己實現它。

如果我不添加額外的參數,我可以對基本字符串進行簽名,但是一旦添加它們,我就會收到錯誤Invalid signature - provided signature does not match.

我的代碼如下所示:

# This OAUTH implementation works without extra query params.
require 'httparty'
OAUTH_TOKEN = "API customer secret token"
OAUTH_PASSWORD = "API customer key token"

url = 'https://localhost/wp-json/gf/v2/entries'

params = "oauth_consumer_key=#{OAUTH_TOKEN}&oauth_nonce=#{SecureRandom.hex}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{Time.now.to_i}&oauth_token=#{OAUTH_PASSWORD}&oauth_version=1.0"
base_string = 'GET&' + CGI.escape(url) + '&' + CGI.escape(params)
secret = "#{OAUTH_PASSWORD}&#{}"
oauth_signature = sign(secret, base_string)
testable_url = url + '?' + params + '&oauth_signature=' + oauth_signature

response = HTTParty.get(testable_url)

def sign( secret, base_string )
  CGI.escape(Base64.encode64("#{OpenSSL::HMAC.digest('sha1', secret, base_string)}").chomp)
end

但是一旦我添加了我需要的查詢參數,它就會崩潰。

query_params = 'search={"field_filters":[{"key":"'+form['key']+'","value":"'+email+'","operator":"is"},{"key":"source_url","value":"'+form['source_url'].to_s+'","operator":"is"}]}'

我正在更新 base_string 以包含 query_params 然后我再次簽名並更新最終的 url

base_string = 'GET&' + CGI.escape(url) + '&' + CGI.escape(query_params) + '&' + CGI.escape(params)
oauth_signature = sign(secret, base_string)
testable_url = url + '?' + query_params + '&' + params + '&oauth_signature=' + oauth_signature

結果我得到以下 URL

"https://localhost/wp-json/gf/v2/entries?search={\"field_filters\":[{\"key\":\"2\",\"value\":\"some@email.com\",\"operator\":\"is\"},{\"key\":\"source_url\",\"value\":\"https://localhost/some_url_i_need/\",\"operator\":\"is\"}]}&oauth_consumer_key=APICUSTOMERSECRET&oauth_nonce=81a6ce4dcabd5ec1059f66ca7ae727e3&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1607594914&oauth_token=APICUSTOMER_TOKEN&oauth_version=1.0&oauth_signature=LIZpR27KNHsw3iWArJjSs%2FsvIek%3D"

由於Invalid signature - provided signature does not match. 錯誤。

正如我讀過的文檔和其他帖子( https://stackoverflow.com/a/4789210 )中所建議的那樣,我已經對參數進行了排序(基本上我在基本字符串的末尾添加了我需要的search參數並且沒有解決不了我的問題。

注意:它在 Postman 和 Postman 生成的 URL 中工作,與我使用 Z90446A21FC5615BC703DZ 得到的非常相似

您的問題之一是您忘記轉義query_params和常規params之間的 & 符號:

base_string = 'GET&' + CGI.escape(url) + '&' + CGI.escape(query_params) + '&' + CGI.escape(params)

您必須將最后一個'&'變成'%26'或將串聯拉入CGI.escape

base_string = 'GET&' + CGI.escape(url) + '&' + CGI.escape(query_params + '&' + params)

不過要注意空params

暫無
暫無

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

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