授权访问
本文介绍如何进行授权访问。
使用STS进行临时授权
OSS可以通过阿里云STS (Security Token Service) 进行临时授权访问。阿里云STS是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。STS更详细的解释请参见STS介绍。
STS的优势如下:
- 您无需透露您的长期密钥(AccessKey)给第三方应用,只需生成一个访问令牌并将令牌交给第三方应用。您可以自定义这个令牌的访问权限及有效期限。
- 您无需关心权限撤销问题,访问令牌过期后自动失效。
使用STS访问OSS的流程请参见开发指南中的STS临时授权访问OSS。
以下代码用于使用STS凭证构造签名请求:
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String securityToken = "<yourSecurityToken>";
// 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
// OSS相关操作。例如上传、下载文件等。
// 上传文件。
// ossClient.putObject(putObjectRequest);
// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
// ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File("<yourLocalFile>"));
// 关闭OSSClient。
ossClient.shutdown();
使用签名URL进行临时授权
- 生成签名URL
您可以将生成的签名URL提供给访客进行临时访问。生成签名URL时,您可以指定URL的过期时间,来限制访客的访问时长。
- 生成以GET方法访问的签名URL
以下代码用于生成以GET方法访问的签名URL:
// Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; String objectName = "<yourObjectName>"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 设置URL过期时间为1小时。 Date expiration = new Date(new Date().getTime() + 3600 * 1000); // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。 URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration); // 关闭OSSClient。 ossClient.shutdown();
- 生成以其他HTTP方法访问的签名URL
如果您想允许访客临时进行其他操作(比如上传或删除文件),需要生成对应的签名URL,例如使用生成PUT的签名URL上传文件:
// Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String securityToken = "<yourSecurityToken>"; String bucketName = "<yourBucketName>"; String objectName = "<yourObjectName>"; // 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken); GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT); // 设置URL过期时间为1小时。 Date expiration = new Date(new Date().getTime() + 3600 * 1000); request.setExpiration(expiration); // 设置ContentType。 request.setContentType(DEFAULT_OBJECT_CONTENT_TYPE); // 设置自定义元信息。 request.addUserMetadata("author", "aliy"); // 生成PUT方式的签名URL。 URL signedUrl = ossClient.generatePresignedUrl(request); Map<String, String> requestHeaders = new HashMap<String, String>(); requestHeaders.put(HttpHeaders.CONTENT_TYPE, DEFAULT_OBJECT_CONTENT_TYPE); requestHeaders.put(OSS_USER_METADATA_PREFIX + "author", "aliy"); // 使用签名URL上传文件。 ossClient.putObject(signedUrl, new ByteArrayInputStream("Hello OSS".getBytes()), -1, requestHeaders, true); // 关闭OSSClient。 ossClient.shutdown();
通过传入HttpMethod.PUT参数,访客可以使用生成的签名URL上传文件。
- 生成指定参数的签名URL
以下代码用于生成指定参数的签名URL:
// Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; String objectName = "<yourObjectName>"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 创建请求。 GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName); // HttpMethod为PUT。 generatePresignedUrlRequest.setMethod(HttpMethod.PUT); // 添加用户自定义元信息。 generatePresignedUrlRequest.addUserMetadata("author", "baymax"); // 添加Content-Type。 generatePresignedUrlRequest.setContentType("application/octet-stream"); // 设置URL过期时间为1小时。 Date expiration = new Date(new Date().getTime() + 3600 * 1000); generatePresignedUrlRequest.setExpiration(expiration); // 生成签名URL。 URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest); // 关闭OSSClient。 ossClient.shutdown();
- 使用签名URL上传/获取文件
- 使用签名URL获取文件
以下代码用于使用签名URL获取指定文件:
// Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; String objectName = "<yourObjectName>"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2022 14:20:00 GMT"); GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET); // 设置过期时间。 request.setExpiration(expiration); // 生成签名URL(HTTP GET请求)。 URL signedUrl = ossClient .generatePresignedUrl(request); System.out.println("signed url for getObject: " + signedUrl); // 使用签名URL发送请求。 Map<String, String> customHeaders = new HashMap<String, String>(); // 添加GetObject请求头。 customHeaders.put("Range", "bytes=100-1000"); OSSObject object = ossClient.getObject(signedUrl,customHeaders); // 关闭OSSClient。 ossClient.shutdown();
- 使用签名URL上传文件
以下代码用于使用签名URL上传文件:
// Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "<yourAccessKeyId>"; String accessKeySecret = "<yourAccessKeySecret>"; String bucketName = "<yourBucketName>"; String objectName = "<yourObjectName>"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 生成签名URL。 Date expiration = DateUtil.parseRfc822Date("Thu, 19 Mar 2019 18:00:00 GMT"); GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT); // 设置过期时间。 request.setExpiration(expiration); // 设置Content-Type。 request.setContentType("application/octet-stream"); // 添加用户自定义元信息。 request.addUserMetadata("author", "aliy"); // 生成签名URL(HTTP PUT请求)。 URL signedUrl = ossClient.generatePresignedUrl(request); System.out.println("signed url for putObject: " + signedUrl); // 使用签名URL发送请求。 File f = new File("<yourLocalFile>"); FileInputStream fin = new FileInputStream(f); // 添加PutObject请求头。 Map<String, String> customHeaders = new HashMap<String, String>(); customHeaders.put("Content-Type", "application/octet-stream"); customHeaders.put("x-oss-meta-author", "aliy"); PutObjectResult result = ossClient.putObject(signedUrl, fin, f.length(), customHeaders); // 关闭OSSClient。 ossClient.shutdown();
- 使用签名URL获取文件
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论