使用Android SDK发起OSS请求,您需要配置访问凭证。阿里云服务会通过访问凭证验证您的身份信息和访问权限。您可以根据使用场景对认证和授权的要求,选择不同的方式提供凭证。
前提条件
在配置访问凭证前,您需要安装OSS Android SDK。详情请参见安装(Android SDK)。
初始化凭证提供者
凭证提供者选型
OSS支持多种方式初始化凭证提供者,您可以根据使用场景对认证和授权的要求,选择对应的方式初始化凭证提供者。
移动终端属于不受信任的环境,任何形式的完整访问凭证(包括长期AccessKey和临时STS Token)一旦下发到客户端,都可能通过逆向工程或运行时调试被提取。为降低数据泄露风险,建议按以下原则组织移动应用与OSS的访问链路:
-
长期AccessKey由业务服务器持有,不下发到移动端。
-
移动应用通过业务服务器获取STS临时凭证或预签名URL后再访问OSS。
-
使用STS临时凭证时,通过RAM Policy将权限严格限定到单用户的对象路径前缀,并设置较短的有效期。
-
对于身份证、人脸、支付凭证、医疗资料等隐私数据的上传或下载场景,建议由业务服务器生成预签名URL交移动应用使用,移动应用不接触任何凭证。预签名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的风险。
-
为了使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; * } * }); */