[英]HMAC authorization for Faraday
我正在為 API 創建 ruby 包裝器,但他們似乎使用了法拉第不支持的某種奇怪的授權,所以似乎我必須創建自己的函數來生成它。 他們在他們的網站上有這個
您的 API 憑證包含一個公共客戶端標識符 (UUIDv4) 和一個密鑰(32 字節,提供 base64 編碼)。 組織級別的請求身份驗證是使用 Amazon 風格的 HMAC 完成的
和這個
Content-MD5: base64(md5(body)), RFC 1864 (binary md5)
Content-Type: 'application/json'
Date: 'Mon, 07 Dec 2015 22:57:52 +0200' (RFC 2822)
Authorization: 'Success ' + client_identifier + ':' +
base64(
sha512_hmac( // returned as binary
join(
'\n', // unix newline, not the 2 character string
[
http_verb, // 'POST' / 'GET' / etc.
Content-MD5, // Same as header above. Include even for empty string body.
Content-Type, // Same as header above. Can be empty.
Date, // Same as header above.
http_path // '/api/v1/document/?foo=bar'
]
),
key // in binary, remember to decode base64
)
)
現在我已經成功地構建了一個非常凌亂的函數,如下所示
def create_authorization_header(path, payload)
date = Date.today.rfc2822
md5_file = Digest::MD5.hexdigest(payload)
content_md5 = Base64.strict_encode64(md5_file)
digest = OpenSSL::Digest.new('sha512')
autorization_header = "GET " + content_md5 + " application/json " + date + path
autorization_header_enc = 'Success '+ identifier + ':' + Base64.strict_encode64(OpenSSL::HMAC.digest(digest, api_key, autorization_header))
connection.headers['Authorization'] = autorization_header_enc
connection.headers['Content-MD5'] = content_md5
connection.headers['Content-type'] = "application/json"
connection.headers['Date'] = date
end
但這似乎不起作用,我找不到我錯過的東西。 關於這里可能有什么問題的任何建議?
您使用空格作為分隔符連接autorization_header
大部分部分。 根據python示例代碼,它們都應該用換行符分隔。 你可以使用這樣的東西:
autorization_header = ["GET", content_md5, "application/json", date, path].join("\n")
此外,您的content_md5
使用 MD5 哈希的 base64 編碼的十六進制編碼輸出。 但是,您應該使用 md5 哈希的 base64 編碼原始二進制輸出,即
md5_file = Digest::MD5.digest(payload)
最后, date
應該是當前時間戳,即
date = Time.now.rfc2822
可能還有更多問題,但這是我現在發現的。 在實現這樣的協議時,您必須確保完全遵循編碼要求和哈希格式。 否則,數據將不匹配。 您應該嘗試找到有效請求的示例並嘗試構建您的實現,以便它能夠重新創建這個確切的請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.