OSS SDK for iOS を使用してリクエストを送信するには、アクセス認証情報を設定する必要があります。Alibaba Cloud サービスは、アクセス認証情報を使用して、ID とアクセス権限を検証します。認証と権限付与の要件に応じて、さまざまな方法で認証情報を提供できます。
前提条件
アクセス認証情報を設定する前に、OSS SDK for iOS をインストールする必要があります。詳細については、「インストール」をご参照ください。
認証情報プロバイダーの初期化
認証情報プロバイダーの選択
OSS は、認証情報プロバイダーを初期化するための複数のメソッドをサポートしています。シナリオの認証と権限付与の要件に基づいてメソッドを選択できます。
初期化メソッド | シナリオ | 事前に必要な AccessKey ペアまたは STS トークン | 基盤となる認証情報 | 認証情報の有効期間 | 認証情報のローテーションまたはリフレッシュメソッド |
セキュアな環境で実行され、頻繁な認証情報のローテーションを行わずに、クラウドサービスへ長期的にアクセスする必要があるアプリケーション。 | はい | AccessKey | 長期 | 手動ローテーション | |
信頼できない環境で実行され、認証情報の有効期間と権限を制御してセキュリティを強化したいアプリケーション。 | はい | STS トークン | 一時的 | カスタム | |
外部システムからアクセス認証情報を取得する必要があるアプリケーション。 | いいえ | STS トークン | 一時的 | 自動リフレッシュ |
方法1:AccessKey ペアの使用
アプリケーションが OSS への長期アクセスを必要とし、セキュアで安定した環境にデプロイされており、頻繁な認証情報のローテーションをサポートできない場合は、Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ペアを使用して認証情報プロバイダーを初期化できます。AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。ただし、この方法では AccessKey ペアを手動でメンテナンスする必要があり、セキュリティリスクとメンテナンスの複雑さが増大します。AccessKey ペアの取得方法の詳細については、「CreateAccessKey」をご参照ください。
サンプルコード
NSString *ak = @"<ALIBABA_CLOUD_ACCESS_KEY_ID>";
NSString *sk = @"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
id<OSSCredentialProvider> credentialProvider = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:ak secretKey:sk];方法2:STS トークンの使用
アプリケーションが OSS への一時的なアクセスを必要とし、セキュリティと柔軟性を向上させるために詳細なアクセスの制御を実装し、リアルタイムで権限を調整したい場合は、Security Token Service (STS) の一時的な認証情報を使用して認証情報プロバイダーを初期化できます。これらの認証情報には、AccessKey ID、AccessKey Secret、および STS トークンが含まれます。ただし、この方法では STS トークンを手動でメンテナンスする必要があり、セキュリティリスクとメンテナンスの複雑さが増大します。STS トークンの取得方法の詳細については、「AssumeRole」をご参照ください。
コードで AccessKey ペアと STS トークンを指定して、認証情報を参照できます。次の例は、STS トークンを更新する方法を示しています。
STS トークンの手動更新
NSString *ak = @"<ALIBABA_CLOUD_ACCESS_KEY_ID>";
NSString *sk = @"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
NSString *token = @"<ALIBABA_CLOUD_SECURITY_TOKEN>";
id<OSSCredentialProvider> credentialProvider = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:ak
secretKeyId:sk
securityToken:token];STS トークンの自動更新
id<OSSCredentialProvider> credentialProvider = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * _Nullable{
// AccessKey ID、AccessKey Secret、STS トークン、および有効期限を取得します。
/* 次の例は、アプリケーションサーバから AccessKey ID、AccessKey Secret、STS トークン、および有効期限を取得する方法を示しています。
// アプリケーションサーバにアクセスするためのリクエストを構築します。
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];
NSString *ak = [object objectForKey:@"AccessKeyId"];
NSString *sk = [object objectForKey:@"AccessKeySecret"];
NSString *token = [object objectForKey:@"SecurityToken"];
NSString *expiration = [object objectForKey:@"Expiration"];
OSSFederationToken * federationToken = [OSSFederationToken new];
federationToken.tAccessKey = ak;
federationToken.tSecretKey = sk;
federationToken.tToken = token;
federationToken.expirationTimeInGMTFormat = expiration;
NSLog(@"get token: %@", federationToken);
return federationToken;
}
*/
NSString *ak = @"<ALIBABA_CLOUD_ACCESS_KEY_ID>";
NSString *sk = @"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
NSString *token = @"<ALIBABA_CLOUD_SECURITY_TOKEN>";
NSString *expiration = @"<EXPIRATION>";
OSSFederationToken * federationToken = [OSSFederationToken new];
federationToken.tAccessKey = ak;
federationToken.tSecretKey = sk;
federationToken.tToken = token;
federationToken.expirationTimeInGMTFormat = expiration;
return federationToken;
}];方法3:CredentialsURI の使用
アプリケーションが、柔軟な認証情報管理とキーレスアクセスのために、外部システムまたはカスタム設定から Alibaba Cloud の認証情報を取得し、自動的にリフレッシュする必要がある場合は、CredentialsURI を使用して認証情報プロバイダーを初期化できます。このメソッドは、基盤となる認証情報として STS トークンを使用します。Credentials ツールは、クライアントを初期化するために指定した URI から STS トークンを取得します。この方法では、AccessKey ペアや STS トークンを提供する必要がないため、手動メンテナンスのリスクが排除されます。
Credentials ツールが STS トークンを正しく解析して使用できるようにするには、URI が次のプロトコルに従った応答を返す必要があります:
応答ステータスコード:200
応答本文の構造:
{ "StatusCode":200, "AccessKeyId":"AccessKeyId", "AccessKeySecret":"AccessKeySecret", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"SecurityToken" }
URI 認証情報をアクセス認証情報として設定します。
NSString *authServerUrl = @"<authServerUrl>"; id<OSSCredentialProvider> credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:authServerUrl];データが暗号化されている場合は、次のメソッドを使用して復号化します。
NSString *authServerUrl = @"<authServerUrl>"; id<OSSCredentialProvider> credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:authServerUrl responseDecoder:^NSData * _Nullable(NSData * _Nonnull data) { NSData *result = nil; // データを復号化します。 // result = ... return result; }];