使用STS進行臨時授權
OSS可以通過阿里雲STS (Security Token Service) 進行臨時授權訪問。阿里雲STS是為雲端運算使用者提供臨時存取權杖的Web服務。通過STS,您可以為第三方應用或子使用者(即使用者身份由您自己管理的使用者)頒發一個自訂時效和許可權的訪問憑證。STS更詳細的解釋請參見STS介紹。
STS的優勢如下:
您無需透露您的長期密鑰(AccessKey)給第三方應用,只需生成一個存取權杖並將令牌交給第三方應用。您可以自訂這個令牌的存取權限及有效期間限。
您無需關心許可權撤銷問題,存取權杖過期後自動失效。
使用STS訪問OSS的流程請參見開發指南中的RAM和STS應用場景實踐。
使用STS憑證建構簽章請求
以下代碼用於使用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執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
// OSS操作。
// 關閉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執行個體。
OSSClient ossClient = new OSSClient(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。
OSSClient ossClient = new OSSClient(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執行個體。
OSSClient ossClient = new OSSClient(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執行個體。
OSSClient ossClient = new OSSClient(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執行個體。
OSSClient ossClient = new OSSClient(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();