O SDK do Object Storage Service (OSS) para iOS oferece o modo de autenticação STS (Security Token Service), o modo autoassinado e URLs pré-assinadas para garantir a segurança dos dados em dispositivos móveis.
Observações
Ao usar o modo de autenticação STS ou o modo autoassinado, certifique-se de que a função de callback retorne o token de segurança e a assinatura. Se for necessário obter o token e a assinatura do servidor de aplicativos mediante requisição na função de callback, chame as operações síncronas da API disponíveis na biblioteca de rede. A função de callback executa na thread secundária da requisição gerada pelo SDK, sem bloquear a thread principal.
Modo de autenticação STS
Para acessar o OSS com credenciais de acesso temporárias fornecidas pelo STS, execute as etapas a seguir:
-
Obtenha as credenciais de acesso temporárias.
As credenciais de acesso temporárias incluem um token de segurança e um par de AccessKey temporário. Um par de AccessKey consiste em um AccessKey ID e um AccessKey secret. O período mínimo de validade dessas credenciais é de 900 segundos. O período máximo corresponde à duração máxima da sessão definida para a função atual. Para mais informações, consulte Especificar a duração máxima da sessão para uma função RAM.
Use um dos métodos a seguir para obter as credenciais de acesso temporárias:
-
Método 1
Chame a operação AssumeRole.
-
Método 2
Obtenha as credenciais de acesso temporárias pelos SDKs do STS para várias linguagens.
-
-
Inicialize o SDK do OSS para iOS com as credenciais de acesso temporárias.
id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];NotaVocê pode usar o OSSAuthCredentialProvider para inicializar o SDK do OSS para iOS. Para mais informações, consulte Inicialização.
Ao inicializar o SDK com credenciais de acesso temporárias, observe o período de validade do token STS. O código de exemplo a seguir demonstra como verificar a validade de um token STS:
NSDateFormatter * fm = [NSDateFormatter new]; fm.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; [fm setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; NSDate *expirationDate = [fm dateFromString:@"<StsToken.Expiration>"]; NSTimeInterval interval = [expirationDate timeIntervalSinceDate:[NSDate date]]; // The STS token is about to expire within less than five minutes. if (interval < 5 * 60) { id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential]; }-
Atualizar manualmente o token STS
Quando o token STS estiver prestes a expirar, crie uma nova instância de OSSClient ou atualize o CredentialProvider pelo método a seguir:
id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential]; -
Atualizar automaticamente o token STS
Para que o SDK atualize o token STS automaticamente, implemente um callback no aplicativo. Esse callback obtém um token de federação (token STS) e o retorna ao SDK, que o utiliza para gerar assinaturas. Sempre que o token STS precisar de renovação, o SDK invocará o callback para obter um novo token.
id<OSSCredentialProvider> credential = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * { // Implement a function that obtains a federation token and returns it as an OSSFederationToken object. // If the federation token is not obtained, nil is returned. OSSFederationToken * token; // Obtain a federation token from your server. ... return token; }]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];NotaSe você obtiver todos os campos necessários para gerar um token STS por outros meios, retorne o token diretamente no callback. Nesse caso, atualize o token manualmente e reconfigure o OSSCredentialProvider da instância OSSClient.
Se a URL do servidor de onde você solicita o token for http://localhost:8080/distribute-token.json, a resposta de exemplo a seguir será retornada:
{ "StatusCode": 200, "AccessKeyId":"STS.iA645eTOXEqP3cg3****", "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU****", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"CAES7QIIARKAAZPlqaN9ILiQZPS+JDkS/GSZN45RLx4YS/p3OgaUC+oJl3XSlbJ7StKpQ****" }O código de exemplo a seguir ilustra como implementar o OSSFederationCredentialProvider:
id<OSSCredentialProvider> credential2 = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * { // Create a request to access your application server. NSURL * url = [NSURL URLWithString:@"http://localhost:8080/distribute-token.json"]; // Use a request to set the parameters required by your server. NSURLRequest * request = [NSURLRequest requestWithURL:url]; OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource]; NSURLSession * session = [NSURLSession sharedSession]; // Send the request. NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { [tcs setError:error]; return; } [tcs setResult:data]; }]; [sessionTask resume]; // Wait until the response to the request is returned. [tcs.task waitUntilFinished]; // Parse the returned results. if (tcs.task.error) { NSLog(@"get token error: %@", tcs.task.error); return nil; } else { // The returned data is in the JSON format. Parse the data to obtain the values of the fields of the token. NSDictionary * object = [NSJSONSerialization JSONObjectWithData:tcs.task.result options:kNilOptions error:nil]; OSSFederationToken * token = [OSSFederationToken new]; token.tAccessKey = [object objectForKey:@"AccessKeyId"]; token.tSecretKey = [object objectForKey:@"AccessKeySecret"]; token.tToken = [object objectForKey:@"SecurityToken"]; token.expirationTimeInGMTFormat = [object objectForKey:@"Expiration"]; NSLog(@"get token: %@", token); return token; } }];
-
Modo autoassinado
Armazene o AccessKey ID e o AccessKey secret no servidor para assinar as informações do cliente. O procedimento é o seguinte:
-
No cliente, obtenha e envie a string a ser assinada para o seu servidor.
Ao construir a requisição, obtenha a string a ser assinada pelo método signContent do OSSCustomSignerCredentialProvider no SDK.
Envie a string pendente de assinatura para o seu servidor.
-
Assine a string no seu servidor e retorne a string assinada ao cliente.
-
Assine a string pendente conforme o algoritmo de assinatura especificado pelo OSS. Para mais informações sobre o algoritmo, consulte Assinatura versão 1.
O formato do algoritmo de assinatura é
signature = "OSS " + AccessKeyId + ":" + base64(hmac-sha1(AccessKeySecret, content)), em quecontentrepresenta a string concatenada a partir dos parâmetros da requisição. O código de exemplo a seguir mostra como obter uma assinatura:id<OSSCredentialProvider> credential = [[OSSCustomSignerCredentialProvider alloc] initWithImplementedSigner:^NSString *(NSString *contentToSign, NSError *__autoreleasing *error) { // 按照OSS规定的签名算法加签字符串,并将得到的加签字符串拼接AccessKeyId后返回。 // 将加签的字符串传给您的服务器,然后返回签名。 // 如果因某种原因加签失败,服务器描述错误信息后返回nil。 NSString *signature = [OSSUtil calBase64Sha1WithData:contentToSign withSecret:@"<your accessKeySecret>"]; // 此处为用SDK内的工具函数进行本地加签,建议您通过业务server实现远程加签。 if (signature != nil) { *error = nil; } else { *error = [NSError errorWithDomain:@"<your domain>" code:-1001 userInfo:@"<your error info>"]; return nil; } return [NSString stringWithFormat:@"OSS %@:%@", @"<your accessKeyId>", signature]; }]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential]; Retorne a string assinada ao cliente.
-
No cliente, envie a string assinada ao servidor OSS para autenticação.
URLs pré-assinadas
Observações de uso
-
Ao gerar uma URL pré-assinada com o SDK do OSS, o sistema calcula uma assinatura com um algoritmo específico baseado nas informações-chave armazenadas localmente e a adiciona à URL para garantir sua validade e segurança. Os cálculos e a construção da URL ocorrem inteiramente no cliente, o que elimina a necessidade de enviar requisições pela rede ao servidor. Assim, não é preciso conceder permissões específicas ao chamador durante a geração da URL pré-assinada. No entanto, para permitir que terceiros executem operações nos recursos autorizados pela URL, a entidade que invoca as operações da API para gerar a URL pré-assinada deve ter as permissões correspondentes.
Por exemplo, se uma entidade deseja fazer upload de um objeto com uma URL pré-assinada, conceda a permissão oss:PutObject a ela. Se o objetivo for baixar ou visualizar um objeto, atribua a permissão oss:GetObject à entidade.
A URL pré-assinada gerada pelo código de exemplo a seguir 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á falhar ao acessar o objeto conforme esperado.