Aliyun oss實現(一),向STS申請臨時SecretToken

最近做了一個項目關於aliyun雲同步的功能。

結構如下


api層放向外暴露的接口和model類。

sdk層打包客戶端的實現類和工廠,向客戶暴露。

security層部署至服務器,不向外暴露。


jar包用到以下4個。


sts和ram是給第三方客戶(相對於aliyun而言),臨時訪問bucket的扮演角色(通過sts和ram包中提供的api,可以直接向相應OSS賬號申請臨時Token),Token中包含四個屬性,accessKeyID,accessKeySecret,secretToken,expiration。想要獲得臨時token,需要一個被賦予了RAM權限的OSS用戶的accessKeyID和accessKeySecret


其中OSS用戶的AccessKeySecret只會在第一次申請開通accessKey的時候提供給用戶(需保存)。

關於如何通過STS API與ALINYUN交互申請Token。過程如下:

public AssumeRoleResponse assumeRole(String assumeAccessKeyId,
			String assumeAccessKeySecret, String roleArn,
			String roleSessionName, String policy, ProtocolType protocolType)
			throws RuntimeException {

		try {
			// 創建一個 Aliyun Acs Client, 用於發起 OpenAPI 請求
			IClientProfile profile = DefaultProfile.getProfile(
					REGION_CN_SHENZHEN, assumeAccessKeyId,
					assumeAccessKeySecret);
			DefaultAcsClient client = new DefaultAcsClient(profile);

			// 創建一個 AssumeRoleRequest 並設置請求參數
			final AssumeRoleRequest request = new AssumeRoleRequest();
			request.setMethod(MethodType.POST);
			request.setProtocol(protocolType);

			request.setRoleArn(roleArn);
			request.setRoleSessionName(roleSessionName);
			request.setPolicy(policy);
			request.setDurationSeconds(new Long(15 * 60));

			// 發起請求,並得到response
			final AssumeRoleResponse response = client.getAcsResponse(request);

			return response;
		} catch (ClientException e) {
			throw new RuntimeException(e.getMessage());
		}

	}

ProtocolType protocolType = ProtocolType.HTTPS;
		final AssumeRoleResponse response = assumeRole(tempAccessKeyID,
				tempAccessKeySecret, roleArn, roleSessionName, policy,
				protocolType);
Credentials credential = response.getCredentials();


通過assumeRole方法,取到AssumeRoleResponse 的對象。可以通過getCredentials()方法。獲得Credentials。其中包括了臨時token的所有信息.



取到了Token就有了臨時權限,通過Core和OSS 的Jar包中的API,無需通過服務器,直接和aliyun OSS交互。

關於<span style="font-family: Arial, Helvetica, sans-serif;">policy:</span>

policy是實現申請授權的一個策略。

需要開發者自己編寫。

policy = "{\"Version\": \"1\",\"Statement\": [{\"Action\": [\"oss:ListBuckets\"],\"Resource\": [\"acs:oss:*:*:*\"],\"Effect\": \"Allow\"},"
<span style="white-space:pre">						</span>+ "{\"Action\": [\"oss:ListObjects\"],\"Resource\": [\"acs:oss:*:*:bucket\",\"acs:oss:*:*:bucket/"
<span style="white-space:pre">						</span>+ policySessionName + "/*\"],\"Effect\": \"Allow\"}]}";
有關編寫規則可以在aliyun提供的api手冊中查詢。如上我寫了一個簡單的模板,可以查詢列出對應文件夾下的所有object,其中policySessionName是我自己寫的一個String,可以實現bucket中的文件夾形式。 bucket填你自己創建的即可。

P.S. 在這裏要注意\"bucket:ListObjects\",如果想要實現oss:ListObjects,必須先實現oss:ListBuckets。這是一個前提條件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章