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

Object Storage Service:アクセス認証 (iOS SDK)

最終更新日:Nov 30, 2025

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

注意事項

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

STS 認証モード

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

  1. 一時的なアクセス認証情報の取得

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

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

  2. 一時的なアクセス認証情報を使用した iOS SDK の初期化

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

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

    一時的なアクセス認証情報を使用して 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];