すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:iOS 用 OSS SDK を使用したアクセスの承認

最終更新日:Jun 19, 2025

iOS 用 Object Storage Service (OSS) SDK は、モバイルデータセキュリティを確保するために、Security Token Service (STS) 認証モード、自己署名モード、および署名付き URL を提供します。

注意事項

STS 認証モードまたは自己署名モードを使用する場合は、使用するコールバック関数がセキュリティトークンと署名を返すことができることを確認してください。 コールバック関数でリクエストを送信してアプリケーションサーバーからトークンと署名を取得する必要がある場合は、ネットワークライブラリに含まれる同期 API 操作を呼び出すことをお勧めします。 コールバック関数は、SDK によって生成されたリクエストの子スレッドで実行され、メインスレッドをブロックしません。

STS 認証モード

STS によって提供される一時的なアクセス認証情報を使用して OSS にアクセスするには、次の操作を実行します。

  1. 一時的なアクセス認証情報を取得します。

    一時的なアクセス認証情報には、セキュリティトークンと一時的な AccessKey ペアが含まれています。 AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。 一時的なアクセス認証情報の最小有効期間は 900 秒です。 一時的なアクセス認証情報の最大有効期間は、現在のロールに指定された最大セッション期間です。 詳細については、「RAM ロールの最大セッション期間を指定する」をご参照ください。

    一時的なアクセス認証情報を取得するには、次のいずれかの方法を使用できます。

    • 方法 1

      AssumeRole 操作を呼び出します。

    • 方法 2

      STS SDK を使用します。 詳細については、「STS SDK の概要」をご参照ください。

  2. 一時的なアクセス認証情報を使用して、iOS 用 OSS SDK を初期化します。

    id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"];
    client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];
    説明

    OSSAuthCredentialProvider を使用して、iOS 用 OSS SDK を初期化できます。 詳細については、「初期化」をご参照ください。

    一時的なアクセス認証情報を使用して SDK を初期化する場合は、STS トークンの有効期間に注意してください。 次のサンプルコードは、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]];
    // STS トークンの有効期限が 5 分以内に切れようとしています。
    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];
    }
    • STS トークンを手動で更新する

      STS トークンの有効期限が切れそうになったら、次の方法を使用して新しい OSSClient インスタンスを作成するか、CredentialProvider を更新できます。

      id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"];
      client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];
    • STS トークンを自動的に更新する

      SDK で STS トークンを自動的に更新する場合は、アプリでコールバックを実装する必要があります。 コールバックはフェデレーショントークン (STS トークン) を取得し、SDK に返します。 SDK は STS トークンを使用して署名を生成します。 STS トークンを更新する必要がある場合、SDK はコールバックを呼び出して新しいトークンを取得します。

      id<OSSCredentialProvider> credential = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * {
          // フェデレーショントークンを取得し、OSSFederationToken オブジェクトとして返す関数を実装します。
          // フェデレーショントークンが取得されない場合は、nil が返されます。
            OSSFederationToken * token;
          // サーバーからフェデレーショントークンを取得します。
          ...
          return token;
      }];
      client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];
      説明

      他の方法を使用して STS トークンの生成に必要なすべてのフィールドを取得する場合は、コールバックでトークンを直接返すことができます。 この場合、トークンを手動で更新してから、OSSClient インスタンスの OSSCredentialProvider を再構成する必要があります。

      トークンをリクエストするサーバーの URL が http://localhost:8080/distribute-token.json の場合、次のサンプルレスポンスが返されます。

      {
          "StatusCode": 200,
          "AccessKeyId":"STS.iA645eTOXEqP3cg3****",
          "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU****",
          "Expiration":"2015-11-03T09:52:59Z",
          "SecurityToken":"CAES7QIIARKAAZPlqaN9ILiQZPS+JDkS/GSZN45RLx4YS/p3OgaUC+oJl3XSlbJ7StKpQ****"
      }                           

      次のサンプルコードは、OSSFederationCredentialProvider を実装する方法の例を示しています。

      id<OSSCredentialProvider> credential2 = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * {
          // アプリケーションサーバーにアクセスするためのリクエストを作成します。
          NSURL * url = [NSURL URLWithString:@"http://localhost:8080/distribute-token.json"];
          // リクエストを使用して、サーバーに必要なパラメーターを設定します。
          NSURLRequest * request = [NSURLRequest requestWithURL:url];
          OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource];
          NSURLSession * session = [NSURLSession sharedSession];
          // リクエストを送信します。
          NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request
                                                      completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                          if (error) {
                                                              [tcs setError:error];
                                                              return;
                                                          }
                                                          [tcs setResult:data];
                                                      }];
          [sessionTask resume];
          // リクエストへのレスポンスが返されるまで待ちます。
          [tcs.task waitUntilFinished];
          // 返された結果を解析します。
          if (tcs.task.error) {
              NSLog(@"get token error: %@", tcs.task.error);
              return nil;
          } else {
              // 返されたデータは JSON 形式です。 データを解析して、トークンのフィールドの値を取得します。
              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;
          }
      }];

