快速搭建移動(dòng)應(yīng)用直傳服務(wù)
時(shí)間:2019-02-14 17:28:48 閱讀:65067次
分類(lèi):常見(jiàn)問(wèn)題
本文主要介紹如何基于sts policy的使用規(guī)則在30分鐘內(nèi)搭建一個(gè)移動(dòng)應(yīng)用數(shù)據(jù)直傳服務(wù)。直傳指的是移動(dòng)應(yīng)用數(shù)據(jù)的上傳和下載直接連接oss,只有控制流...
本文主要介紹如何基于STS Policy的使用規(guī)則在30分鐘內(nèi)搭建一個(gè)移動(dòng)應(yīng)用數(shù)據(jù)直傳服務(wù)。直傳指的是移動(dòng)應(yīng)用數(shù)據(jù)的上傳和下載直接連接OSS,只有控制流連接自己的服務(wù)器。
背景
在移動(dòng)互聯(lián)的時(shí)代,手機(jī)app上傳的數(shù)據(jù)越來(lái)越多。作為開(kāi)發(fā)者,您可以利用OSS處理各種數(shù)據(jù)存儲(chǔ)需求,從而更加專(zhuān)注于自己的應(yīng)用邏輯。
基于OSS的移動(dòng)應(yīng)用數(shù)據(jù)直傳服務(wù)具有以下優(yōu)勢(shì):
-
數(shù)據(jù)安全:使用靈活的授權(quán)和鑒權(quán)方式進(jìn)行數(shù)據(jù)的上傳和下載,更加安全。
-
成本低廉:您不需要準(zhǔn)備很多服務(wù)器。移動(dòng)應(yīng)用直接連接云存儲(chǔ)OSS,只有控制流連接應(yīng)用服務(wù)器。
-
高并發(fā):支持海量用戶并發(fā)訪問(wèn)。
-
彈性擴(kuò)容:無(wú)限擴(kuò)容的存儲(chǔ)空間。
-
數(shù)據(jù)處理:和圖片處理以及音視頻轉(zhuǎn)碼搭配使用,方便靈活地進(jìn)行數(shù)據(jù)處理。
下載并安裝移動(dòng)應(yīng)用
移動(dòng)應(yīng)用源碼的下載地址如下:
您可以通過(guò)此移動(dòng)應(yīng)用上傳圖片到OSS。上傳的方法支持普通上傳和斷點(diǎn)續(xù)傳上傳。在網(wǎng)絡(luò)環(huán)境差的情況下,推薦使用斷點(diǎn)續(xù)傳上傳。您還可以利用圖片處理服務(wù),對(duì)要上傳的圖片進(jìn)行縮略和加水印處理。示例應(yīng)用的最終效果圖如下:
-
應(yīng)用服務(wù)器:該移動(dòng)應(yīng)用對(duì)應(yīng)的后臺(tái)應(yīng)用服務(wù)器。請(qǐng)使用步驟2:下載應(yīng)用服務(wù)器代碼示例中提供的應(yīng)用服務(wù)器代碼示例,部署自己的應(yīng)用服務(wù)器。
-
上傳Bucket:該移動(dòng)應(yīng)用要把數(shù)據(jù)上傳到哪個(gè)Bucket。
-
區(qū)域:上傳Bucket所在的地域。
原理介紹
移動(dòng)應(yīng)用直傳服務(wù)的開(kāi)發(fā)流程圖如下:
角色分析如下:
-
Android/iOS 移動(dòng)應(yīng)用:即最終用戶手機(jī)上的app,負(fù)責(zé)從應(yīng)用服務(wù)器申請(qǐng)及使用STS憑證。
-
OSS:即阿里云對(duì)象存儲(chǔ),負(fù)責(zé)處理移動(dòng)應(yīng)用的數(shù)據(jù)請(qǐng)求。
-
RAM/STS:負(fù)責(zé)生成臨時(shí)上傳憑證,即Token。
-
應(yīng)用服務(wù)器:即提供該Android/iOS應(yīng)用的開(kāi)發(fā)者開(kāi)發(fā)的app后臺(tái)服務(wù),用于管理app上傳和下載的Token,以及用戶通過(guò)app上傳數(shù)據(jù)的元信息。
實(shí)現(xiàn)步驟如下:
-
移動(dòng)應(yīng)用向應(yīng)用服務(wù)器申請(qǐng)一個(gè)臨時(shí)上傳憑證。
說(shuō)明 Android和iOS應(yīng)用不能直接存儲(chǔ)AccessKey,這樣會(huì)存在數(shù)據(jù)泄露的風(fēng)險(xiǎn)。所以應(yīng)用必須向用戶的應(yīng)用服務(wù)器申請(qǐng)一個(gè)Token。這個(gè)Token是有時(shí)效性的,如果Token的過(guò)期時(shí)間是30分鐘(由應(yīng)用服務(wù)器指定),那么在這30分鐘里,該Android/iOS應(yīng)用可以使用此Token從OSS上傳和下載數(shù)據(jù), 30分鐘后需要重新獲取Token。
-
應(yīng)用服務(wù)器檢測(cè)上述請(qǐng)求的合法性,然后返回Token給移動(dòng)應(yīng)用。
-
Android/iOS移動(dòng)應(yīng)用使用此Token將數(shù)據(jù)上傳到OSS,或者從OSS下載數(shù)據(jù)。
以下介紹應(yīng)用服務(wù)器如何生成Token以及Android/iOS移動(dòng)應(yīng)用如何獲取Token。
步驟1:創(chuàng)建Bucket并開(kāi)通STS服務(wù)
-
開(kāi)通OSS,并且創(chuàng)建Bucket。
-
開(kāi)通STS服務(wù)。
-
登錄OSS管理控制臺(tái)。
-
在OSS概覽頁(yè)中找到基礎(chǔ)配置區(qū)域,單擊安全令牌。
-
進(jìn)入到安全令牌快捷配置頁(yè)面,單擊開(kāi)始授權(quán)。
說(shuō)明 如果沒(méi)有開(kāi)通RAM,會(huì)彈出開(kāi)通的對(duì)話框。單擊 開(kāi)通。開(kāi)通完成后單擊 開(kāi)始授權(quán)。
-
系統(tǒng)進(jìn)行自動(dòng)授權(quán)。請(qǐng)保存AccessKeyID、AccessKeySecret和RoleArn三個(gè)參數(shù)。
-
如果您未創(chuàng)建過(guò)AccessKey,系統(tǒng)自動(dòng)創(chuàng)建AccessKey。請(qǐng)保存AccessKeyId、AccessKeySecret和RoleArn,如下圖所示。
-
如果您之前已經(jīng)創(chuàng)建過(guò)AccessKey,也可以單擊如下圖所示的查看創(chuàng)建新的AccessKey。
步驟2:下載應(yīng)用服務(wù)器代碼示例
步驟3:修改配置文件
以下例子采用PHP編寫(xiě)。每個(gè)語(yǔ)言的示例代碼下載后,都會(huì)有一個(gè)配置文件config.json,如下所示:
{ "AccessKeyID" : "", "AccessKeySecret" : "", "RoleArn" : "", "TokenExpireTime" : "900", "PolicyFile": "policy/all_policy.txt" }
相關(guān)參數(shù)說(shuō)明如下:
-
AccessKeyID:填寫(xiě)之前記錄的AccessKeyID。
-
AccessKeySecret:填寫(xiě)之前記錄的AccessKeySecret。
-
RoleArn:填寫(xiě)之前記錄的RoleArn。
-
TokenExpireTime:指Android/iOS應(yīng)用獲取到的Token的失效時(shí)間,最小值和默認(rèn)值均為900s。
-
PolicyFile:該Token所擁有的權(quán)限列表的文件,可使用默認(rèn)值。
說(shuō)明
代碼示例中提供了三種最常用的Token權(quán)限文件,位于policy目錄下面。分別是:
-
all_policy.txt:指定該Token擁有該賬號(hào)下的所有權(quán)限,包括:
-
創(chuàng)建Bucket
-
刪除Bucket
-
上傳文件
-
下載文件
-
刪除文件
-
bucket_read_policy.txt:指定該Token擁有該賬號(hào)下指定Bucket的讀權(quán)限。
-
bucket_read_write_policy.txt:指定了該Token擁有該賬號(hào)下指定Bucket的讀寫(xiě)權(quán)限。
如果您想要指定該Token只對(duì)指定的Bucket有讀寫(xiě)權(quán)限, 請(qǐng)把bucket_read_policy.txt和bucket_read_write_policy.txt文件里的$BUCKET_NAME替換成指定的Bucket名稱。
步驟4:運(yùn)行示例代碼
代碼示例的運(yùn)行方法如下:
-
對(duì)于PHP版本,將包下載解壓后,修改config.json文件,直接運(yùn)行php sts.php即能生成Token,將程序部署到指定的應(yīng)用服務(wù)器地址。
-
對(duì)于Java版本(依賴于java 1.7),將包下載解壓后,修改config.json文件,重新打包并運(yùn)行java -jar app-token-server.jar (port)。如果不指定port(端口),直接運(yùn)行java -jar app-token-server.jar,程序會(huì)監(jiān)聽(tīng)7080端口。
返回的數(shù)據(jù)格式解析如下:
{ "StatusCode":200, "AccessKeyId":"STS.3p***dgagdasdg", "AccessKeySecret":"rpnwO9***tGdrddgsR2YrTtI", "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s˙?˙?3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVtbzI=", "Expiration":"2017-12-12T07:49:09Z",
} { "StatusCode":500, "ErrorCode":"InvalidAccessKeyId.NotFound", "ErrorMessage":"Specified access key is not found." }
正確返回的五個(gè)變量構(gòu)成一個(gè)Token:
-
StatusCode:獲取Token的狀態(tài),獲取成功時(shí),返回值是200。
-
AccessKeyId:Android/iOS移動(dòng)應(yīng)用初始化OSSClient獲取的 AccessKeyId。
-
AccessKeySecret:Android/iOS移動(dòng)應(yīng)用初始化OSSClient獲取AccessKeySecret。
-
SecurityToken:Android/iOS移動(dòng)應(yīng)用初始化的Token。
-
Expiration:該Token失效的時(shí)間。Android SDK會(huì)自動(dòng)判斷Token是否失效,如果失效,則自動(dòng)獲取Token。
錯(cuò)誤返回說(shuō)明如下:
-
StatusCode:表示獲取Token的狀態(tài),獲取失敗時(shí),返回值是500。
-
ErrorCode:表示錯(cuò)誤原因。
-
ErrorMessage:表示錯(cuò)誤的具體信息描述。
步驟5:體驗(yàn)移動(dòng)應(yīng)用直傳服務(wù)
-
部署程序后,記下應(yīng)用服務(wù)器地址如
http://abc.com:8080
,將示例程序里面的應(yīng)用服務(wù)器修改成上述地址。
-
選擇數(shù)據(jù)要上傳到哪個(gè)Bcuket及地域,修改示例程序里相應(yīng)的上傳Bucket及區(qū)域。
-
單擊設(shè)置,加載配置。
-
選擇圖片,設(shè)置上傳OSS文件名,上傳圖片。
-
上傳成功后,通過(guò)控制臺(tái)查看上傳結(jié)果。
核心代碼解析
OSS初始化的代碼解析如下:
-
Android版本
String stsServer = "應(yīng)用服務(wù)器地址,例如http://abc.com:8080" OSSCredentialProvider credentialProvider = new OSSAuthCredentialsProvider(stsServer); ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); conf.setSocketTimeout(15 * 1000); conf.setMaxConcurrentRequest(5); conf.setMaxErrorRetry(2); OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
-
iOS版本
OSSClient * client;
...
// 推薦使用OSSAuthCredentialProvider,token過(guò)期后會(huì)自動(dòng)刷新。
id<OSSCredentialProvider> credential = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:@"應(yīng)用服務(wù)器地址,例如http://abc.com:8080"];
client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];
蕪湖市聰明屋智能科技有限公司(原中江網(wǎng)絡(luò)),成立于2005年,經(jīng)過(guò)10多年定制開(kāi)發(fā)經(jīng)驗(yàn),積累了大量技術(shù)儲(chǔ)備和定制開(kāi)發(fā)經(jīng)驗(yàn),率先創(chuàng)建安徽省內(nèi)自主研發(fā)的云計(jì)算平臺(tái),具有大數(shù)據(jù)、高并發(fā)等高強(qiáng)度計(jì)算能力,為眾多政府、學(xué)校、公安部門(mén)、中小企業(yè)解決數(shù)據(jù)計(jì)算與管理難題。2013年公司內(nèi)部專(zhuān)門(mén)創(chuàng)建電商服務(wù)部,為企業(yè)提供全方位電商解決方案與配套服務(wù)。多次獲得國(guó)家、省市級(jí)領(lǐng)導(dǎo)接見(jiàn),被國(guó)內(nèi)近20家電視臺(tái)、報(bào)紙媒體爭(zhēng)相報(bào)道。至今,聰明屋智能科技服務(wù)過(guò)上市公司、大型國(guó)企、各類(lèi)私企超800家,為多家公司提供各類(lèi)政務(wù)系統(tǒng)、app開(kāi)發(fā)定制、微信小程序開(kāi)發(fā)定制、智能家居、電商系統(tǒng)、連鎖收銀等技術(shù)解決方案服務(wù)。同時(shí),聰明屋智能科技在智能硬件方面、區(qū)塊鏈應(yīng)用方面持續(xù)投入關(guān)注及創(chuàng)新。