2017-02-17 31 views
0

我正在開發一個WordPress站點,該站點提供對Amazon S3上託管文件的免費(但臨時)訪問。這將是我們對Amazon SDK的一次性使用,因此爲了that function的目的,將它們的整個庫及其依賴關係包含在我們的服務器上似乎很荒謬。cURL/PHP可以遠程請求Amazon S3對象的預定義URL嗎?

有沒有辦法使用cURL(PHP)從我們的服務器傳遞指令並從亞馬遜以其他方式獲取預定網址?

+0

磁盤空間很便宜 – user2182349

+0

該點不是磁盤空間。它正在成爲數千行代碼的保管者,然後我必須及時更新。 –

+0

您需要使用Composer,這將使代碼保持最新狀態。您可以免除版本控制中的AWS代碼。使用可用的庫幾乎總是比編寫自己的代碼更好,尤其是對像亞馬遜這樣複雜的服務。 – user2182349

回答

1

這是一種常見的誤解,即您從服務中「獲取」預簽名的URL,但事實並非如此。

它們是在您的代碼中本地生成的(或在本地SDK代碼中)。您的密鑰用於生成URL代表的請求的規範表示形式的HMAC摘要。當服務收到請求時(例如,單擊URL時),服務將請求規範化請求,從您的祕密(不在URL中,但您和服務已知)中生成哈希,如果結果匹配,則認爲請求已通過認證並允許繼續進行授權階段(以確保提供的訪問密鑰ID實際上具有允許請求的權限)。如果結果不匹配,則密鑰或密碼錯誤,您身邊的簽名代碼發生錯誤,或簽名的URL自簽名以來已被修改。拒絕訪問。

然後,沒有服務端點返回帶簽名的URL,儘管您可以使用Lambda和API網關相對容易地爲您的服務器創建一個。例如,Lambda for Node已經安裝了SDK,因此您可以將URL傳遞並通過HTTPS將URL返回。簡單但有點愚蠢。當然,您必須使用API​​密鑰或祕密頭驗證應用程序的請求,因爲您無法使用本地身份驗證,因爲這需要SDK。 :)

生成您自己的代碼來創建簽名的URL並不困難。該過程是fully documented,但您會在該頁面上注意到他們建議您使用SDK。我懷疑這樣做的原因是,即使你沒有足夠的編碼技巧來編寫你自己的算法實現,它也不會成爲進入的障礙。

我已經寫了我自己的這個實現......實際上,我甚至已經寫了一個老版本的V2 signing algorithm(它仍然適用於2014年以前在線的任何區域)的實現,完全使用SQL,作爲MySQL存儲的函數(例如SELECT get_signed_url('/bucket/key');返回一個簽名的url到GET一個對象,憑證作爲變量存儲在函數中)...並且考慮到SQL可能是最不可能的語言,你會想到這樣的操作,完美。

所以你可以自己寫。

但我認爲,出於維護原因包含SDK的反對意見是錯誤的。

AWS不會對其服務API進行重大更改。

他們只是沒有。當S3引入了ListObjects操作的第2版時,V1仍然可用。建議使用V2,但V1不是而是,不建議使用,也不接受刪除。

當引入版本4(上文提到)時,他們將其添加到所有舊地區,將簽名版本2留在已有的地方,並且僅使用V4部署新地區。 Sig V2也不被棄用,但建議使用V4。S3中的對象版本編寫是以100%向後兼容不理解對象版本的代碼。名單繼續。

缺少影響您(不太可能)或與安全性有關的錯誤(也不太可能),除非您想要利用新功能,否則不需要在項目中替換當前版本的任何SDK。服務或新的AWS區域,這些可能不會在穩定的項目中經常發生。

+0

這是一個很好的答案,邁克爾。 –

相關問題