Todos os produtos
Search
Central de documentação

Object Storage Service:Authorize access (iOS SDK)

Última atualização: Jul 03, 2026

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:

  1. 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:

  2. 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];
    Nota

    Você 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];
      Nota

      Se 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:

  1. No cliente, obtenha e envie a string a ser assinada para o seu servidor.

    1. Ao construir a requisição, obtenha a string a ser assinada pelo método signContent do OSSCustomSignerCredentialProvider no SDK.

    2. Envie a string pendente de assinatura para o seu servidor.

  2. Assine a string no seu servidor e retorne a string assinada ao cliente.

    1. 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 que content representa 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];
                  
    2. Retorne a string assinada ao cliente.

  3. 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.

Usar uma URL pré-assinada para fazer upload de um objeto

  1. Gere uma URL pré-assinada.

    // Specify the name of the bucket. 
    NSString *bucketName = @"examplebucket";
    // Specify the name of the object. 
    NSString *objectKey = @"exampleobject.txt";
    NSURL *file = [NSURL fileURLWithPath:@"<filePath>"];
    NSString *contentType = [OSSUtil detemineMimeTypeForFilePath:file.absoluteString uploadName:objectKey];
    __block NSString *urlString;
    // Generate a presigned URL with a validity period for uploading the object. In this example, the validity period of the URL is 30 minutes. 
    OSSTask *task = [client presignConstrainURLWithBucketName:bucketName
                                                withObjectKey:objectKey
                                                   httpMethod:@"PUT"
                                       withExpirationInterval:30 * 60
                                               withParameters:@{}
                                                  contentType:contentType
                                                   contentMd5:nil];
    [task continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
        if (task.error) {
            NSLog(@"presign error: %@", task.error);
        } else {
            urlString = task.result;
            NSLog(@"url: %@", urlString);
        }
        return nil;
    }];
  2. Use a URL pré-assinada para fazer upload do objeto.

    // Upload the object using the presigned URL. 
    NSURL * url = [NSURL URLWithString:urlString];
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"PUT";
    request.allHTTPHeaderFields = @{OSSHttpHeaderContentType: contentType};
    NSURLSession * session = [NSURLSession sharedSession];
    NSURLSessionTask * sessionTask = [session uploadTaskWithRequest:request
                                                           fromFile:file
                                                  completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"upload error: %@", error);
            return;
        } else if (((NSHTTPURLResponse*)response).statusCode == 203 ||
                   ((NSHTTPURLResponse*)response).statusCode >= 300) {
            NSString *body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"upload error: %@", body);
            return;
        }
        NSLog(@"upload success");
    }];
    [sessionTask resume];

Usar uma URL pré-assinada para baixe um objeto

  1. Gere uma URL pré-assinada.

    // Specify the name of the bucket. 
    NSString *bucketName = @"examplebucket";
    // Specify the name of the object. 
    NSString *objectKey = @"exampleobject.txt";
    __block NSString *urlString;
    // Generate a presigned URL with a validity period for downloading the object. In this example, the validity period of the URL is 30 minutes. 
    OSSTask *task = [client presignConstrainURLWithBucketName:bucketName
                                                withObjectKey:objectKey
                                                   httpMethod:@"GET"
                                       withExpirationInterval:30 * 60
                                               withParameters:@{}];
    [task continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
        if (task.error) {
            NSLog(@"presign error: %@", task.error);
        } else {
            urlString = task.result;
            NSLog(@"url: %@", urlString);
        }
        return nil;
    }];
  2. Use a URL pré-assinada para baixe o objeto

    // Use the presigned 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];