使用Android SDK發起OSS請求,您需要配置訪問憑證。阿里雲服務會通過訪問憑證驗證您的身份資訊和存取權限。您可以根據使用情境對認證和授權的要求,選擇不同的方式提供憑證。
前提條件
在配置訪問憑證前,您需要安裝OSS Android SDK。詳情請參見安裝(Android SDK)。
初始化憑證提供者
憑證提供者選型
OSS支援多種方式初始化憑證提供者,您可以根據使用情境對認證和授權的要求,選擇對應的方式初始化憑證提供者。
移動終端屬於不受信任的環境,任何形式的完整訪問憑證(包括長期AccessKey和臨時STS Token)一旦下發到用戶端,都可能通過逆向工程或運行時調試被提取。為降低資料泄露風險,建議按以下原則組織行動裝置 App與OSS的訪問鏈路:
-
長期AccessKey由商務服務器持有,不下發到移動端。
-
行動裝置 App通過商務服務器擷取STS臨時憑證或預簽名URL後再訪問OSS。
-
使用STS臨時憑證時,通過RAM Policy將許可權嚴格限定到單使用者的物件路徑首碼,並設定較短的有效期間。
-
對於身份證、人臉、支付憑證、醫學資料等隱私資料的上傳或下載情境,建議由商務服務器產生預簽名URL交行動裝置 App使用,行動裝置 App不接觸任何憑證。預簽名URL使用方式請參見授權訪問(Android SDK)。
|
憑證提供者初始化方式 |
適用情境 |
是否需要提供前置的AK或STS Token |
底層實現基於的憑證 |
憑證有效期間 |
憑證輪轉或重新整理方式 |
|
部署運行在安全、穩定且不易受外部攻擊的環境的應用程式,無需頻繁輪轉憑證就可以長期訪問雲端服務 |
是 |
AK |
長期 |
手動輪轉 |
|
|
部署運行在不可信的環境的應用程式,希望能控制訪問的有效期間、許可權 |
是 |
STS Token |
臨時 |
自訂 |
|
|
需要通過外部系統擷取訪問憑證的應用程式 |
否 |
STS Token |
臨時 |
自動重新整理 |
方式一:使用AK
如果您的應用程式部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問您的OSS,且不能頻繁輪轉憑證時,您可以使用阿里雲主帳號或RAM使用者的AK(Access Key ID、Access Key Secret)初始化憑證提供者。需要注意的是,該方式需要您手動維護一個AK,存在安全性風險和維護複雜度增加的風險。如何擷取AK,請參見建立主帳號或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的風險。
remote_url(即範例程式碼中的authServerUrl)需您自行部署後端服務提供,並非阿里雲平台提供的URL。Credentials工具會通過HTTP GET請求該URL,並要求後端服務按下述協議返回臨時憑證。
-
為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應協議:
-
響應狀態代碼:200
-
響應體結構:
{ "StatusCode":200, "AccessKeyId":"AccessKeyId", "AccessKeySecret":"AccessKeySecret", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"SecurityToken" }
響應體中,
StatusCode由您的後端服務自行設定為200;AccessKeyId、AccessKeySecret、Expiration、SecurityToken這4個欄位的值均來自調用STS服務AssumeRole介面返回的Credentials對象,需要在後端服務中調用AssumeRole擷取後再封裝到響應體中返回。關於AssumeRole的詳細使用方法,請參見使用STS臨時訪問憑證訪問OSS。後端服務樣本(Python):
from alibabacloud_sts20150401.client import Client as StsClient from alibabacloud_sts20150401 import models as sts_models import json def get_credentials(): request = sts_models.AssumeRoleRequest( role_arn='<your_role_arn>', role_session_name='<your_session_name>' ) response = sts_client.assume_role(request) creds = response.body.credentials return json.dumps({ 'StatusCode': 200, 'AccessKeyId': creds.access_key_id, 'AccessKeySecret': creds.access_key_secret, 'Expiration': creds.expiration, 'SecurityToken': creds.security_token })後端服務樣本(Node.js):
const STS = require("@alicloud/sts20150401"); const stsClient = new STS.default({ accessKeyId: "<yourAccessKeyId>", accessKeySecret: "<yourAccessKeySecret>", endpoint: "sts.aliyuncs.com", }); const result = await stsClient.assumeRole("<roleArn>", "<sessionName>"); const creds = result.body.credentials; res.status(200).json({ StatusCode: 200, AccessKeyId: creds.accessKeyId, AccessKeySecret: creds.accessKeySecret, Expiration: creds.expiration, SecurityToken: creds.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; * } * }); */