本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文主要介绍如何基于STS Policy的使用规则在30分钟内搭建一个移动应用数据直传服务。直传指的是移动应用数据的上传和下载直接连接OSS,只有控制流连接自己的服务器。
前提条件
背景信息
在移动互联的时代,手机App上传的数据越来越多。作为开发者,您可以利用OSS处理各种数据存储需求,从而更加专注于自己的应用逻辑。
基于OSS的移动应用数据直传服务具有以下优势:
数据安全:使用灵活的授权和鉴权方式进行数据的上传和下载,更加安全。
成本低廉:您不需要准备很多服务器。移动应用直接连接云存储OSS,只有控制流连接应用服务器。
高并发:支持海量用户并发访问。
弹性扩容:无限扩容的存储空间。
数据处理:和图片处理以及音视频转码搭配使用,方便灵活地进行数据处理。
流程介绍
移动应用直传服务的开发流程如下:
角色分析如下:
Android/iOS 移动应用:即最终用户手机上的App,负责从应用服务器申请及使用STS凭证。
OSS:即阿里云对象存储,负责处理移动应用的数据请求。
RAM/STS:负责生成临时上传凭证,即Token。
应用服务器:即提供该Android/iOS应用的开发者开发的App后台服务,用于管理App上传和下载的Token,以及用户通过App上传数据的元数据。
实现步骤如下:
移动应用向应用服务器申请一个临时上传凭证。
Android和iOS应用不能直接存储AccessKey,这样会存在数据泄露的风险。所以应用必须向用户的应用服务器申请一个Token。这个Token是有时效性的,如果Token的过期时间是30分钟(由应用服务器指定),那么在这30分钟里,该Android、iOS应用可以使用此Token从OSS上传和下载数据,30分钟后需要重新获取Token。
应用服务器检测上述请求的合法性,然后返回Token给移动应用。
Android、iOS移动应用使用此Token将数据上传到OSS,或者从OSS下载数据。
以下介绍应用服务器如何生成Token以及Android、iOS移动应用如何获取Token。
操作步骤
步骤1:开通STS服务并配置应用服务器
快速部署
您可以使用资源编排ROS开通STS服务并一键配置1个云服务器ECS实例,然后在云服务器ECS实例上部署应用服务器源码。使用资源编排ROS快速开通STS服务并配置应用服务器的操作步骤如下。
打开一键配置模板链接。
在资源编排 ROS控制台,输入资源栈名称,设置新购ECS的可用区、实例类型、系统盘类型、实例密码,然后单击创建。
资源栈的资源栈信息页签下的状态显示创建中。
资源栈的状态显示创建成功后,单击输出页签,查看一键部署的云服务器ECS实例。
手动部署
登录OSS管理控制台。
单击左侧导航栏的概览。
在大家都在用区域,单击 。
单击开始授权。并按照提示完成授权。
授权完成后,保存RAM用户的AccessKey ID、AccessKey Secret和RoleArn三个参数。
下载并解压应用服务器代码。
PHP
Java
Ruby
Node.js
Go
修改配置文件config.json。
配置文件示例如下:
{ "AccessKeyID" : "", "AccessKeySecret" : "", "RoleArn" : "", "TokenExpireTime" : "900", "PolicyFile": "policy/bucket_write_policy.txt" }
参数说明如下:
参数
说明
AccessKeyID
填写您记录的AccessKey ID。
AccessKeySecret
填写您记录的AccessKey Secret。
RoleArn
填写您记录的RoleArn。
TokenExpireTime
表示Android、iOS应用获取到的Token的失效时间,最小值和默认值均为900s。
PolicyFile
Token所拥有的权限列表的文件,可保留默认值。
policy目录下提供了以下两种最常用的Token权限文件:
bucket_read_policy.txt:指定该Token拥有该账号下指定Bucket及指定前缀的读权限。
bucket_write_policy.txt:指定该Token拥有该账号下指定Bucket及指定前缀的写权限。
使用Token权限文件时,需要把相应的权限文件中的
$BUCKET_NAME
(Bucket名称)和$OBJECT_PREFIX
(文件前缀)替换成指定的值。如果您需要设置不同场景下的Policy,请参见RAM Policy概述中的Policy示例和构建方法。
警告请务必根据业务需要,按照最小权限原则进行授权。如果您直接授予所有资源(resource:*),或者所有操作(action:*)权限,则存在由于权限范围过大导致的数据安全风险。
本代码示例仅供参考,实际业务务必根据不同用户或设备进行权限隔离,生成带有不同权限的Token。
运行示例代码。
PHP
运行以下命令,生成Token。
php sts.php
将程序部署到指定的应用服务器地址。
Java
说明Java依赖为1.7。
运行以下命令,启动服务。
java -jar app-token-server.jar (port)
如果不指定port(端口),默认监听7080端口。支持自定义需要监听的端口,但不允许与已有的端口重复。
调用AssumeRole返回结果。
返回结果解析如下:
// 正确返回。 { // 获取Token的状态,获取成功时,返回值是200。 "StatusCode":200, // Android、iOS移动应用初始化OSSClient获取的AccessKey ID。 "AccessKeyId":"STS.3p***dgagdasdg", // Android、iOS移动应用初始化OSSClient获取的AccessKey Secret。 "AccessKeySecret":"rpnwO9***tGdrddgsR2YrTtI", // Android、iOS移动应用初始化OSSClient获取的Token。 "SecurityToken":"CAES+wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s˙∂˙∂3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc+mRR9KAbHUefqH+rdjZqjTF7p2m1wJXP8S6k+G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVt****", // 该Token失效的时间。Android SDK会自动判断Token是否失效,如果失效,会重新自动获取Token。 "Expiration":"2017-12-12T07:49:09Z" } // 错误返回。 { // 获取Token的状态。获取失败时,返回值是500。 "StatusCode":500, // 错误原因。 "ErrorCode":"InvalidAccessKeyId.NotFound", // 错误描述。 "ErrorMessage":"Specified access key is not found." }
步骤2:下载并安装移动应用
下载移动应用源码。
打开移动应用,配置应用参数。
应用服务器:填写步骤1:配置应用服务器中部署的应用服务器地址。
上传Bucket:该移动应用要把数据上传到哪个Bucket。
区域:上传Bucket所在的地域。
OSS文件名:需要包含应用服务器Policy配置文件里指定的前缀。
单击设置。
步骤3:体验移动应用直传服务
打开移动应用。
单击选择图片,选择需要上传的图片,并设置OSS文件名。
上传成功后,通过控制台查看上传结果。
核心代码解析
OSS初始化的代码解析如下。
Android
// 推荐使用OSSAuthCredentialsProvider,Token过期后会自动刷新。
String stsServer = "应用服务器地址,例如https://example.com:8080"
OSSCredentialProvider credentialProvider = new OSSAuthCredentialsProvider(stsServer);
// 完成以下配置项。
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);
iOS
OSSClient * client;
...
// 推荐使用OSSAuthCredentialProvider,Token过期后会自动刷新。
id<OSSCredentialProvider> credential = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:@"应用服务器地址,例如https://example.com:8080"];
client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];
- 本页导读 (1)