本文主要介绍如何基于STS服务在30分钟内快速搭建一个移动应用数据直传服务,让您的移动应用数据上传与下载直接对接OSS,仅需通过应用服务器管理控制信息,实现数据传输的高效与安全。
为什么选择直传服务
在移动互联的时代,手机App上传的数据越来越多。作为开发者,您可以利用OSS处理各种数据存储需求,从而更加专注于自己的应用逻辑。基于OSS的移动应用数据直传服务具有以下优势:
-
数据安全:使用灵活的权限管理机制进行数据的上传和下载,更加安全。
-
成本低廉:您不需要准备很多服务器。移动应用直接连接云存储OSS,只有控制流连接应用服务器。
-
高并发:轻松应对高并发访问,保证用户体验。
-
弹性扩容:存储空间随需扩展,满足业务增长需求。
-
数据处理:无缝集成图片处理与音视频转码功能,数据处理更灵活。
前提条件
如何进行移动应用直传
实现步骤如下:
-
移动应用向业务服务器请求临时访问凭证。
说明Android和iOS应用不能直接存储AccessKey,这样会存在数据泄露的风险。因此,应用可以向用户的应用服务器申请一个STS凭证。这个STS凭证是有时效性的,如果STS凭证的过期时间是30分钟(由应用服务器指定),那么在这30分钟里,该Android、iOS应用可以使用此Token从OSS上传和下载数据,30分钟后需要重新获取STS凭证。
-
业务服务器使用STS SDK调用AssumeRole接口,获取临时访问凭证。
-
STS生成并返回临时访问凭证给业务服务器。
-
业务服务器返回临时访问凭证给客户端。
-
移动应用使用OSS SDK通过该临时访问凭证上传文件到OSS。
-
OSS返回成功响应给客户端。
操作步骤
步骤一:开通STS服务并配置应用服务器
一、在访问控制创建RAM用户
首先,创建一个RAM用户,并获取对应的访问密钥,作为业务服务器的应用程序的长期身份凭证。
-
使用云账号或账号管理员登录RAM控制台。
-
在左侧导航栏,选择身份管理 > 用户。
-
单击创建用户。
-
输入登录名称和显示名称。
-
在访问方式区域下,选择使用永久 AccessKey 访问,然后单击确定。
RAM用户的AccessKey Secret只在创建时显示,后续不支持查看,请妥善保管。
-
单击操作下的复制,保存调用密钥(AccessKey ID和AccessKey Secret)。
二、在访问控制为RAM用户授予调用AssumeRole接口的权限
创建RAM用户后,需要授予RAM用户调用STS服务的AssumeRole接口的权限,使其可以通过扮演RAM角色来获取临时身份凭证。
-
在左侧导航栏,选择身份管理 > 用户。
-
在用户页面,找到目标RAM用户,然后单击RAM用户右侧的添加权限。
-
在新增授权页面,选择AliyunSTSAssumeRoleAccess系统策略。
说明授予RAM用户调用STS服务AssumeRole接口的固定权限是AliyunSTSAssumeRoleAccess,与后续获取临时访问凭证以及通过临时访问凭证发起OSS请求所需权限无关。
资源范围选择账号级别,然后单击确认新增授权。
-
单击确认新增授权。
三、在访问控制创建RAM角色
为当前云账号创建一个RAM角色,并获取对应的角色的ARN(Aliyun Resource Name,阿里云资源名称),用于RAM用户之后进行扮演。
-
在左侧导航栏,选择身份管理 > 角色。
-
单击创建角色,可信实体类型选择云账号。
-
选择当前云账号,单击确定。
-
填写角色名称,单击确定。
-
在RAM角色管理页面,单击复制,保存角色的ARN。
角色的 ARN 值格式为 acs:ram::<accountId>:role/oss-web-upload,其中 accountId 为当前云账号 ID。
四、在访问控制创建上传文件的权限策略
按照最小授权原则,为RAM角色创建一个自定义权限策略,限制只能向指定OSS的存储空间进行上传操作。
-
在左侧导航栏,选择权限管理 > 权限策略。
-
单击创建权限策略。
-
在创建权限策略页面,单击脚本编辑,将以下脚本中的
<Bucket名称>替换为准备工作中创建的Bucket名称web-direct-upload。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:<Bucket名称>/*" } ] } -
策略配置完成后,单击继续编辑基本信息。
-
在基本信息区域,填写策略名称,然后单击确定。
五、在访问控制为RAM角色授予权限
为RAM角色授予创建的自定义权限,以便该RAM角色被扮演时能获取所需的权限。
-
在左侧导航栏,选择身份管理 > 角色。
-
在角色页面,找到目标RAM角色,然后单击RAM角色右侧的新增授权。
-
在新增授权页面下,选择自定义策略,选择已创建的自定义权限策略。
其中资源范围选择账号级别,在策略类型下拉框中选择自定义策略进行筛选。
-
单击确定。
六、创建ECS实例作为业务服务器
创建一台ECS实例作为业务服务器,用于生成临时身份凭证。
在实际部署时,您可以将调用STS服务的接口集成到自己的业务服务器的接口中,而无需创建该ECS实例。
|
参数 |
示例值 |
|
付费类型 |
按量付费 |
|
地域 |
华东1(杭州) |
|
公网 IP |
分配公网 IPv4 地址 |
|
安全组 |
开放HTTP (TCP:80)端口 |
具体步骤,请参见控制台购买Linux实例并搭建Wordpress网站。
七、在业务服务器获取临时身份凭证
在Web应用中,通过在业务服务器集成STS SDK,实现一个获取临时STS身份凭证的接口。当这个接口(/get_sts_token)通过HTTP GET方法被访问时,它会生成一个临时身份凭证,并将其返回给请求者。
在ECS实例上,使用Flask框架快速搭建Web应用,实现一个获取临时STS身份凭证的接口的操作示例如下:
-
连接ECS实例。
具体操作,请参见控制台购买Linux实例并搭建Wordpress网站。
-
安装Python3。
-
创建项目文件夹,然后切换到项目目录。
mkdir my_web_sample cd my_web_sample -
安装依赖。
pip3 install Flask pip3 install attr pip3 install yarl pip3 install async_timeout pip3 install idna_ssl pip3 install attrs pip3 install aiosignal pip3 install charset_normalizer pip3 install alibabacloud_tea_openapi pip3 install alibabacloud_sts20150401 pip3 install alibabacloud_credentials -
编写后端代码。
-
创建一个
main.py文件。 -
在这个文件中,添加以下Python代码。
import json from flask import Flask, render_template from alibabacloud_tea_openapi.models import Config from alibabacloud_sts20150401.client import Client as Sts20150401Client from alibabacloud_sts20150401 import models as sts_20150401_models from alibabacloud_credentials.client import Client as CredentialClient app = Flask(__name__) # 将<YOUR_ROLE_ARN>替换为RAM角色的ARN。 role_arn_for_oss_upload = '<YOUR_ROLE_ARN>' # 设置为STS服务的地域,例如cn-hangzhou。 region_id = 'cn-hangzhou' @app.route("/") def hello_world(): return render_template('index.html') @app.route('/get_sts_token', methods=['GET']) def get_sts_token(): # 初始化 CredentialClient 时不指定参数,代表使用默认凭据链。 # 在本地运行程序时,可以通过环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET 指定 AK; # 在 ECS\ECI\容器服务上运行时,可以通过环境变量 ALIBABA_CLOUD_ECS_METADATA 来指定绑定的实例节点角色,SDK 会自动换取 STS 临时凭证。 config = Config(region_id=region_id, credential=CredentialClient()) sts_client = Sts20150401Client(config=config) assume_role_request = sts_20150401_models.AssumeRoleRequest( role_arn=role_arn_for_oss_upload, # 将<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称。 role_session_name='<YOUR_ROLE_SESSION_NAME>' ) response = sts_client.assume_role(assume_role_request) token = json.dumps(response.body.credentials.to_map()) return token app.run(host="127.0.0.1", port=8000) # 如果需要监听其他地址如0.0.0.0,需要您自行在服务端添加认证机制 -
将代码中的
<YOUR_ROLE_ARN>替换为第三步获取的角色ARN。 -
将代码中的
<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称,例如role_session_test。
-
-
使用第一步获取的访问密钥启动应用程序。
ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET> python3 main.py -
在浏览器中访问
http://<ECS实例公网IP地址>/get_sts_token。成功返回示例如下:
{"AccessKeyId": "STS.NUDRy4pc4PrizHtBYxxx", "AccessKeySecret": "H3gq6ZP2fsapnuDmGcRBxoVfiakxxx", "Expiration": "2024-05-07T09:05:19Z", "SecurityToken": "CAISywJ1q6Ft5B2yfSjIr5bxGcOAnbwV57CCeG7FplkGX9VYnqDliTz2IHhMf3ltAu0ftPUxnxxx"} -
按
Ctrl + C停止应用程序。
步骤二:下载并安装移动应用
Android
-
下载移动应用源码。
您可以通过此移动应用上传图片到OSS。上传的方法支持普通上传和断点续传。在网络环境差的情况下,推荐使用断点续传。您还可以利用图片处理服务,对要上传的图片进行缩略和加水印处理。
-
打开移动应用,配置应用参数
-
STS鉴权服务器:填写步骤一:配置应用服务器中部署的应用服务器地址。
-
上传Bucket:该移动应用要把数据上传到哪个Bucket。
-
区域:上传Bucket所在的地域。
-
-
点击设置。
iOS
-
下载移动应用源码。
您可以通过此移动应用上传图片到OSS。上传的方法支持普通上传和断点续传上传。在网络环境差的情况下,推荐使用断点续传上传。您还可以利用图片处理服务,对要上传的图片进行缩略和加水印处理。
-
打开移动应用,配置应用参数。
运行demo前,您需要在OSSTestMacros.h文件中配置必要参数。OSS_BUCKET_PRIVATE、OSS_ENDPOINT、OSS_STSTOKEN_URL。OSS_STSTOKEN_URL:配置为步骤1:配置应用服务器中部署的应用服务器地址。
#ifndef OSSTestMacros_h #define OSSTestMacros_h #define OSS_ACCESSKEY_ID @"AccessKeyID" // 子账号id #define OSS_SECRETKEY_ID @"AccessKeySecret" // 子账号secret #define OSS_BUCKET_PUBLIC @"public-bucket" // bucket名称 #define OSS_BUCKET_PRIVATE @"private-bucket" // bucket名称 #define OSS_ENDPOINT @"http://oss-cn-region.aliyuncs.com" // 访问的阿里云endpoint #define OSS_IMG_ENDPOINT @"http://img-cn-region.aliyuncs.com" // 旧版本图片服务的endpoint #define OSS_MULTIPART_UPLOADKEY @"multipart_key" // 分片上传的object key #define OSS_RESUMABLE_UPLOADKEY @"resumable_key" // 断点续传的object key #define OSS_CALLBACK_URL @"http://oss-demo.aliyuncs.com:23450" // 对象上传成功时回调的业务服务器地址 #define OSS_CNAME_URL @"http://www.cnametest.com/" // cname, 用于替换bucket.endpoint的访问域名 #define OSS_STSTOKEN_URL @"http://*.*.*.*:*/sts/getsts" // sts授权服务器的地址 #define OSS_IMAGE_KEY @"testImage.png" // 测试图片的名称 #define OSS_DOWNLOAD_FILE_NAME @"OSS_DOWNLOAD_FILE_NAME" // 用于下载的object key #endif /* OSSTestMacros_h */ -
运行该实例。
运行成功后,Demo 应用界面顶部展示已选图片预览,下方提供 imageName 输入框及 Select 按钮用于选取图片,Put 按钮上传图片,Get 按钮下载图片,GetResizeImage 按钮获取指定宽高的缩略图,Watermark 按钮添加水印文字,triggerCallback 触发回调,uploadBigFile 上传大文件,底部提供进度条及 download、cancel 按钮。
步骤三:体验移动应用直传服务
-
设置OSS的object名。点击上传,选择需要上传的图片。
-
上传成功后,通过控制台查看上传结果。