阿里雲團隊努力不懈,力求將最新的技術內容更快地以您最熟悉的語言呈現。本文由簡體中文內容自動轉碼而成,過程無人工干預。阿里雲不保證此自動轉碼的準確性、完整性及時效性。因轉碼造成的任何內容錯誤及因此可能帶來的損失,阿里雲概不負責,敬請見諒。本文内容請以簡體中文版本為準。
全部產品
Search
文件中心

授權訪問

更新時間: Oct 19, 2018

使用STS進行臨時授權

OSS可以通過阿里雲STS (Security Token Service) 進行臨時授權訪問。阿里雲STS是為雲端運算使用者提供臨時存取權杖的Web服務。通過STS,您可以為第三方應用或子使用者(即使用者身份由您自己管理的使用者)頒發一個自訂時效和許可權的訪問憑證。STS更詳細的解釋請參見STS介紹

STS的優勢如下:

  • 您無需透露您的長期密鑰(AccessKey)給第三方應用,只需生成一個存取權杖並將令牌交給第三方應用。您可以自訂這個令牌的存取權限及有效期間限。

  • 您無需關心許可權撤銷問題,存取權杖過期後自動失效。

使用STS訪問OSS的流程請參見開發指南中的RAM和STS應用場景實踐

使用STS憑證建構簽章請求

以下代碼用於使用STS憑證建構簽章請求:

  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. // 使用者拿到STS臨時憑證後,通過其中的安全性權杖(SecurityToken)和臨時存取金鑰(AccessKeyId和AccessKeySecret)生成OSSClient。
  8. // 建立OSSClient執行個體。
  9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
  10. // OSS操作。
  11. // 關閉OSSClient。
  12. ossClient.shutdown();

使用簽名URL進行臨時授權

生成簽名URL

您可以將生成的簽名URL提供給訪客進行臨時訪問。生成簽名URL時,您可以指定URL的過期時間,來限制訪客的訪問時長。

生成以GET方法訪問的簽名URL

以下代碼用於生成以GET方法訪問的簽名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過期時間為1小時。
  11. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
  12. // 生成以GET方法訪問的簽名URL,訪客可以直接通過瀏覽器訪問相關內容。
  13. URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
  14. // 關閉OSSClient。
  15. ossClient.shutdown();

生成以其他HTTP方法訪問的簽名URL

如果您想允許訪客臨時進行其他動作(比如上傳或刪除檔案),需要生成對應的簽名URL,例如使用生成PUT的簽名URL上傳檔案:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "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. String bucketName = "<yourBucketName>";
  8. String objectName = "<yourObjectName>";
  9. // 使用者拿到STS臨時憑證後,通過其中的安全性權杖(SecurityToken)和臨時存取金鑰(AccessKeyId和AccessKeySecret)生成OSSClient。
  10. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
  11. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
  12. // 設定URL過期時間為1小時。
  13. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
  14. request.setExpiration(expiration);
  15. // 設定ContentType。
  16. request.setContentType(DEFAULT_OBJECT_CONTENT_TYPE);
  17. // 設定自訂元資訊。
  18. request.addUserMetadata("author", "aliy");
  19. // 生成PUT方式的簽名URL。
  20. URL signedUrl = ossClient.generatePresignedUrl(request);
  21. Map<String, String> requestHeaders = new HashMap<String, String>();
  22. requestHeaders.put(HttpHeaders.CONTENT_TYPE, DEFAULT_OBJECT_CONTENT_TYPE);
  23. requestHeaders.put(OSS_USER_METADATA_PREFIX + "author", "aliy");
  24. // 使用簽名URL上傳檔案。
  25. ossClient.putObject(signedUrl, new ByteArrayInputStream("Hello OSS".getBytes()), -1, requestHeaders, true);
  26. // 關閉OSSClient。
  27. ossClient.shutdown();

通過傳入HttpMethod.PUT參數,訪客可以使用生成的簽名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. // 建立請求。
  11. GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
  12. // HttpMethod為PUT。
  13. generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
  14. // 添加使用者自訂元資訊。
  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. // 關閉OSSClient。
  24. ossClient.shutdown();

使用簽名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. // 關閉OSSClient。
  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. // 添加使用者自訂元資訊。
  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("<yourLocalFile>");
  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. // 關閉OSSClient。
  31. ossClient.shutdown();