582
阿里云
授权访问__Java-SDK_SDK 参考_对象存储 OSS-阿里云
使用STS服务临时授权
介绍
OSS可以通过阿里云STS服务,临时进行授权访问。阿里云STS (Security Token Service) 是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或联邦用户(用户身份由您自己管理)颁发一个自定义时效和权限的访问凭证。第三方应用或联邦用户可以使用该访问凭证直接调用阿里云产品API,或者使用阿里云产品提供的SDK来访问云产品API。
- 您不需要透露您的长期密钥(AccessKey)给第三方应用,只需要生成一个访问令牌并将令牌交给第三方应用即可。这个令牌的访问权限及有效期限都可以由您自定义。
- 您不需要关心权限撤销问题,访问令牌过期后就自动失效。
以APP应用为例,交互流程如下图:
方案的详细描述如下:
- App用户登录。App用户身份是客户自己管理。客户可以自定义身份管理系统,也可以使用外部Web账号或OpenID。对于每个有效的App用户来说,AppServer是可以确切地定义出每个App用户的最小访问权限。
- AppServer请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,AppServer需要确定App用户的最小访问权限(用Policy语法描述)以及授权的过期时间。 然后通过调用STS的AssumeRole(扮演角色)接口来获取安全令牌。角色管理与使用相关内容请参考《RAM使用指南》中的角色管理。
- STS返回给AppServer一个有效的访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)以及过期时间。
- AppServer将访问凭证返回给ClientApp。ClientApp可以缓存这个凭证。当凭证失效时,ClientApp需要向AppServer申请新的有效访问凭证。比如,访问凭证有效期为1小时,那么ClientApp可以每30分钟向AppServer请求更新访问凭证。
- ClientApp使用本地缓存的访问凭证去请求Aliyun Service API。云服务会感知STS访问凭证,并会依赖STS服务来验证访问凭证,并正确响应用户请求。
STS安全令牌详情,请参考《RAM使用指南》中的角色管理。关键是调用STS服务接口AssumeRole来获取有效访问凭证即可。也可以直接使用STS SDK来调用该方法,点击查看
使用STS凭证构造签名请求
用户的client端拿到STS临时凭证后,通过其中安全令牌(SecurityToken)以及临时访问密钥(AccessKeyId, AccessKeySecret)生成OSSClient。以上传Object为例:
String accessKeyId = "<accessKeyId>";
String accessKeySecret = "<accessKeySecret>";
String securityToken = "<securityToken>"
// 以杭州为例
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
使用URL签名授权访问
生成签名URL
通过生成签名URL的形式提供给用户一个临时的访问URL。在生成URL时,您可以指定URL过期的时间,从而限制用户长时间访问。
生成一个签名的URL
代码如下:
String bucketName = "your-bucket-name";
String key = "your-object-key";
// 设置URL过期时间为1小时
Date expiration = new Date(new Date().getTime() + 3600 * 1000);
// 生成URL
URL url = client.generatePresignedUrl(bucketName, key, expiration);
生成的URL默认以GET方式访问,这样,用户可以直接通过浏览器访问相关内容。
生成其他Http方法的URL
如果您想允许用户临时进行其他操作(比如上传,删除Object),可能需要签名其他方法的URL,如下:
// 生成PUT方法的URL
URL url = client.generatePresignedUrl(bucketName, key, expiration, HttpMethod.PUT);
通过传入 HttpMethod.PUT 参数,用户可以使用生成的URL上传Object。
添加用户自定义参数(UserMetadata)
如果您想生成签名的URL来上传Object,并指定UserMetadata,Content-Type等头信息,可以这样做:
// 创建请求
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key);
// HttpMethod为PUT
generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
// 添加UserMetadata
generatePresignedUrlRequest.addUserMetadata("author", "baymax");
// 添加Content-Type
request.setContentType("application/octet-stream");
// 生成签名的URL
URL url = client.generatePresignedUrl(generatePresignedUrlRequest);
需要注意的是,上述过程只是生成了签名的URL,您仍需要在request header中添加meta的信息。可以参考下面的代码。
使用签名URL发送请求
现在java SDK支持put object和get object两种方式的URL签名请求。
使用URL签名的方式getobject
//服务器端生成url签名字串
OSSClient Server = new OSSClient(endpoint, accessId, accessKey);
Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2015 14:20:00 GMT");
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET);
//设置过期时间
request.setExpiration(expiration);
// 生成URL签名(HTTP GET请求)
URL signedUrl = Server .generatePresignedUrl(request);
System.out.println("signed url for getObject: " + signedUrl);
//客户端使用使用url签名字串发送请求
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
Map<String, String> customHeaders = new HashMap<String, String>();
// 添加GetObject请求头
customHeaders.put("Range", "bytes=100-1000");
OSSObject object = client.getObject(signedUrl,customHeaders);
使用URL签名的方式putobject
//服务器端生成url签名字串
OSSClient Server = new OSSClient(endpoint, accessKeyId, accessKeySecret);
Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2015 14:20:00 GMT");
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.PUT);
//设置过期时间
request.setExpiration(expiration);
//设置Content-Type
request.setContentType("application/octet-stream");
// 添加user meta
request.addUserMetadata("author", "aliy");
// 生成URL签名(HTTP PUT请求)
URL signedUrl = Server.generatePresignedUrl(request);
System.out.println("signed url for putObject: " + signedUrl);
//客户端使用使用url签名字串发送请求
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
File f = new File(filePath);
FileInputStream fin = new FileInputStream(f);
// 添加PutObject请求头
Map<String, String> customHeaders = new HashMap<String, String>();
customHeaders.put("Content-Type", "application/octet-stream");
// 添加user meta
customHeaders.put("x-oss-meta-author", "aliy");
PutObjectResult result = client.putObject(signedUrl, fin, f.length(), customHeaders);
最后更新:2016-11-23 16:04:10
上一篇:
管理文件__Java-SDK_SDK 参考_对象存储 OSS-阿里云
下一篇:
生命周期管理__Java-SDK_SDK 参考_对象存储 OSS-阿里云
耗资源用户处理流程__网站访问异常_技术分享_云虚机主机-阿里云
OceanBase SQL简介__SQL语法参考_云数据库 OceanBase-阿里云
将路由器接口状态置为激活__路由器接口相关接口_API参考_专有网络 VPC-阿里云
视频基本属性__媒体库管理_开发人员指南_视频点播-阿里云
附录:PPAS 开发驱动程序__快速入门(PPAS)_云数据库 RDS 版-阿里云
查看作业脏数据__作业管理_SDK参考手册_数据集成-阿里云
使用已经搭建好的应用服务器__安卓应用示例_最佳实践_对象存储 OSS-阿里云
服务连接__基本概念_基本介绍_大数据计算服务-阿里云
Oozie 使用说明__开源组件介绍_用户指南_E-MapReduce-阿里云
智能解析线路__解析记录操作_产品使用手册_云解析-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云