Android如何配置訪問憑證
本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業(yè)務(wù)造成影響,請務(wù)必仔細(xì)閱讀。
使用Android SDK發(fā)起OSS請求,您需要配置訪問憑證。阿里云服務(wù)會通過訪問憑證驗(yàn)證您的身份信息和訪問權(quán)限。您可以根據(jù)使用場景對認(rèn)證和授權(quán)的要求,選擇不同的方式提供憑證。
前提條件
在配置訪問憑證前,您需要安裝OSS Android SDK。詳情請參見安裝。
初始化憑證提供者
憑證提供者選型
OSS支持多種方式初始化憑證提供者,您可以根據(jù)使用場景對認(rèn)證和授權(quán)的要求,選擇對應(yīng)的方式初始化憑證提供者。
憑證提供者初始化方式 | 適用場景 | 是否需要提供前置的AK或STS Token | 底層實(shí)現(xiàn)基于的憑證 | 憑證有效期 | 憑證輪轉(zhuǎn)或刷新方式 |
部署運(yùn)行在安全、穩(wěn)定且不易受外部攻擊的環(huán)境的應(yīng)用程序,無需頻繁輪轉(zhuǎn)憑證就可以長期訪問云服務(wù) | 是 | AK | 長期 | 手動(dòng)輪轉(zhuǎn) | |
部署運(yùn)行在不可信的環(huán)境的應(yīng)用程序,希望能控制訪問的有效期、權(quán)限 | 是 | STS Token | 臨時(shí) | 自定義 | |
需要通過外部系統(tǒng)獲取訪問憑證的應(yīng)用程序 | 否 | STS Token | 臨時(shí) | 自動(dòng)刷新 |
方式一:使用AK
如果您的應(yīng)用程序部署運(yùn)行在安全、穩(wěn)定且不易受外部攻擊的環(huán)境中,需要長期訪問您的OSS,且不能頻繁輪轉(zhuǎn)憑證時(shí),您可以使用阿里云主賬號或RAM用戶的AK(Access Key ID、Access Key Secret)初始化憑證提供者。需要注意的是,該方式需要您手動(dòng)維護(hù)一個(gè)AK,存在安全性風(fēng)險(xiǎn)和維護(hù)復(fù)雜度增加的風(fēng)險(xiǎn)。如何獲取AK,請參見CreateAccessKey - 創(chuàng)建主賬號或RAM用戶訪問密鑰。
此方式存在安全問題,移動(dòng)端不推薦使用。阿里云賬號擁有資源的全部權(quán)限,AK一旦泄露,會給系統(tǒng)帶來巨大風(fēng)險(xiǎn),如果需要使用此方式,建議使用最小化授權(quán)的RAM用戶的AK。
代碼示例
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(ak, sk);
方式二:使用STS Token
如果您的應(yīng)用程序需要臨時(shí)訪問OSS,細(xì)化訪問控制,實(shí)時(shí)調(diào)整權(quán)限,以提高安全性和靈活性,您可以使用通過STS服務(wù)獲取的臨時(shí)身份憑證(Access Key ID、Access Key Secret和Security Token)初始化憑證提供者。需要注意的是,該方式需要您手動(dòng)維護(hù)一個(gè)STS Token,存在安全性風(fēng)險(xiǎn)和維護(hù)復(fù)雜度增加的風(fēng)險(xiǎn)。如何獲取STS Token,請參見AssumeRole - 獲取扮演角色的臨時(shí)身份憑證。
您可以在代碼中使用AK和Security Token來引用憑證,以下為使用憑證更新StsToken的示例。
手動(dòng)更新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);
自動(dòng)更新StsToken
OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
@Override
public OSSFederationToken getFederationToken() {
/* 獲取ak/sk/token/expiration,
* 示例從應(yīng)用服務(wù)器獲取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構(gòu)建OSSFederationToken
OSSFederationToken federationToken = new OSSFederationToken(ak, sk, token, expiration);
return federationToken;
}
};
方式三:使用CredentialsURI
如果您的應(yīng)用程序需要通過外部系統(tǒng)或自定義配置獲取和自動(dòng)更新阿里云憑證,從而實(shí)現(xiàn)靈活的憑證管理和無密鑰訪問,您可以使用CredentialsURI初始化憑證提供者。該方式底層實(shí)現(xiàn)是STS Token。Credentials工具通過您提供的URI獲取STS Token,完成憑證客戶端初始化。該方式無需您提供一個(gè)AK或STS Token,消除了手動(dòng)維護(hù)AK或STS Token的風(fēng)險(xiǎn)。
為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應(yīng)協(xié)議:
響應(yīng)狀態(tài)碼:200
響應(yīng)體結(jié)構(gòu):
{ "StatusCode":200, "AccessKeyId":"AccessKeyId", "AccessKeySecret":"AccessKeySecret", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"SecurityToken" }
配置URI憑證作為訪問憑證。
String authServerUrl = "<remote_url>"; OSSAuthCredentialsProvider credentialProvider = new OSSAuthCredentialsProvider(authServerUrl); /* 如果數(shù)據(jù)被加密,可通過如下代碼解密 * credentialProvider.setDecoder(new OSSAuthCredentialsProvider.AuthDecoder() { * @Override * public String decode(String data) { * String result = null; * // 解密 * // result = ... * return result; * } * }); */