全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
对象存储 OSS

授权访问

更新时间:2018-05-25 23:53:43

使用STS进行临时授权

OSS可以通过阿里云STS (Security Token Service) 进行临时授权访问。阿里云STS是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。STS更详细的解释请参见 STS介绍

STS的优势如下:

  • 您无需透露您的长期密钥(AccessKey)给第三方应用,只需生成一个访问令牌并将令牌交给第三方应用即可。这个令牌的访问权限及有效期限都可以由您自定义。

  • 您无需关心权限撤销问题,访问令牌过期后就自动失效。

交互流程

以APP应用为例,交互流程如下图所示:

交互流程的详情如下:

  1. App用户登录。

    App用户由您自己管理。您可以自定义身份管理系统,也可以使用外部Web账号或OpenID。AppServer可以确切地定义出每个合法app用户的最小访问权限。

  2. AppServer向STS请求获取一个安全令牌(SecurityToken)。

    1. 在调用STS之前,AppServer需要确定app用户的最小访问权限(用Policy语法描述)以及授权的过期时间。

    2. 通过调用STS的AssumeRole(扮演角色)接口来获取安全令牌。角色管理与使用的相关内容请参见RAM用户指南中的角色管理

  3. STS返回给AppServer一个有效的访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和 AccessKeySecret)及过期时间。

  4. AppServer将访问凭证返回给ClientApp。

    ClientApp可以缓存这个凭证。当凭证失效时,ClientApp需要向AppServer申请新的有效访问凭证。比如,访问凭证有效期为1小时,那么ClientApp可以每30分钟向AppServer请求更新访问凭证。

  5. ClientApp使用本地缓存的访问凭证去请求阿里云API。云服务会感知STS访问凭证,并会依赖STS服务来验证访问凭证,并正确响应用户请求。

STS安全令牌详情请参见RAM使用指南中的角色管理。关键是调用STS服务接口AssumeRole或直接使用STS SDK来获取有效访问凭证即可。

使用STS凭证构造签名请求

用户拿到STS临时凭证后,通过其中安全令牌(SecurityToken)及临时访问密钥(AccessKeyId, AccessKeySecret)生成OSSClient。

示例代码如下:

  1. // Endpoint以杭州为例,其它Region请按实际情况填写。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String securityToken = "<yourSecurityToken>";
  7. // 创建OSSClient实例。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
  9. //OSS操作。
  10. // 关闭Client。
  11. ossClient.shutdown();

使用URL签名进行临时授权

生成签名URL

通过生成签名URL的形式提供给用户一个临时的访问URL。在生成URL时,您可以指定URL的过期时间,从而限制用户长时间访问。

生成GET方法访问的URL

以下代码用于生成一个带签名的URL。生成的URL以GET方法访问,用户可以直接通过浏览器访问相关内容。

  1. // Endpoint以杭州为例,其它Region请按实际情况填写。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. String objectName = "<yourObjectName>";
  8. // 创建OSSClient实例。
  9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  10. // 设置URL过期时间为1小时
  11. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
  12. // 生成URL。
  13. URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
  14. // 关闭Client。
  15. ossClient.shutdown();

生成其他HTTP方法的URL

如果您想允许用户临时进行其他操作(比如上传或删除Object),需要生成其他语言版本的URL,例如:

  1. // 生成PUT方法的URL。
  2. URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration, HttpMethod.PUT);

通过传入HttpMethod.PUT参数,用户可以使用生成的URL上传Object。

添加用户自定义参数(UserMetadata)

OSS支持生成签名的URL来上传Object,并指定UserMetadata,Content-Type等头信息。

以下代码用于生成指定参数的签名URL:

  1. // Endpoint以杭州为例,其它Region请按实际情况填写。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. String objectName = "<yourObjectName>";
  8. // 创建OSSClient实例。
  9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  10. // 创建请求。
  11. GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
  12. // HttpMethod为PUT。
  13. generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
  14. // 添加UserMetadata。
  15. generatePresignedUrlRequest.addUserMetadata("author", "baymax");
  16. // 添加Content-Type。
  17. generatePresignedUrlRequest.setContentType("application/octet-stream");
  18. // 设置URL过期时间为1小时。
  19. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
  20. generatePresignedUrlRequest.setExpiration(expiration);
  21. // 生成签名的URL。
  22. URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
  23. // 关闭Client。
  24. ossClient.shutdown();

上述过程只是生成了签名的URL,您仍需要在Request Header中添加元信息。可以参考下面的代码。

使用签名URL发送请求

Java SDK支持PutObject和GetObject两种方式的URL签名请求。

使用URL签名的方式获取文件

以下代码用于使用URL签名的方式获取指定文件:

  1. // Endpoint以杭州为例,其它Region请按实际情况填写。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. String objectName = "<yourObjectName>";
  8. // 创建OSSClient实例。
  9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  10. Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2022 14:20:00 GMT");
  11. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
  12. //设置过期时间。
  13. request.setExpiration(expiration);
  14. // 生成URL签名(HTTP GET请求)。
  15. URL signedUrl = ossClient .generatePresignedUrl(request);
  16. System.out.println("signed url for getObject: " + signedUrl);
  17. //使用url签名字串发送请求。
  18. Map<String, String> customHeaders = new HashMap<String, String>();
  19. // 添加GetObject请求头。
  20. customHeaders.put("Range", "bytes=100-1000");
  21. OSSObject object = ossClient.getObject(signedUrl,customHeaders);
  22. // 关闭Client。
  23. ossClient.shutdown();

使用URL签名的方式上传文件

以下代码用于使用URL签名的方式上传指定文件:

  1. // Endpoint以杭州为例,其它Region请按实际情况填写。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. String objectName = "<yourObjectName>";
  8. // 创建OSSClient实例。
  9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  10. //生成URL签名字串。
  11. Date expiration = DateUtil.parseRfc822Date("Thu, 19 Mar 2019 18:00:00 GMT");
  12. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
  13. //设置过期时间。
  14. request.setExpiration(expiration);
  15. //设置Content-Type。
  16. request.setContentType("application/octet-stream");
  17. // 添加user meta。
  18. request.addUserMetadata("author", "aliy");
  19. // 生成URL签名(HTTP PUT请求)。
  20. URL signedUrl = ossClient.generatePresignedUrl(request);
  21. System.out.println("signed url for putObject: " + signedUrl);
  22. //使用URL签名字串发送请求。
  23. File f = new File("/Users/liusiman/Desktop/normal-restore-object.txt");
  24. FileInputStream fin = new FileInputStream(f);
  25. // 添加PutObject请求头。
  26. Map<String, String> customHeaders = new HashMap<String, String>();
  27. customHeaders.put("Content-Type", "application/octet-stream");
  28. customHeaders.put("x-oss-meta-author", "aliy");
  29. PutObjectResult result = ossClient.putObject(signedUrl, fin, f.length(), customHeaders);
  30. // 关闭Client。
  31. ossClient.shutdown();
本文导读目录