Object Storage Service (OSS) の iOS SDK は、モバイルデータのセキュリティを確保するために、Security Token Service (STS) 認証モード、自己署名モード、および署名付き URL を提供します。
注意事項
STS 認証モードまたは自己署名モードを使用する場合、使用するコールバック関数がセキュリティトークンと署名を返すことができることを確認してください。コールバック関数内でリクエストを送信してアプリケーションサーバーからトークンと署名を取得する必要がある場合は、ネットワークライブラリに含まれる同期 API 操作を呼び出すことを推奨します。コールバック関数は、SDK によって生成されたリクエストの子スレッドで実行され、メインスレッドをブロックしません。
STS 認証モード
STS が提供する一時的なアクセス認証情報を使用して OSS にアクセスするには、次の操作を実行します。
一時的なアクセス認証情報の取得
一時的なアクセス認証情報には、セキュリティトークンと一時的な AccessKey ペアが含まれます。AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。一時的なアクセス認証情報の最小有効期間は 900 秒です。最大有効期間は、現在のロールに指定された最大セッション期間です。詳細については、「RAM ロールの最大セッション期間の指定」をご参照ください。
次のいずれかの方法で一時的なアクセス認証情報を取得できます。
方法 1
AssumeRole 操作を呼び出します。
方法 2
各種言語向けの STS SDK を使用して一時的なアクセス認証情報を取得できます。
一時的なアクセス認証情報を使用した 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 を使用してオブジェクトに期待どおりにアクセスできない可能性があります。