簡體   English   中英

法拉第HMAC授權

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

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