全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
对象存储 OSS

授权访问

更新时间:2017-09-01 16:34:35

使用STS服务临时授权

介绍

OSS可以通过阿里云STS服务,进行临时授权访问。阿里云STS (Security Token Service) 是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或联邦用户(用户身份由您自己管理)颁发一个自定义时效和权限的访问凭证。第三方应用或联邦用户可以使用该访问凭证直接调用阿里云产品API,或者使用阿里云产品提供的SDK来访问云产品API。

使用STS的好处:

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

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

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

使用STS详细步骤

  1. App用户登录。

    App用户由您自己管理。您可以自定义身份管理系统,也可以使用外部Web账号或OpenID。对于每个有效的App用户来说,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使用本地缓存的访问凭证去请求Aliyun Service API。云服务会感知STS访问凭证,并会依赖STS服务来验证访问凭证,并正确响应用户请求。

STS安全令牌详情,请参考RAM使用指南中的角色管理。关键是调用STS服务接口AssumeRole来获取有效访问凭证即可。也可以直接使用STS SDK来调用该方法,点击查看.

使用STS凭证构造签名请求

用户的client拿到STS临时凭证后,通过其中安全令牌(SecurityToken)以及临时访问密钥(AccessKeyId, AccessKeySecret)生成OSSClient。以上传Object为例:

  1. String accessKeyId = "<accessKeyId>";
  2. String accessKeySecret = "<accessKeySecret>";
  3. String securityToken = "<securityToken>"
  4. // 以杭州为例
  5. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  6. OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);

使用URL签名授权访问

生成签名URL

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

生成一个签名的URL

代码如下:

  1. String bucketName = "your-bucket-name";
  2. String key = "your-object-key";
  3. // 设置URL过期时间为1小时
  4. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
  5. // 生成URL
  6. URL url = client.generatePresignedUrl(bucketName, key, expiration);

生成的URL默认以GET方式访问,用户可以直接通过浏览器访问相关内容。

生成其他Http方法的URL

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

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

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

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

如果您想生成签名的URL来上传Object,并指定UserMetadata,Content-Type等头信息,可以这样做:

  1. // 创建请求
  2. GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key);
  3. // HttpMethod为PUT
  4. generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
  5. // 添加UserMetadata
  6. generatePresignedUrlRequest.addUserMetadata("author", "baymax");
  7. // 添加Content-Type
  8. request.setContentType("application/octet-stream");
  9. // 生成签名的URL
  10. URL url = client.generatePresignedUrl(generatePresignedUrlRequest);

注意:上述过程只是生成了签名的URL,您仍需要在request header中添加meta的信息。可以参考下面的代码。

使用签名URL发送请求

现在java SDK支持put object和get object两种方式的URL签名请求。

使用URL签名的方式getobject

  1. //服务器端生成url签名字串
  2. OSSClient Server = new OSSClient(endpoint, accessId, accessKey);
  3. Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2015 14:20:00 GMT");
  4. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET);
  5. //设置过期时间
  6. request.setExpiration(expiration);
  7. // 生成URL签名(HTTP GET请求)
  8. URL signedUrl = Server .generatePresignedUrl(request);
  9. System.out.println("signed url for getObject: " + signedUrl);
  10. //客户端使用使用url签名字串发送请求
  11. OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  12. Map<String, String> customHeaders = new HashMap<String, String>();
  13. // 添加GetObject请求头
  14. customHeaders.put("Range", "bytes=100-1000");
  15. OSSObject object = client.getObject(signedUrl,customHeaders);

使用URL签名的方式putobject

  1. //服务器端生成url签名字串
  2. OSSClient Server = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  3. Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2015 14:20:00 GMT");
  4. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.PUT);
  5. //设置过期时间
  6. request.setExpiration(expiration);
  7. //设置Content-Type
  8. request.setContentType("application/octet-stream");
  9. // 添加user meta
  10. request.addUserMetadata("author", "aliy");
  11. // 生成URL签名(HTTP PUT请求)
  12. URL signedUrl = Server.generatePresignedUrl(request);
  13. System.out.println("signed url for putObject: " + signedUrl);
  14. //客户端使用使用url签名字串发送请求
  15. OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  16. File f = new File(filePath);
  17. FileInputStream fin = new FileInputStream(f);
  18. // 添加PutObject请求头
  19. Map<String, String> customHeaders = new HashMap<String, String>();
  20. customHeaders.put("Content-Type", "application/octet-stream");
  21. // 添加user meta
  22. customHeaders.put("x-oss-meta-author", "aliy");
  23. PutObjectResult result = client.putObject(signedUrl, fin, f.length(), customHeaders);
本文导读目录