編程模型
以保護(hù)數(shù)據(jù)安全和考慮架構(gòu)合理性為出發(fā)點(diǎn),我們對(duì)基于七牛云存儲(chǔ)服務(wù)如何進(jìn)行開(kāi)發(fā)提供了一些設(shè)計(jì)和編碼建議。希望開(kāi)發(fā)者在使用七牛云存儲(chǔ)服務(wù)之前詳細(xì)閱讀這些建議,并盡可能的符合這些原則,以免造成不必要的時(shí)間浪費(fèi)和帶來(lái)數(shù)據(jù)安全風(fēng)險(xiǎn)。
基本結(jié)構(gòu)
基于七牛云存儲(chǔ)服務(wù)構(gòu)建的應(yīng)用,建議使用如下基本架構(gòu):
從該結(jié)構(gòu)圖,我們可以看到以下幾個(gè)關(guān)鍵組件:
- 七牛云存儲(chǔ)服務(wù)七牛云存儲(chǔ)服務(wù)是以鍵值對(duì)方式提供非結(jié)構(gòu)化資源存儲(chǔ)服務(wù)。向業(yè)務(wù)服務(wù)器提供資源管理服務(wù),向客戶端提供資源上傳和下載服務(wù)。
- 業(yè)務(wù)服務(wù)器開(kāi)發(fā)者需要自行管理和維護(hù)的一組業(yè)務(wù)服務(wù)器,至少負(fù)責(zé)提供如下幾個(gè)基本功能:生成各種安全憑證(參見(jiàn)安全機(jī)制),安全憑證的創(chuàng)建不能在客戶端上進(jìn)行,否則會(huì)產(chǎn)生極大的安全風(fēng)險(xiǎn)。使用關(guān)系型數(shù)據(jù)庫(kù)(比如MySQL)管理用戶帳號(hào)信息。最終用戶信息的管理并非云存儲(chǔ)服務(wù)的功能范疇。云存儲(chǔ)服務(wù)只管理企業(yè)賬號(hào)。使用數(shù)據(jù)庫(kù)管理資源元數(shù)據(jù)和資源之間的關(guān)聯(lián)關(guān)系。響應(yīng)客戶端的業(yè)務(wù)請(qǐng)求,執(zhí)行業(yè)務(wù)流程并返回執(zhí)行結(jié)果。
- 客戶端客戶端通常同時(shí)是資源的生產(chǎn)方和消費(fèi)方??蛻舳嗽谡故緝?nèi)容時(shí),通常需要先從業(yè)務(wù)服務(wù)器獲取資源的元信息,并得到必要的下載憑證,然后使用下載憑證從七牛云存儲(chǔ)服務(wù)獲取待展示的資源內(nèi)容,從而實(shí)現(xiàn)一個(gè)完整的內(nèi)容展示過(guò)程。
業(yè)務(wù)流程
關(guān)鍵的幾個(gè)交互過(guò)程:
- 上傳客戶端在上傳資源到七牛云存儲(chǔ)之前要先從業(yè)務(wù)服務(wù)器獲取一個(gè)有效的上傳憑證,因此需要先后和兩個(gè)服務(wù)端打交道。
- 如果有設(shè)置回調(diào),則上傳完成時(shí)七牛云存儲(chǔ)會(huì)自動(dòng)發(fā)起回調(diào)到指定的業(yè)務(wù)服務(wù)器。
- 下載公開(kāi)資源因?yàn)椴恍枰獙?duì)應(yīng)的下載憑證即可訪問(wèn),客戶端可以直接從七牛云存儲(chǔ)下載對(duì)應(yīng)資源。私有資源因?yàn)樾枰獙?duì)應(yīng)的下載憑證,因此必須先和業(yè)務(wù)服務(wù)器打交道。按照實(shí)際的使用場(chǎng)景,客戶端對(duì)于內(nèi)容的展示非常類似于一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)的生成過(guò)程,因此無(wú)論該頁(yè)面內(nèi)容是公開(kāi)還是私有,均需要從業(yè)務(wù)服務(wù)器獲取該展示頁(yè)面的動(dòng)態(tài)布局信息。所以通常顯示過(guò)程也是需要先后和業(yè)務(wù)服務(wù)器及七牛云存儲(chǔ)服務(wù)打交道。
- 資源管理為了防止安全漏洞,資源管理操作應(yīng)該只在業(yè)務(wù)服務(wù)器端進(jìn)行。如果允許客戶端進(jìn)行資源管理,即使將管理憑證的生成動(dòng)作放到業(yè)務(wù)服務(wù)器端進(jìn)行,仍然很容易被第三方截獲請(qǐng)求全文,從而導(dǎo)致重放攻擊的風(fēng)險(xiǎn)。
關(guān)鍵原則
這個(gè)模型的關(guān)鍵點(diǎn)如下:
- 整個(gè)架構(gòu)中需要一個(gè)業(yè)務(wù)服務(wù)器的組件。
- 無(wú)論如何,AccessKey/SecretKey均不得包含在客戶端的分發(fā)包中,如二進(jìn)制代碼中、配置文件中或網(wǎng)頁(yè)中。
- SecretKey不得在任何場(chǎng)景中的公網(wǎng)上傳輸,更不得傳輸?shù)娇蛻舳恕?/li>
- 業(yè)務(wù)服務(wù)器端應(yīng)維持一個(gè)數(shù)據(jù)庫(kù),用于管理資源的元數(shù)據(jù)。
- 業(yè)務(wù)服務(wù)器端應(yīng)維持一個(gè)最終用戶的賬號(hào)信息數(shù)據(jù)庫(kù),因?yàn)槠吲2⒉回?fù)責(zé)管理最終用戶信息。
- 原則上客戶端和七牛云存儲(chǔ)之間的交互只有上傳和下載,不應(yīng)使用任何其他的API。