署名付き URL

使用上の注意

  • OSS SDK を使用して署名付き URL を生成する場合、OSS SDK はローカルコンピューターに保存されているキー情報に基づいて特定のアルゴリズムを使用して署名を計算し、URL に署名を追加して URL の有効性とセキュリティを確保します。 URL を計算および構築するための操作は、クライアントで完了します。 ネットワーク経由でサーバーにリクエストを送信する必要はありません。 この方法では、署名付き URL を生成するときに、呼び出し元に特定の権限を付与する必要はありません。 ただし、サードパーティユーザーが署名付き URL によって承認されたリソースに対して関連操作を実行できるようにするには、署名付き URL を生成する API 操作を呼び出すプリンシパルが対応する権限を持っていることを確認する必要があります。

    たとえば、プリンシパルが署名付き URL を使用してオブジェクトをアップロードする場合、プリンシパルに oss:PutObject 権限を付与する必要があります。 プリンシパルが署名付き URL を使用してオブジェクトをダウンロードまたはプレビューする場合、プリンシパルに oss:GetObject 権限を付与する必要があります。

  • 次のサンプルコードを使用して生成された署名付き URL には、プラス記号(+)が含まれている場合があります。 この場合、URL 内のプラス記号(+)を %2B に置き換えます。 そうしないと、署名付き URL を使用してオブジェクトにアクセスできない場合があります。

署名付き URL を使用してオブジェクトをアップロードする

  1. 署名付き URL を生成します。

    // バケットの名前を指定します。
    NSString *bucketName = @"examplebucket";
    // オブジェクトの名前を指定します。
    NSString *objectKey = @"exampleobject.txt";
    NSURL *file = [NSURL fileURLWithPath:@"<filePath>"];
    NSString *contentType = [OSSUtil detemineMimeTypeForFilePath:file.absoluteString uploadName:objectKey];
    __block NSString *urlString;
    // オブジェクトをアップロードするための有効期間を持つ署名付き URL を生成します。 この例では、URL の有効期間は 30 分です。
    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. 署名付き URL を使用してオブジェクトをアップロードします。

    // 署名付き 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];

署名付き URL を使用してオブジェクトをダウンロードする

  1. 署名付き URL を生成します。

    // バケットの名前を指定します。
    NSString *bucketName = @"examplebucket";
    // オブジェクトの名前を指定します。
    NSString *objectKey = @"exampleobject.txt";
    __block NSString *urlString;
    // オブジェクトをダウンロードするための有効期間を持つ署名付き URL を生成します。 この例では、URL の有効期間は 30 分です。
    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. 署名付き URL を使用してオブジェクトをダウンロードします。

    // 署名付き URL を使用してオブジェクトをダウンロードします。
    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];