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

Object Storage Service:OSS SDK for iOSのアクセス資格情報を設定する方法を教えてください。

最終更新日:Aug 28, 2024

iOS用のObject Storage Service (OSS) SDKを使用してリクエストを開始するには、アクセス資格情報を設定する必要があります。 Alibaba Cloudサービスは、アクセス資格情報を使用してID情報とアクセス許可を検証します。 認証と承認の要件に基づいて、さまざまなタイプのアクセス資格情報を選択できます。

前提条件

iOS用のOSS SDKがインストールされています。 詳細については、「インストール」をご参照ください。

初期化方法の選択

資格情報プロバイダーの選択

OSSは、資格情報プロバイダーを初期化する複数の方法をサポートしています。 実際のシナリオの認証と承認の要件に基づいて、適切な方法を選択できます。

初期化メソッド

シナリオ

AccessKeyペアまたはセキュリティトークンが必要

基本的なロジック

資格情報の有効期間

資格情報のローテーションまたは更新方法

方法1: AccessKeyペアの使用

アプリケーションは、外部からの攻撃に対して脆弱ではなく、頻繁な資格情報のローテーションなしに長期間クラウドサービスにアクセスする必要がある、安全で安定した環境でデプロイおよび実行されます。

課金されます

AccessKey ペア

長期

手動ローテーション

方法2: セキュリティトークンの使用

アプリケーションは信頼できない環境でデプロイされ、実行されます。この場合、資格情報の有効期間とアクセス可能なリソースを管理します。

課金されます

セキュリティトークン

一時的

Custom

方法3: CredentialsURIの使用

アプリケーションには、外部システムからのアクセス資格情報が必要です。

課金されません

セキュリティトークン

一時的

自動更新

方法1: AccessKeyペアを使用する

アプリケーションが、外部攻撃に対して脆弱ではなく、OSSへの長期アクセスを必要とする安全で安定した環境にデプロイされている場合、Alibaba CloudアカウントまたはRAMユーザーのAccessKeyペアを使用して、認証情報プロバイダーを初期化できます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 この方法では、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: セキュリティトークンの使用

アプリケーションがOSSに一時的にアクセスし、データのセキュリティと柔軟性を向上させるためにリアルタイムできめ細かい方法でアクセス制御を管理する必要がある場合は、security token Service (STS) から取得したAccessKeyペアとセキュリティトークンで構成される一時的なアクセス資格情報を使用して、資格情報プロバイダーを初期化できます。 この方法では、セキュリティトークンを手動で管理する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 セキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。

AccessKeyペアとセキュリティトークン環境変数を指定して、アクセス資格情報を渡すことができます。 次のサンプルコードは、セキュリティトークンを更新するためにアクセス資格情報を渡す方法の例を示しています。

セキュリティトークンを手動で更新する

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]; 

セキュリティトークンを自動的に更新する

id<OSSCredentialProvider> credentialProvider = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * _Nullable{
    // Obtain an AccessKey pair, a security token, and the validity period of these credentials.

    /* In this example, the AccessKey pair, security token, and the validity period of these credentials are obtained from the application server.
    // Create a request to access your application server. 
    NSURL * url = [NSURL URLWithString:@"http://localhost:8080/distribute-token.json"];
    // Use a request to specify the parameters required by your application 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];
        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ツールは、クライアントでOSSClientインスタンスを初期化するために指定したURIを使用してセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。

  1. 資格情報ツールがセキュリティトークンを正しく解析して使用できるようにするには、URIが次の応答プロトコルに準拠している必要があります。

    • 応答ステータスコード: 200

    • レスポンスボディの構造:

      {
        "StatusCode":200,
        "AccessKeyId":"AccessKeyId",
        "AccessKeySecret":"AccessKeySecret",
        "Expiration":"2015-11-03T09:52:59Z",
        "SecurityToken":"SecurityToken"
      }                    
  2. URIをアクセス資格情報として設定します。

    NSString * authServerUrl = @ "<authServerUrl>";
    id<OSSCredentialProvider> credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:authServerUrl]; 
  3. データが暗号化されている場合は、次のサンプルコードを実行してデータを復号できます。

    NSString *authServerUrl = @"<authServerUrl>";
    id<OSSCredentialProvider> credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:authServerUrl responseDecoder:^NSData * _Nullable(NSData * _Nonnull data) {
        NSData *result = nil;
        // Decrypt the data.
        // result = ...
        return result;
    }];