快速搭建移动应用直传服务__移动应用端直传实践_最佳实践_对象存储 OSS-阿里云
本教程帮助您在30分钟内搭建一个基于OSS的移动应用数据直传服务。所谓直传就是移动应用的数据的上传和下载直接连接OSS,只有控制流走用户自己的服务器。
背景
这是一个移动互联的时代,手机APP上传的数据越来越多。把数据存储的问题交给OSS,能够让开发者更加专注于自己的应用逻辑。
优势
搭建一个基于OSS的移动应用数据直传服务,具有以下优势:
- 安全的上传下载方式(临时、灵活的赋权鉴权)
- 成本低(用户不需要准备很多服务器,因为移动应用直联云存储,只有控制流走用户自己的应用服务器)
- 高并发,支持海量用户(OSS有海量的上传和下载带宽)
- 弹性(OSS有无限扩容的存储空间)
- 方便(可以方便的对接到媒体转码服务-视频多端适配,图片处理服务,CDN加速下载等)
架构图
详细可以参考这里。
角色解析
- Android/iOS 移动应用,即最终用户手机上的APP。
- OSS,即阿里云对象存储,负责存储APP上传的数据,可以参考官网介绍。
- RAM/STS负责生成临时上传凭证。
- 用户应用服务器,即提供该Android/iOS应用的开发者开发的APP后台服务,管理APP上传和下载的Token,以及用户在APP上传数据的元数据信息。
数据流解析
- 应用向用户的应用服务器申请一个临时上传凭证。
Android/iOS应用不可能直接存储AccessKeyID/AccessKeySecret,这样会存在泄密的风险。所以应用必须向用户的应用服务器申请一个临时上传凭证(下文将此临时上传凭证称为Token),注意这个Token是有时效性的,如这个Token的过期时间是30分钟(这个时间可以由应用服务器指定),那么在这30分钟里面,该Android/iOS应用可以使用这个Token从OSS上传和下载数据, 30分钟后再重新获取。 - 用户的应用服务器检测上述请求的合法性,然后返回Token给应用。
- 手机拿到这个Token后就可以将数据上传到OSS,或者从OSS下载数据了。
本教程主要介绍下述红色和蓝色框的内容。
- 蓝色框:应用服务器如何生成这个Token
- 红色框: Android/iOS应用如何获取Token
效果
本教程实现了一个APP,如下图所示。您可以扫描二维码,安装示例APP程序。此工具是用Android开发的,但是本教程的应用服务器搭建(即上述图蓝色框的内容)也适用于iOS。
示例程序的体验
示例程序的最终效果图如下:
- 应用服务器:该移动应用对应的后台应用服务器。本教程搭建了一个后台应用服务器:https://oss-demo.aliyuncs.com/app-server/sts.php。
上传Bucket:指的是该移动应用要把数据上传到哪个Bucket。
区域:指的是上传Bucket对应的区域。
示例APP的使用
单击选择图片,然后把文件上传到OSS。上传的方法支持普通上传和断点上传。注意在一些网络环境差的环境下,最好用断点上传。然后可以利用图片处理服务,对将要上传的图片进行缩略和加水印处理。初始使用请暂时先不要更改应用服务器地址和Bucket名字。
准备工作
搭建这样一个APP上传和下载的系统,需要完成以下准备工作:
- 开通OSS,并且创建Bucket,在这个例子里面的,对应的Bucket是:sdk-demo。创建Bucket的操作请参见 这里。
- 开通STS服务。开通STS服务是为了生成上述所描述的Token。具体请参见以下“为帐号开通STS服务”。
- 搭建一个应用服务器。这在个例子里,搭建的应用服务器的地址是:https://oss-demo.aliyuncs.com/app-server/sts.php 。
注意:这个例子是采用PHP编写的,用户也可以选择自己喜欢的语言进行编写,如Java 、Python、 Go、Ruby、Node.js、C#等。
为帐号开通STS服务
登录 OSS管理控制台。
单击 安全令牌 快捷配置。
进入到 安全令牌快捷配置 页面,注意如果没有开通RAM,会弹出开通的对话框。直接单击 开通,并进行实名验证。做完后跳到本页面。单击 开始授权。
系统进行自动授权,请务必保存下图中三个红框内的参数。
单击保存AK信息后,对话框会关闭。保存好下面红框中的结果3.
保存这三个参数后,STS的开通已经完成了。
注意如果您之前已经点击这个页面创建了AccessKeyId/AccessKeySecret, 弹出的页面如下:
单击如下图所示的查看。
单击如下图所示的创建AccessKey。
记下如下参数1、2。并记下如下参数3。
保存这三个参数后,STS的开通已经完成了。
应用服务器代码示例的下载
为了方便开发,本教程提供了三个语言的版本示例程序供您下载。
应用服务器示例的配置
每个语言包下载下来后,都会有一个配置文件config.json如下例:
{
"AccessKeyID" : "",
"AccessKeySecret" : "",
"RoleArn" : "",
"TokenExpireTime" : "900",
"PolicyFile": "policy/all_policy.txt"
}
下面对配置进行讲解:
- AccessKeyID: 填写上述图标红的参数1的内容。
- AccessKeySecret: 填写上述图标红的参数2的内容。
- RoleArn: 填写上述图标红的参数3的内容。
- TokenExpireTime: 指Android/iOS应用取到这个Token的失效时间,注意,最少是900s,默认值可以不修改。
- PolicyFile: 填写的是该Token所要拥有的权限列表的文件, 默认值可以不修改。
本教程准备了三种最常用token 权限文件,放于policy目录下面。分别是:- all_policy.txt:指定了该token拥有对该帐号下创建Bucket、删除Bucket、上传文件、下载文件、删除文件的权限 。
- bucket_read_policy.txt:指定了该token拥有该帐号下对指定Bucket的读权限。
- bucket_read_write_policy.txt: 指定了该token拥有该帐号下对指定Bucket的读写权限。
如果你想要指定这个Token只能对指定的bucket有读写权限, 请把(bucket_read_policy.txt、 bucket_read_write_policy.txt)这个文件里面$BUCKET_NAME直接替换成指定的bucket名字。
返回的格式解析:
{
"status":200,
"AccessKeyId":"STS.3pYjsdgdgagdasdg",
"AccessKeySecret":"rpnwO9kvEgetGdrddgsR2YrTtI",
"Security":"CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s˙∂˙∂3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVtbzI=",
"Expiration":"2015-12-12T07:49:09Z",
}
- status:表示获取Token的状态,获取成功时,返回值是200。
- AccessKeyId: 表示Android/iOS应用初始化OSSClient获取的 AccessKeyId。
- AccessKeySecret: 表示Android/iOS应用初始化OSSClient获取AccessKeySecret。
- SecurityToken:表示Android/iOS应用初始化的Token。
- Expiration: 表示该Token失效的时间。主要在Android SDK会自动判断是否失效,自动获取Token。注意上述这四个变量将构成了一个Token。
代码示例的运行方法
- 对于PHP版本,将包下载解压后,修改config.json这个文件,直接运行php sts.php 即能生成Token,将程序部署到指定的地址。
- 对于JAVA版本 (依赖于java 1.7),将包下载解压后,运行方法:java -jar oss-token-server.jar (port)。如果不指定port(端口), 直接运行java –jar oss-token-server.jar,程序会监听7080端口。如果想让程序执行在9000端口,运行java –jar oss-token-server.jar 9000 , 其他端口也类似。
体验自己的APP上传应用服务器
- 把程序部署起来后,记下应用服务器地址如
https://abc.com:8080
将示例程序里面的应用服务器修改成上述地址。 - 选择自己数据要上传到哪个Bcuket及区域,修改示例APP程序里面相应Bucket及区域。
- 单击设置按钮,将配置加载。
- 选择图片,设置上传OSS文件名,上传。然后就可以在Android上体验OSS服务了。这样你就能通Android 示例程序将数据直接上传到OSS了。
- 上传成功后,可以看一下数据是否在OSS上了。
核心代码解析:OSS初始化
下面讲解如何利用Android/iOS SDK跟自己的应用服务器,请求Token。
- Android版本
//初始化一个OssService用来上传
public OssService initOSS(String endpoint, String bucket, UIDisplayer displayer) {
OSSCredentialProvider credentialProvider;
//使用自己的获取STSToken的类
//从应用服务器控件里面读取应用服务器地址
String stsServer = ((EditText) findViewById(R.id.stsserver)).getText().toString();
//STSGetter类,封装如何跟从应用服务器取数据,必须继承于OSSFederationCredentialProvider这个类。 取Token这个取决于你所写的APP跟应用服务器数据的协议设计。
if (stsServer .equals("")) {
credentialProvider = new STSGetter();
}else {
credentialProvider = new STSGetter(stsServer);
}
//获取控件上的bucket名字
bucket = ((EditText) findViewById(R.id.bucketname)).getText().toString();
//初始化OSSClient
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
return new OssService(oss, bucket, displayer);
}
- iOS版本
// 初始化一个OSSClient实例
- (void)ossInit {
// 构造一个获取STSToken的凭证提供器
id<OSSCredentialProvider> credential = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * {
// 实现一个函数,同步返回从server获取到的STSToken
return [self getFederationToken];
}];
// 用endpoint、凭证提供器初始化一个OSSClient
client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];
}
核心代码解析:移动应用从应用服务器取Token
具体APP从应用服务器取Token的方法,必须写到public OSSFederationToken getFederationToken() { }
这个函数里面。注意这个函数的逻辑依赖于可以自己设定,但是最终结果必须返回这样一个变量 return new OSSFederationToken(ak, sk, token, expiration)
,其中ak, sk, token, expiration 必须是从应用服务器返回的Body获取的。
在本例子里,示例如下。注意用户可以自定义自己的移动应用跟自己应用服务器之前的协议。
- Android版本
public OSSFederationToken getFederationToken() {
String stsJson;
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(stsServer).build();
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
stsJson = response.body().string();
} else {
throw new IOException("Unexpected code " + response);
}
}
catch (IOException e) {
e.printStackTrace();
Log.e("GetSTSTokenFail", e.toString());
return null;
}
try {
JSONObject jsonObjs = new JSONObject(stsJson);
String ak = jsonObjs.getString("AccessKeyId");
String sk = jsonObjs.getString("AccessKeySecret");
String token = jsonObjs.getString("SecurityToken");
String expiration = jsonObjs.getString("Expiration");
return new OSSFederationToken(ak, sk, token, expiration);
}
catch (JSONException e) {
Log.e("GetSTSTokenFail", e.toString());
e.printStackTrace();
return null;
}}
- iOS版本
NSURL * url = [NSURL URLWithString:STSServer];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource];
NSURLSession * session = [NSURLSession sharedSession];
NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
[tcs setError:error];
return;
}
[tcs setResult:data];
}];
[sessionTask resume];
// 实现这个回调需要同步返回Token,所以要waitUntilFinished
[tcs.task waitUntilFinished];
if (tcs.task.error) {
// 如果网络请求出错,返回nil表示无法获取到Token。该次请求OSS会失败。
return nil;
} else {
// 从网络请求返回的内容中解析JSON串拿到Token的各个字段,组成STSToken返回
NSDictionary * object = [NSJSONSerialization JSONObjectWithData:tcs.task.result
options:kNilOptions
error:nil];
OSSFederationToken * token = [OSSFederationToken new];ni
token.tAccessKey = [object objectForKey:@"AccessKeyId"];
token.tSecretKey = [object objectForKey:@"AccessKeySecret"];
token.tToken = [object objectForKey:@"SecurityToken"];
token.expirationTimeInGMTFormat = [object objectForKey:@"Expiration"];
return token;
}
示例程序的实现
应用服务器代码示例的下载
最后更新:2016-11-23 16:04:09
上一篇:
云端数据处理__开发人员指南_对象存储 OSS-阿里云
下一篇:
权限控制__移动应用端直传实践_最佳实践_对象存储 OSS-阿里云
LoginProfile__数据类型_RAM API文档_访问控制-阿里云
修改查询删除伸缩规则__伸缩规则_用户指南_弹性伸缩-阿里云
修改期望虚拟机数量__SDK接口说明_Java版SDK_批量计算-阿里云
充储值卡返券规则是什么?___储值卡_代金券及推荐码_财务-阿里云
智能客服__阿里云ET介绍-阿里云
容器服务监控__云服务监控_用户指南_云监控-阿里云
SecurityGroupIdSetType__数据类型_API 参考_云服务器 ECS-阿里云
测试报告阶段__性能测试流程体系_性能测试体系_性能测试-阿里云
NAT网关__网关_用户指南_专有网络 VPC-阿里云
执行伸缩规则__触发任务_用户指南_弹性伸缩-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云