iOS用のObject Storage Service (OSS) 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を使用します。 詳細については、「STS SDKの概要」をご参照ください。
一時的なアクセス資格情報を使用して、OSS SDK for iOSを初期化します。
id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; 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 = [expirationDate timeIntervalSinceDate:[NSDate date]]; // The STS token is about to expire within less than five minutes. 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 * { // Implement a function that obtains a federation token and returns it as an OSSFederationToken object. // If the federation token is not obtained, nil is returned. OSSFederationToken * token; // Obtain a federation token from your server. ... 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 * { // Create a request to access your application server. NSURL * url = [NSURL URLWithString:@"http://localhost:8080/distribute-token.json"]; // Use a request to set the parameters required by your server. NSURLRequest * request = [NSURLRequest requestWithURL:url]; OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource]; NSURLSession * session = [NSURLSession sharedSession]; // Send the request. NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { [tcs setError:error]; return; } [tcs setResult:data]; }]; [sessionTask resume]; // Wait until the response to the request is returned. [tcs.task waitUntilFinished]; // Parse the returned results. if (tcs.task.error) { NSLog(@"get token error: %@", tcs.task.error); return nil; } else { // The returned data is in the JSON format. Parse the data to obtain the values of the fields of the token. 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によって承認されたリソースに対して関連する操作を実行できるようにするには、API操作を呼び出して署名付きURLを生成するプリンシパルに対応する権限があることを確認する必要があります。
たとえば、プリンシパルが署名付きURLを使用してオブジェクトをアップロードする場合は、プリンシパルにoss:PutObject権限を付与する必要があります。 プリンシパルが署名付きURLを使用してオブジェクトをダウンロードまたはプレビューする場合は、プリンシパルにoss:GetObject権限を付与する必要があります。
次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (
+
) が含まれる場合があります。 この場合、URLのプラス記号 (+
) を% 2B
に置き換えます。 そうでない場合、署名付きURLを使用してオブジェクトにアクセスすることはできません。