582
阿裏雲
授權訪問__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲
使用STS服務臨時授權
介紹
OSS可以通過阿裏雲STS服務,臨時進行授權訪問。阿裏雲STS (Security Token Service) 是為雲計算用戶提供臨時訪問令牌的Web服務。通過STS,您可以為第三方應用或聯邦用戶(用戶身份由您自己管理)頒發一個自定義時效和權限的訪問憑證。第三方應用或聯邦用戶可以使用該訪問憑證直接調用阿裏雲產品API,或者使用阿裏雲產品提供的SDK來訪問雲產品API。
- 您不需要透露您的長期密鑰(AccessKey)給第三方應用,隻需要生成一個訪問令牌並將令牌交給第三方應用即可。這個令牌的訪問權限及有效期限都可以由您自定義。
- 您不需要關心權限撤銷問題,訪問令牌過期後就自動失效。
以APP應用為例,交互流程如下圖:
方案的詳細描述如下:
- App用戶登錄。App用戶身份是客戶自己管理。客戶可以自定義身份管理係統,也可以使用外部Web賬號或OpenID。對於每個有效的App用戶來說,AppServer是可以確切地定義出每個App用戶的最小訪問權限。
- AppServer請求STS服務獲取一個安全令牌(SecurityToken)。在調用STS之前,AppServer需要確定App用戶的最小訪問權限(用Policy語法描述)以及授權的過期時間。 然後通過調用STS的AssumeRole(扮演角色)接口來獲取安全令牌。角色管理與使用相關內容請參考《RAM使用指南》中的角色管理。
- STS返回給AppServer一個有效的訪問憑證,包括一個安全令牌(SecurityToken)、臨時訪問密鑰(AccessKeyId, AccessKeySecret)以及過期時間。
- AppServer將訪問憑證返回給ClientApp。ClientApp可以緩存這個憑證。當憑證失效時,ClientApp需要向AppServer申請新的有效訪問憑證。比如,訪問憑證有效期為1小時,那麼ClientApp可以每30分鍾向AppServer請求更新訪問憑證。
- ClientApp使用本地緩存的訪問憑證去請求Aliyun Service API。雲服務會感知STS訪問憑證,並會依賴STS服務來驗證訪問憑證,並正確響應用戶請求。
STS安全令牌詳情,請參考《RAM使用指南》中的角色管理。關鍵是調用STS服務接口AssumeRole來獲取有效訪問憑證即可。也可以直接使用STS SDK來調用該方法,點擊查看
使用STS憑證構造簽名請求
用戶的client端拿到STS臨時憑證後,通過其中安全令牌(SecurityToken)以及臨時訪問密鑰(AccessKeyId, AccessKeySecret)生成OSSClient。以上傳Object為例:
String accessKeyId = "<accessKeyId>";
String accessKeySecret = "<accessKeySecret>";
String securityToken = "<securityToken>"
// 以杭州為例
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
使用URL簽名授權訪問
生成簽名URL
通過生成簽名URL的形式提供給用戶一個臨時的訪問URL。在生成URL時,您可以指定URL過期的時間,從而限製用戶長時間訪問。
生成一個簽名的URL
代碼如下:
String bucketName = "your-bucket-name";
String key = "your-object-key";
// 設置URL過期時間為1小時
Date expiration = new Date(new Date().getTime() + 3600 * 1000);
// 生成URL
URL url = client.generatePresignedUrl(bucketName, key, expiration);
生成的URL默認以GET方式訪問,這樣,用戶可以直接通過瀏覽器訪問相關內容。
生成其他Http方法的URL
如果您想允許用戶臨時進行其他操作(比如上傳,刪除Object),可能需要簽名其他方法的URL,如下:
// 生成PUT方法的URL
URL url = client.generatePresignedUrl(bucketName, key, expiration, HttpMethod.PUT);
通過傳入 HttpMethod.PUT 參數,用戶可以使用生成的URL上傳Object。
添加用戶自定義參數(UserMetadata)
如果您想生成簽名的URL來上傳Object,並指定UserMetadata,Content-Type等頭信息,可以這樣做:
// 創建請求
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, key);
// HttpMethod為PUT
generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
// 添加UserMetadata
generatePresignedUrlRequest.addUserMetadata("author", "baymax");
// 添加Content-Type
request.setContentType("application/octet-stream");
// 生成簽名的URL
URL url = client.generatePresignedUrl(generatePresignedUrlRequest);
需要注意的是,上述過程隻是生成了簽名的URL,您仍需要在request header中添加meta的信息。可以參考下麵的代碼。
使用簽名URL發送請求
現在java SDK支持put object和get object兩種方式的URL簽名請求。
使用URL簽名的方式getobject
//服務器端生成url簽名字串
OSSClient Server = new OSSClient(endpoint, accessId, accessKey);
Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2015 14:20:00 GMT");
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET);
//設置過期時間
request.setExpiration(expiration);
// 生成URL簽名(HTTP GET請求)
URL signedUrl = Server .generatePresignedUrl(request);
System.out.println("signed url for getObject: " + signedUrl);
//客戶端使用使用url簽名字串發送請求
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
Map<String, String> customHeaders = new HashMap<String, String>();
// 添加GetObject請求頭
customHeaders.put("Range", "bytes=100-1000");
OSSObject object = client.getObject(signedUrl,customHeaders);
使用URL簽名的方式putobject
//服務器端生成url簽名字串
OSSClient Server = new OSSClient(endpoint, accessKeyId, accessKeySecret);
Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2015 14:20:00 GMT");
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.PUT);
//設置過期時間
request.setExpiration(expiration);
//設置Content-Type
request.setContentType("application/octet-stream");
// 添加user meta
request.addUserMetadata("author", "aliy");
// 生成URL簽名(HTTP PUT請求)
URL signedUrl = Server.generatePresignedUrl(request);
System.out.println("signed url for putObject: " + signedUrl);
//客戶端使用使用url簽名字串發送請求
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
File f = new File(filePath);
FileInputStream fin = new FileInputStream(f);
// 添加PutObject請求頭
Map<String, String> customHeaders = new HashMap<String, String>();
customHeaders.put("Content-Type", "application/octet-stream");
// 添加user meta
customHeaders.put("x-oss-meta-author", "aliy");
PutObjectResult result = client.putObject(signedUrl, fin, f.length(), customHeaders);
最後更新:2016-11-23 16:04:10
上一篇:
管理文件__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲
下一篇:
生命周期管理__Java-SDK_SDK 參考_對象存儲 OSS-阿裏雲
耗資源用戶處理流程__網站訪問異常_技術分享_雲虛機主機-阿裏雲
OceanBase SQL簡介__SQL語法參考_雲數據庫 OceanBase-阿裏雲
將路由器接口狀態置為激活__路由器接口相關接口_API參考_專有網絡 VPC-阿裏雲
視頻基本屬性__媒體庫管理_開發人員指南_視頻點播-阿裏雲
附錄:PPAS 開發驅動程序__快速入門(PPAS)_雲數據庫 RDS 版-阿裏雲
查看作業髒數據__作業管理_SDK參考手冊_數據集成-阿裏雲
使用已經搭建好的應用服務器__安卓應用示例_最佳實踐_對象存儲 OSS-阿裏雲
服務連接__基本概念_基本介紹_大數據計算服務-阿裏雲
Oozie 使用說明__開源組件介紹_用戶指南_E-MapReduce-阿裏雲
智能解析線路__解析記錄操作_產品使用手冊_雲解析-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