Para enviar solicitações ao OSS com o Android SDK, configure as credenciais de acesso. Escolha os provedores de credenciais adequados aos seus requisitos de autenticação e autorização.
Pré-requisitos
O OSS Android SDK está instalado. Instale o Android SDK.
Inicializar o provedor de credenciais
Escolha um provedor de credenciais
O OSS oferece vários métodos para inicializar provedores de credenciais. Escolha a opção adequada ao seu cenário.
Dispositivos móveis são ambientes não confiáveis. Credenciais de acesso total — pares de AccessKey de longo prazo ou tokens STS temporários — que cheguem ao cliente podem ser extraídas por engenharia reversa ou depuração em tempo de execução. Para reduzir o risco de vazamento de dados, estruture o caminho de acesso entre o aplicativo móvel e o OSS da seguinte forma:
Mantenha os pares de AccessKey de longo prazo no servidor de aplicativos. Nunca os envie ao cliente móvel.
Obtenha uma credencial temporária do STS ou uma URL pré-assinada no servidor de aplicativos antes de chamar o OSS.
Ao usar credenciais temporárias do STS, aplique uma política do RAM que restrinja as permissões ao prefixo de caminho de objeto de um único usuário e defina um curto período de validade.
Para uploads e downloads de dados sensíveis à privacidade, como documentos de identidade, imagens faciais, credenciais de pagamento ou registros médicos, gere uma URL pré-assinada no servidor de aplicativos. O aplicativo móvel nunca deve armazenar credenciais. Para obter detalhes sobre URLs pré-assinadas, consulte Authorize access (Android SDK).
|
Método de inicialização do provedor de credenciais |
Cenário |
Requer par de AccessKey ou token STS pré-configurado |
Tipo de credencial subjacente |
Validade da credencial |
Método de rotação ou atualização de credencial |
|
Ambientes seguros e estáveis, não vulneráveis a ataques externos, que exigem acesso de longo prazo sem rotação frequente de credenciais. |
Sim |
AccessKey |
Longo prazo |
Rotação manual |
|
|
Ambientes não confiáveis onde é necessário controlar a validade e as permissões das credenciais. |
Sim |
Token STS |
Temporária |
Personalizado |
|
|
Aplicações que obtêm credenciais de um sistema externo. |
Não |
Token STS |
Temporária |
Atualização automática |
Método 1: Usar um par de AccessKey
Use o par de AccessKey (AccessKey ID e AccessKey secret) de uma conta Alibaba Cloud ou de um usuário do RAM para inicializar o provedor de credenciais. Este método é adequado para ambientes seguros e estáveis que exigem acesso de longo prazo ao OSS sem rotação frequente de credenciais. A manutenção manual de chaves apresenta riscos de segurança e aumenta a complexidade operacional. Para obter um par de AccessKey, chame CreateAccessKey - Crie um par de AccessKey para uma conta Alibaba Cloud ou um usuário do RAM.
Este método não é recomendado para clientes móveis. Uma conta Alibaba Cloud possui permissões totais sobre todos os recursos. Se o par de AccessKey de uma conta Alibaba Cloud vazar, seu sistema enfrentará altos riscos de segurança. Caso seja indispensável usar este método, utilize o par de AccessKey de um usuário do RAM com as permissões mínimas necessárias.
Código de exemplo
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
CredentialProvider credentialProvider = new DefaultCredentialProvider(ak, sk);
Método 2: Usar um token STS
Use credenciais temporárias do STS para inicializar o provedor de credenciais. Esta opção é ideal para aplicações que requerem acesso temporário ao OSS com controle de permissões granular e em tempo real. As credenciais incluem um AccessKey ID, um AccessKey secret e um token STS. A manutenção manual de tokens gera riscos de segurança e eleva a complexidade de manutenção. Para obter um token STS, chame AssumeRole - Obtain temporary identity credentials for a RAM role.
Os exemplos a seguir mostram como atualize o token STS manual ou automaticamente.
Atualize manualmente o token STS
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
String token = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
CredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);
Atualize automaticamente o token STS
CredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
@Override
public OSSFederationToken getFederationToken() {
/* Obtain the AccessKey ID, AccessKey secret, STS token, and expiration time.
* The following example shows how to obtain the credentials from an application server:
* 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>";
// Construct an OSSFederationToken object from the AccessKey ID, AccessKey secret, STS token, and expiration time.
OSSFederationToken federationToken = new OSSFederationToken(ak, sk, token, expiration);
return federationToken;
}
};
Método 3: Usar CredentialsURI
Use o CredentialsURI para inicializar o provedor de credenciais quando sua aplicação precisar obter credenciais de um sistema externo, permitindo gerenciamento flexível e acesso sem chaves. A implementação subjacente usa um token STS. A ferramenta Credentials utiliza a URI fornecida para recuperar um token STS e inicializar o cliente, eliminando a necessidade de fornecer diretamente um par de AccessKey ou um token STS.
A remote_url (authServerUrl no código de exemplo) deve ser fornecida por um service de backend implantado por você. Não se trata de uma URL fornecida pela Alibaba Cloud. A ferramenta Credentials envia uma solicitação HTTP GET para essa URL, e seu service de backend deve retornar credenciais temporárias em conformidade com o protocolo descrito abaixo.
-
A URI deve retornar uma resposta em conformidade com o seguinte protocolo:
Código de status da resposta: 200
-
Estrutura do corpo da resposta:
{ "StatusCode":200, "AccessKeyId":"AccessKeyId", "AccessKeySecret":"AccessKeySecret", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"SecurityToken" }No corpo da resposta, o campo
StatusCodeé definido como 200 pelo seu service de backend. Os camposAccessKeyId,AccessKeySecret,ExpirationeSecurityTokenprovêm do objeto Credentials retornado pela operaçãoAssumeRoledo STS. Seu service de backend deve chamarAssumeRolepara obter esses valores e incluí-los no corpo da resposta. Para mais informações sobreAssumeRole, consulte Use STS temporary access credentials to access OSS.
Exemplo de service de backend (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 })Exemplo de service de backend (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, }); -
Configure a credencial URI como credencial de acesso.
String authServerUrl = "<remote_url>"; OSSAuthCredentialsProvider credentialProvider = new OSSAuthCredentialsProvider(authServerUrl); /* If the data is encrypted, you can use the following code to decrypt it. * credentialProvider.setDecoder(new OSSAuthCredentialsProvider.AuthDecoder() { * @Override * public String decode(String data) { * String result = null; * // Decrypt the data. * // result = ... * return result; * } * }); */