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

Object Storage Service:アクセス許可

最終更新日:Dec 19, 2023

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

使用上の注意

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

STS認証モード

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

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

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

    次のいずれかの方法を使用して、一時的なアクセス資格情報を取得できます。

    • 方法1:

      AssumeRole操作を呼び出して、一時的なアクセス資格情報を取得できます。

    • 方法2:

      STS SDKを使用して、一時的なアクセス資格情報を取得できます。 詳細については、「STS SDKの概要」をご参照ください。

  2. 一時的なアクセス資格情報を使用して、iOS.
    idのOSS SDKを初期化します。<OSSCredentialProvider> credential = [[OSSStsTokenCredialProvider alloc] initWithAccessKeyId:@ "<StsToken.AccessKeyId>" secretKeyId:@ "<StsToken. Security>"
    client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential]; 
    説明 OSSAuthCredentialProviderを使用してOSS SDK for iOSを初期化するには、「初期化」をご参照ください。

    一時的なアクセス資格情報を使用して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 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 * {
          // FederationTokenを取得し、OSSFederationTokenオブジェクトとして返します。 
          // FederationTokenが取得されない場合、nilが返されます。 
            OSSFederationToken * トークン;
          // サーバーからFederationTokenを取得します。 
          ...
          トークンを返します。}];
      client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential]; 
      説明 他の方法でSTSトークンを生成するために必要なすべてのフィールドを取得した場合は、コールバックでトークンを直接返すことができます。 この場合、トークンを手動で更新してから、OSSClientインスタンスのOSSCredentialProviderを再設定する必要があります。

      トークンを要求するサーバーのURLがhttp:// localhost:8080/distribute-token.jsonの場合、次のデータが返されます。

      {
          "StatusCode": 200、
          "AccessKeyId":"STS.iA645eTOXEqP3cg3 ****" 、
          "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU ****" 、
          "有効期限":"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;
          }
      }];

自己署名モード

次の操作を実行して、AccessKey IDとAccessKey secretを自分のサーバーに保存し、サーバー上のクライアント情報に署名できます。 以下の手順を実行します。
  1. クライアントから署名する文字列を取得し、自分のサーバーに送信します。
    1. リクエストの作成時に、OSS SDK for iOSが提供するOSSCustomSignerCredentialProviderのsignContentメソッドを使用して、文字列の署名を取得します。
    2. 文字列署名を自分のサーバーに送信します。
  2. 独自のサーバーで文字列に署名し、署名された文字列をクライアントに返します。
    1. 指定された署名アルゴリズムを使用して文字列に署名します。 署名アルゴリズムの詳細については、「承認ヘッダーに署名を含める」をご参照ください。

      署名アルゴリズムの形式は、signature = "OSS" + AccessKeyId + ":" + base64(hmac-sha1(AccessKeySecret, content)) です。 サンプルコード:

      id<OSSCredentialProvider> credential = [[OSSCustomSignerCredentialProvider alloc] initWithImplementedSigner:^ NSString *(NSString * contentToSign、NSError *__autoreleasing * error) {
          // 指定された署名アルゴリズムを使用して文字列に署名し、AccessKey IDを署名された文字列に連結してから、最後の文字列を返します。 
          // 署名された文字列を自分のサーバーに送信し、署名を返します。 
          // 文字列の署名に失敗した場合、サーバーはエラーメッセージとともにnilを返します。 
      NSString * signature = [OSSUtil calBase64Sha1WithData:contentToSign withSecret:@ "<your accessKeySecret>"]; // この例では、OSS SDK for iOSが提供するツールを使用して、クライアントで文字列に署名します。 ビジネスサーバーで文字列に署名することを推奨します。 
          if (signature != nil) {
              * エラー=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. 署名された文字列をクライアントに返します。
  3. クライアントの署名された文字列を認証のためにOSSサーバーに送信します。

署名付き URL

署名付きURLを使用して、オブジェクトをアップロードおよびダウンロードできます。

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

  1. オブジェクトのアップロードに使用する署名付きURLを生成します。
    // バケットの名前を指定します。 
    NSString * bucketName = @ "examplebucket";
    // オブジェクトの名前を指定します。 
    NSString * objectKey = @ "exampleobject.txt";
    NSURL * file = [NSURL fileURLWithPath:@ "<filePath>"];
    NSString * contentType = [OSSUtil detemineMimeTypeForFilePath:file.absoluteString uploadName:objectKey];
    __ブロック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);
        }
        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: リクエスト
                                                           fromFile: ファイル
                                                  completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@ "アップロードエラー: % @" 、エラー);
            戻る;
        } else if (((NSHTTPURLResponse *)response).statusCode == 203 | |
                   ((NSHTTPURLResponse *) レスポンス) 。statusCode >= 300) {
            NSString * body = [[NSString alloc] initWithData: データエンコード: NSUTF8StringEncoding];
            NSLog(@ "アップロードエラー: % @", body);
            return;
        }
        NSLog(@ "アップロード成功");
    }];
    [sessionTask resume]; 

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

  1. オブジェクトのダウンロードに使用する署名付きURLを生成します。
    // バケットの名前を指定します。 
    NSString * bucketName = @ "examplebucket";
    // オブジェクトの名前を指定します。 
    NSString * objectKey = @ "exampleobject.txt";
    __ブロック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);
        }
        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(@ "ダウンロードエラー: % @" 、エラー);
            戻る;
        } else if (((NSHTTPURLResponse *)response).statusCode == 203 | |
                   ((NSHTTPURLResponse *) レスポンス) 。statusCode >= 300) {
            NSString * body = [[NSString alloc] initWithData: データエンコード: NSUTF8StringEncoding];
            NSLog(@ "ダウンロードエラー: % @" 、本文);
            return;
        }
        NSLog(@ "ダウンロード成功");
    }];
    [sessionTask resume];