最近更新时间:2023-10-25
通常情况下,对象存储桶和对象都是私有的。如果希望第三方用户可以上传对象到存储桶或从桶中下载对象,可以通过安全令牌服务 (Security Token Service, STS) 授权临时的AccessKey、SecretKey和Token,以实现对对象存储的操作。
STS为紫光云提供的临时访问权限管理服务。其优势如下:
您无需将长期密钥(AccessKey和SecretKey)透漏给第三方应用,只需生成一个临时的访问令牌并将令牌交给第三方用户。
您可以自定义这个令牌的访问权限及有效期限,访问令牌过期后会自动失效。
注意:
正式AK/SK只能用于业务层使用,请勿将其直接交给第三方用户,导致信息泄露。
正式AK/SK用户主体为业务服务器,第三方终端用户对应的信息应由业务服务器自己维护。
示例项目使用Gradle管理,执行gradle build即可编译。
设置AccessKey、SecretKey、Endpoint和Region
String accessKey = "******"; String secretKey = "******"; AWSStaticCredentialsProvider credential = new AWSStaticCredentialsProvider( new BasicAWSCredentials(accessKey, secretKey)); EndpointConfiguration endpoint = new EndpointConfiguration("http://sts-beijing.unicloudsrv.com", "cn-beijing-1"); |
AccessKey和SecretKey可以从“ 紫光云控制台 > 用户中心 > 安全信息管理”处获取。
Region测试可直接使用"cn-beijing-1",无需修改。
Endpoint地址区分内外网,若由北京节点访问可使用内网域名“sts-beijing- internal.unicloudsrv.com”,否则请使用公网域名“sts-beijing.unicloudsrv.com”。
创建STS Service Client
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard() .withEndpointConfiguration(endpoint) .build(); |
创建GetFederationTokenRequest
// withName: 填写您系统内的用户名,长度2-32字节 // withPolicy: 请按照样例完整填写 // withDurationSeconds: 临时Token有效时间,单位为秒,最短900秒,最长129600秒 GetFederationTokenRequest request = new GetFederationTokenRequest().withName("Bob") .withPolicy("{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Sid1\",\"Effect\":\"Allow\",\"Action\":[\"s3:*\"],\"Resource\":[\"*\"]}]}") .withDurationSeconds(3600); GetFederationTokenResult response = stsClient.getFederationToken(request); |
获得临时令牌,包含AccessKeyId、SecretAccessKey和SessionToken
Credentials tempCredential = response.getCredentials(); System.out.println(tempCredential.getAccessKeyId()); System.out.println(tempCredential.getSecretAccessKey()); System.out.println(tempCredential.getSessionToken()); } catch(AmazonServiceException e) { e.printStackTrace(); } catch(SdkClientException e) { e.printStackTrace(); } } } |
分别介绍通过IOS系统、Andriod系统和Web页面进行上传和下载的示例。
安装CocoaPods :http://cocoapods.org
在项目目录执行 pod install
从APP后端获取可用的临时密钥: AccessKey、SecretKey和SessionToken
Swift方式:
let endpoint = AWSEndpoint.init(urlString: "https://oss-cn-north-2.unicloudsrv.com") // 紫光云北京节点 |
Objective-C方式:
AWSEndpoint *endpoint = [[AWSEndpoint alloc] initWithURLString:@"https://oss-cn-north-2.unicloudsrv.com"]; // 紫光云北京节点 |
配置AWS Service Manager
Swift方式:
let configuration = AWSServiceConfiguration.init( |
Objective-C方式:
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] |
获取Transfer Utility
Swift方式:
let transferUtility = AWSS3TransferUtility.default() |
Objective-C方式:
AWSS3TransferUtility *transferUtility = [AWSS3TransferUtility defaultS3TransferUtility]; |
使用Transfer Utility进行上传下载
Swift方式:
transferUtility.uploadData( |
Objective-C方式:
[[transferUtility downloadDataFromBucket:S3BucketName |
示例项目使用Gradle管理,执行gradle build即可编译。
从APP后端获取可用的临时密钥: AccessKey、SecretKey和SessionToken
String accessKey = "******"; |
初始化S3 Client
AWSCredentials credential = new BasicSessionCredentials( |
初始化Transfer Utility
sTransferUtility = TransferUtility.builder() |
使用Transfer Utility进行上传下载
TransferObserver observer = transferUtility.upload( |
aws-sdk-2.664.0.min.js的获取请参考https://github.com/aws/aws-sdk-js、https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html
<script src="aws-sdk-2.664.0.min.js"></script> <script type="text/javascript"> function openInput() { console.log("openInput") document.getElementById("file").click(); } function upload() { console.log("upload") AWS.config.endpoint = "http://s3.test.com:9090" AWS.config.region = "cn-beijing-1" AWS.config.accessKeyId = "******" AWS.config.secretAccessKey = "*********" AWS.config.sessionToken = "AQ2hkbs76rpyvG014H3FyVOi+Kd2KbZ1MG/puM7/TUh10ycSexcsKJ3NTJ6MA7vw84qXSP52oQzWuejacuKjFkEdx5btFYuBYQeqZB/Rq/0r/bt93HipnFL+MgcMd8vNAtFyFyvaifVdj8KP1s8rsSV3W/PGD/76VIiIF5YnsdQdUbzURecvrzFaKSKFFriLF4aEj6q1TEbGv6R8Kpxp5OAxg0SkCAsfe6YR" AWS.config.s3ForcePathStyle = true s3 = new AWS.S3()
let files = document.getElementById("file").files if (!files.length) { return alert("Please choose a file to upload first.") } let file = files[0] let params = { Bucket: 'test1', Key: file.name, Body: file } s3.putObject(params, function(err, data) { if (err) { console.log(err, err.stack) } else { alert("upload "+ file.name + " success") } }) } </script> |