Este tópico descreve como usar o Alibaba Cloud Security Token Service (STS) e URLs pré-assinadas para conceder acesso temporário a recursos do Object Storage Service (OSS).
Observações
Defina um período de validade tanto para as credenciais temporárias do STS quanto para as URLs pré-assinadas. Ao gerar uma URL pré-assinada com credenciais temporárias do STS, prevalece o menor dos dois períodos. Por exemplo, se você definir a validade das credenciais temporárias do STS como 1.200 segundos e a da URL pré-assinada como 3.600 segundos, a URL expirará após 1.200 segundos.
Este tópico usa o endpoint público da região China (Hangzhou) como exemplo. Para acessar o OSS a partir de outros produtos da Alibaba Cloud na mesma região, use um endpoint interno. Para obter mais informações sobre as regiões e endpoints compatíveis com o OSS, consulte Regiões e endpoints.
Este tópico apresenta um exemplo de criação de cliente usando um nome de domínio do OSS. Para saber como criar um OSSClient com um nome de domínio personalizado ou STS, consulte Inicializar um cliente.
Usar o STS para autorização temporária
O Alibaba Cloud Security Token Service (STS) permite conceder acesso temporário ao OSS. Esse serviço web fornece tokens de acesso temporário para usuários de computação em nuvem. Com o STS, você pode emitir credenciais de acesso temporário com permissões e período de validade personalizados para aplicações de terceiros ou subusuários. Um subusuário é aquele cuja identidade você gerencia. Para mais detalhes sobre o STS, consulte O que é o STS?.
As vantagens do STS incluem:
Evita a exposição do seu par de AccessKey de longo prazo a aplicações de terceiros. Em vez disso, gere um token de acesso temporário com permissões específicas e validade definida para fornecer à aplicação.
Elimina a necessidade de revogar permissões manualmente, pois o acesso é revogado automaticamente quando o token expira.
Siga as etapas abaixo para usar o STS na concessão de acesso temporário ao OSS:
-
Obtenha credenciais de acesso temporárias.
Essas credenciais incluem um par de AccessKey temporário (AccessKey ID e AccessKey secret) e um token de segurança. O período de validade é medido em segundos. O valor mínimo é 900 segundos. O valor máximo corresponde à duração máxima da sessão configurada para a função do RAM. Para mais informações, consulte Definir a duração máxima da sessão para uma função do RAM.
Você pode obter credenciais de acesso temporárias de duas formas:
-
Método 1
Chame a operação AssumeRole do STS.
-
Método 2
-
Use as credenciais de acesso temporárias para fazer upload de um arquivo.
require 'aliyun/sts'
require 'aliyun/oss'
sts = Aliyun::STS::Client.new(
# Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Specify the ARN of the role and a custom session name.
token = sts.assume_role('role-arn', 'session-name')
client = Aliyun::OSS::Client.new(
# The China (Hangzhou) endpoint is used as an example. Specify the endpoint based on your actual region.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# The temporary AccessKey pair (AccessKey ID and AccessKey secret) obtained from STS.
access_key_id: 'token.access_key_id',
access_key_secret: 'token.access_key_secret',
# The security token obtained from STS.
sts_token: 'token.security_token')
# Specify the bucket name. For example, examplebucket.
bucket = client.get_bucket('examplebucket')
# Upload a file.
bucket.put_object('exampleobject.txt', :file => 'D:\\localpath\\examplefile.txt')
Usar uma URL pré-assinada para autorização temporária
Observações
-
Ao gerar uma URL pré-assinada, o SDK usa informações de chave armazenadas localmente para calcular uma assinatura com base em um algoritmo específico. Em seguida, o SDK anexa essa assinatura à URL para garantir sua validade e segurança. Esse processo de cálculo da assinatura e construção da URL ocorre no cliente e não envolve requisições de rede. Portanto, o chamador não precisa de permissões específicas para gerar a URL pré-assinada. No entanto, para garantir que usuários terceiros possam executar as operações desejadas nos recursos por meio da URL pré-assinada, assegure-se de que a identidade usada na geração da URL possua as permissões necessárias.
Por exemplo, para baixar ou visualizar um arquivo usando uma URL pré-assinada, é necessária a permissão oss:GetObject.
Gere uma URL pré-assinada e forneça-a a um visitante para acesso temporário. Durante a geração, especifique o período de validade da URL para limitar o tempo durante o qual o visitante poderá acessar dados específicos.
Para gerar uma URL pré-assinada destinada ao acesso de recursos via HTTPS, defina o protocolo no endpoint como HTTPS.
A URL pré-assinada gerada pelo código de exemplo abaixo pode conter um sinal de mais (
+). Nesse caso, substitua o sinal de mais (+) na URL por%2B. Caso contrário, a URL pré-assinada poderá não funcionar corretamente para acessar o objeto.
Gerar uma URL pré-assinada e usá-la para baixar um arquivo
-
Gere uma URL pré-assinada para baixar um arquivo.
require 'aliyun/oss' client = Aliyun::OSS::Client.new( # The China (Hangzhou) endpoint is used as an example. Specify the endpoint based on your actual region. endpoint: 'https://oss-cn-hangzhou.aliyuncs.com', # Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. access_key_id: ENV['OSS_ACCESS_KEY_ID'], access_key_secret: ENV['OSS_ACCESS_KEY_SECRET'] ) # Specify the bucket name. For example, examplebucket. bucket = client.get_bucket('examplebucket') # Generate a presigned URL and set its validity period to 1 hour (3600 seconds). puts bucket.object_url('my-object', true, 3600) -
Baixe um objeto usando uma URL assinada em dispositivos móveis ou navegadores.
// Enter the generated signed URL. String url = ""; OkHttpClient client = new OkHttpClient(); // Use the signed URL to download the object. Request getRequest = new Request.Builder() .url(url) .get() .build(); client.newCall(getRequest).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.code() == 203 || response.code() >= 300) { Log.d("download", "fail"); Log.d("download", response.body().string()); return; } // The object is downloaded. InputStream inputStream = response.body().byteStream(); byte[] buffer = new byte[2048]; int len; while ((len = inputStream.read(buffer)) != -1) { // Process the downloaded data. For example, display the image or perform a write operation on the object. } } });// Use the signed URL to download the object. NSURL * url = [NSURL URLWithString:urlString]; NSURLRequest * request = [NSURLRequest requestWithURL:url]; NSURLSession * session = [NSURLSession sharedSession]; NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"download error: %@", error); return; } else if (((NSHTTPURLResponse*)response).statusCode == 203 || ((NSHTTPURLResponse*)response).statusCode >= 300) { NSString *body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"download error: %@", body); return; } NSLog(@"download success"); }]; [sessionTask resume];// You can also use the download attribute in the <a> tag of an HTML page or window.open of a web API to obtain an object URL.
Referências
Para obter descrições detalhadas de uso e parâmetros sobre a concessão de acesso temporário via STS, consulte a documentação da API.
Para mais informações sobre como adicionar informações de assinatura a uma URL e fornecê-la a terceiros para conceder acesso autorizado, consulte Versão 1 da Assinatura.