前幾天去無名 API 說明會,技術面中其中一個比較「有趣」的功能是「Base64 上傳」,在「
無名小站 API 文件 - Version 1.2」這邊可以看到 API 文件關於 Base64 的部份。
剛好今天寫 code 的時候回去重新讀
OAuth Core 1.0a,把之前一堆環節串起來,才知道為什麼無名會設計 Base64 上傳...
OAuth Core 1.0a 內提到有三種方式可以傳遞 OAuth Protocol Parameter,而且是有優先順序的,從最優先開始分別是:
- In the HTTP Authorization header as defined in OAuth HTTP Authorization Scheme.
- As the HTTP POST request body with a content-type of application/x-www-form-urlencoded.
- Added to the URLs in the query part (as defined by [RFC3986] section 3).
其中第一種方式沒辦法傳 extra parameter,第二種方式在上傳檔案時會變成 multipart。於是,上傳時要用第三種方式,把所有 parameter (OAuth Protocol 與 Extra) 在簽完後塞到 query string 裡面,而檔案用 POST (multipart) 送出...
由於檔案上傳的部份沒簽到,所以可以在傳輸過程中間被換掉 (整個 request 看起來仍然合法),所以一般會加上一個 extra parameter 傳 POST 資料的 Secure Hash。
但之前
Manic 就跟我抱怨
PHP 上面的 OAuth Library 都遺忘了檔案上傳這塊,他得自己建立 POST body 丟出去 XDDD
於是我就瞬間理解為什麼要用 Base64 上傳了... XD
PS:這是一種可能性,也有可能是 Y! policy 覺得要用 OAuth 直接簽進去才安全,這只有當初定 API spec 的人才知道了...