使用Android SDK發起OSS請求,您需要配置訪問憑證。阿里雲服務會通過訪問憑證驗證您的身份資訊和存取權限。您可以根據使用情境對認證和授權的要求,選擇不同的方式提供憑證。
前提條件
在配置訪問憑證前,您需要安裝OSS Android SDK。詳情請參見安裝。
初始化憑證提供者
憑證提供者選型
OSS支援多種方式初始化憑證提供者,您可以根據使用情境對認證和授權的要求,選擇對應的方式初始化憑證提供者。
憑證提供者初始化方式 | 適用情境 | 是否需要提供前置的AK或STS Token | 底層實現基於的憑證 | 憑證有效期間 | 憑證輪轉或重新整理方式 |
部署運行在安全、穩定且不易受外部攻擊的環境的應用程式,無需頻繁輪轉憑證就可以長期訪問雲端服務 | 是 | AK | 長期 | 手動輪轉 | |
部署運行在不可信的環境的應用程式,希望能控制訪問的有效期間、許可權 | 是 | STS Token | 臨時 | 自訂 | |
需要通過外部系統擷取訪問憑證的應用程式 | 否 | STS Token | 臨時 | 自動重新整理 |
方式一:使用AK
如果您的應用程式部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問您的OSS,且不能頻繁輪轉憑證時,您可以使用阿里雲主帳號或RAM使用者的AK(Access Key ID、Access Key Secret)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個AK,存在安全性風險和維護複雜度增加的風險。如何擷取AK,請參見CreateAccessKey - 建立主帳號或RAM使用者存取金鑰。
此方式存在安全問題,移動端不推薦使用。阿里雲帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,如果需要使用此方式,建議使用最小化授權的RAM使用者的AK。
程式碼範例
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(ak, sk);
方式二:使用STS Token
如果您的應用程式需要臨時訪問OSS,細化存取控制,即時調整許可權,以提高安全性和靈活性,您可以使用通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個STS Token,存在安全性風險和維護複雜度增加的風險。如何擷取STS Token,請參見AssumeRole - 擷取扮演角色的臨時身份憑證。
您可以在代碼中使用AK和Security Token來引用憑證,以下為使用憑證更新StsToken的樣本。
手動更新StsToken
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
String token = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);
自動更新StsToken
OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
@Override
public OSSFederationToken getFederationToken() {
/* 擷取ak/sk/token/expiration,
* 樣本從應用伺服器擷取ak/sk/token/expiration:
* URL stsUrl = new URL("<server_url>");
* HttpURLConnection conn = (HttpURLConnection) stsUrl.openConnection();
* InputStream input = conn.getInputStream();
* String jsonText = IOUtils.readStreamAsString(input, OSSConstants.DEFAULT_CHARSET_NAME);
* JSONObject jsonObjs = new JSONObject(jsonText);
* String ak = jsonObjs.getString("AccessKeyId");
* String sk = jsonObjs.getString("AccessKeySecret");
* String token = jsonObjs.getString("SecurityToken");
* String expiration = jsonObjs.getString("Expiration");
*/
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
String token = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
String expiration = "<ALIBABA_CLOUD_EXPIRATION>";
// 用ak/sk/token/expiration構建OSSFederationToken
OSSFederationToken federationToken = new OSSFederationToken(ak, sk, token, expiration);
return federationToken;
}
};
方式三:使用CredentialsURI
如果您的應用程式需要通過外部系統或自訂配置擷取和自動更新阿里雲憑證,從而實現靈活的憑證管理和無密鑰訪問,您可以使用CredentialsURI初始化憑證提供者。該方式底層實現是STS Token。Credentials工具通過您提供的URI擷取STS Token,完成憑證用戶端初始化。該方式無需您提供一個AK或STS Token,消除了手動維護AK或STS Token的風險。
為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應協議:
響應狀態代碼:200
響應體結構:
{ "StatusCode":200, "AccessKeyId":"AccessKeyId", "AccessKeySecret":"AccessKeySecret", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"SecurityToken" }
配置URI憑證作為訪問憑證。
String authServerUrl = "<remote_url>"; OSSAuthCredentialsProvider credentialProvider = new OSSAuthCredentialsProvider(authServerUrl); /* 如果資料被加密,可通過如下代碼解密 * credentialProvider.setDecoder(new OSSAuthCredentialsProvider.AuthDecoder() { * @Override * public String decode(String data) { * String result = null; * // 解密 * // result = ... * return result; * } * }); */