iOS用のObject Storage Service (OSS) SDKは、Security Token Service (STS) 認証モード、自己署名モード、および署名付きURLを提供し、モバイルデバイスのデータセキュリティを確保します。
使用上の注意
STS認証モードまたは自己署名モードを使用する場合は、実装するコールバック関数がセキュリティトークンと署名を返すことができることを確認してください。 コールバック関数でリクエストを送信してアプリサーバーからトークンと署名を取得する必要がある場合は、ネットワークライブラリに含まれる同期API操作を呼び出すことを推奨します。 コールバック関数は、SDKによって生成されたリクエストの子スレッドで実行され、メインスレッドをブロックしません。
STS認証モード
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の操作を実行します。
- 一時的なアクセス資格情報を取得します。
一時的なアクセス資格情報は、AccessKeyペアとセキュリティトークンで構成されます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。
次のいずれかの方法を使用して、一時的なアクセス資格情報を取得できます。
- 方法1:
AssumeRole操作を呼び出して、一時的なアクセス資格情報を取得できます。
- 方法2:
STS SDKを使用して、一時的なアクセス資格情報を取得できます。 詳細については、「STS SDKの概要」をご参照ください。
- 方法1:
- 一時的なアクセス資格情報を使用して、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; } }];
- STSトークンを手動で更新する
自己署名モード
- クライアントから署名する文字列を取得し、自分のサーバーに送信します。
- リクエストの作成時に、OSS SDK for iOSが提供するOSSCustomSignerCredentialProviderのsignContentメソッドを使用して、文字列の署名を取得します。
- 文字列署名を自分のサーバーに送信します。
- 独自のサーバーで文字列に署名し、署名された文字列をクライアントに返します。
- 指定された署名アルゴリズムを使用して文字列に署名します。 署名アルゴリズムの詳細については、「承認ヘッダーに署名を含める」をご参照ください。
署名アルゴリズムの形式は、
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];
- 署名された文字列をクライアントに返します。
- 指定された署名アルゴリズムを使用して文字列に署名します。 署名アルゴリズムの詳細については、「承認ヘッダーに署名を含める」をご参照ください。
- クライアントの署名された文字列を認証のためにOSSサーバーに送信します。
署名付き URL
署名付きURLを使用して、オブジェクトをアップロードおよびダウンロードできます。
署名付き URL を使用したオブジェクトのアップロード
- オブジェクトのアップロードに使用する署名付き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を返します。}];
- 署名付き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 を使用してオブジェクトをダウンロード
- オブジェクトのダウンロードに使用する署名付き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を返します。}];
- 署名付き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];