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

:OSS SDK for Javaのアクセス資格情報を設定する方法

最終更新日:Nov 12, 2024

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

前提条件

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

初期化方法の選択

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

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

初期化メソッド

シナリオ

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

基本的なロジック

資格情報の有効期間

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

方法1: AccessKeyペアの使用

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

必須

AccessKey ペア

長期

手動ローテーション

方法2: 自動的にローテーションするAccessKeyペアを使用する

アプリケーションは、AccessKeyペアが漏洩のリスクが高く、クラウドサービスに長期間アクセスするためにアクセス資格情報を頻繁にローテーションする必要がある環境でデプロイおよび実行されます。

選択可能

AccessKey ペア

長期

自動回転

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

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

必須

セキュリティトークン

一時的

手動更新

方法4: RAMRoleARNを使用する

アプリケーションは、クロスアカウントアクセスなどのクラウドサービスへのアクセスを許可されている必要があります。

必須

セキュリティトークン

一時的

自動更新

方法5: 使用ECSRAMRole

アプリケーションは、Elastic Compute Service (ECS) インスタンス、elasticコンテナインスタンス、およびcontainer Service for Kubernetes (ACK) ワーカーノードでデプロイされ、実行されます。

選択可能

セキュリティトークン

一時的

自動更新

方法6: OIDCRoleARNを使用する

信頼できないアプリケーションは、ACKワーカーノードにデプロイされ、実行されます。

選択可能

セキュリティトークン

一時的

自動更新

方法7: Function ComputeのコンテキストでCredentialsパラメーターを使用する

アプリケーションの関数はFunction Computeにデプロイされ、実行されます。

選択可能

セキュリティトークン

一時的

更新する必要はありません

方法8: CredentialsURIの使用

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

選択可能

セキュリティトークン

一時的

自動更新

方法9: カスタムアクセス資格情報の使用

上記の方法のいずれも要件を満たしていない場合は、カスタム方法を指定してアクセス資格情報を取得できます。

Custom

Custom

Custom

Custom

方法1: AccessKeyペアの使用

アプリケーションが、外部攻撃に対して脆弱ではなく、OSSへの長期アクセスを必要とする安全で安定した環境にデプロイされている場合、Alibaba CloudアカウントまたはRAMユーザーのAccessKeyペアを使用して、認証情報プロバイダーを初期化できます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 この方法では、AccessKeyペアを手動で維持する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 AccessKeyペアを取得する方法の詳細については、「CreateAccessKey」をご参照ください。

環境変数

警告

Alibaba Cloudアカウントは、アカウントのすべてのリソースにフルアクセスできます。 Alibaba CloudアカウントのAccessKeyペアの漏洩は、システムに重大な脅威をもたらします。 したがって、資格情報プロバイダーを初期化するために必要最小限の権限が付与されているRAMユーザーのAccessKeyペアを使用することをお勧めします。

  1. AccessKeyペアを使用して環境変数を指定します。

    Mac OS X/Linux/Unix

    export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>

    Windows

    set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
  2. 環境変数を使用して資格情報を渡します。

    import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    
    public class AkDemoTest {
        public static void main(String[] args) throws Exception {
            // Obtain access credentials from environment variables.
            EnvironmentVariableCredentialsProvider credentialsProvider =  CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // Initialize the client by using credentialsProvider and perform subsequent operations.
        }
    }

静的な資格情報

コードで変数を指定して資格情報を使用できます。 ランタイム環境では、環境変数、構成ファイル、または他の外部データソースからの実際の資格証明値によって変数を渡すことができる。

次の手順では、構成ファイルを使用して資格情報を渡す方法について説明します。

  1. config.iniという名前の設定ファイルを作成します。

    [credentials]
    alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID>
    alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET>
  2. 設定ファイルを使用して資格情報を渡します。

    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentialProvider;
    import java.io.FileInputStream;
    import java.util.Properties;
    
    public class AkDemoTest {
        public static void main(String[] args) throws Exception {
            Properties properties = new Properties();
            // Specify the path of the configuration file.
            String configFilePath = "config.ini";
    
            // Read the configuration file.
            FileInputStream input = new FileInputStream(configFilePath);
            properties.load(input);
            input.close();
    
            // Obtain the AccessKey pair from the configuration file.
            String accessKeyId = properties.getProperty("alibaba_cloud_access_key_id");
            String accessKeySecret = properties.getProperty("alibaba_cloud_access_key_secret");
    
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
    
            // Initialize the client by using credentialsProvider and perform subsequent operations.
    
        }
    }

方法2: 自動的にローテーションするAccessKeyペアを使用する

アプリケーションがOSSに長期間アクセスする必要があるが、ランタイム環境がAccessKeyペアのリークのリスクに直面している場合は、AccessKeyペアを手動でローテーションする必要があります。 この場合、クライアントキーを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、AccessKeyペアを使用してOSSリソースにアクセスすることです。 クライアントキーを使用すると、key Management Service (KMS) は、マネージRAMユーザーのAccessKeyペアを自動的かつ定期的にローテーションし、RAMユーザーの静的AccessKeyペアを動的に変更できます。 これにより、AccessKeyペアがリークするリスクが軽減されます。 KMSは、漏洩したAccessKeyペアを迅速に置き換えるための即時ローテーションもサポートしています。 これにより、AccessKeyペアを手動で保守する必要がなくなり、セキュリティリスクと保守の複雑さが軽減されます。 クライアントキーの取得方法の詳細については、「AAPの作成」をご参照ください。

  1. クライアントに資格情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/alibabacloud-secretsmanager-client -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibabacloud-secretsmanager-client</artifactId>
        <version>1.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.7.0</version>
    </dependency>
  2. secretsmanager.propertiesという名前の構成ファイルを作成します。

    # Set the credential type to client_key.
    credentials_type=client_key
    
    # Specify the decryption password of the client key. You can read the decryption password from environment variables or a file.
    client_key_password_from_env_variable=<your client key private key password environment variable name>
    client_key_password_from_file_path=<your client key private key password file path>
    
    # Specify the path of the private key file of the client key.
    client_key_private_key_path=<your client key private key file path>
    
    # Specify the ID of the region in which you want to use KMS.
    cache_client_region_id=[{"regionId":"<regionId>"}]
  3. 設定ファイルを使用して資格情報を渡します。

    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient;
    import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder;
    import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException;
    import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo;
    import org.codehaus.jettison.json.JSONException;
    import org.codehaus.jettison.json.JSONObject;
    
    public class ClientKeyDemoTest {
        public static void main(String[] args) throws CacheSecretException {
            final SecretCacheClient client = SecretCacheClientBuilder.newClient();
            CredentialsProvider credentialsProvider = new CredentialsProvider() {
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    try {
                        SecretInfo secretInfo = client.getSecretInfo("<secretName>");
                        JSONObject jsonObject = new JSONObject(secretInfo.getSecretValue());
    
                        String accessKeyId = jsonObject.getString("AccessKeyId");
                        String accessKeySecret = jsonObject.getString("AccessKeySecret");
    
                        return new DefaultCredentials(accessKeyId, accessKeySecret);
                    } catch (CacheSecretException | JSONException e) {
                        return null;
                    }
                }
            };
            // Initialize the client by using credentialsProvider and perform subsequent operations.
        }
    }
    

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

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

  1. 一時的なアクセス資格情報を使用して環境変数を指定します。

    Mac OS X/Linux/Unix

    export OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>

    Windows

    set OSS_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
  2. 一時的なアクセス資格情報を渡す環境変数を指定します。

    import com.aliyun.oss.common.auth.CredentialsProviderFactory;
    import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
    
    public class StsDemoTest {
        public static void main(String[] args) throws Exception {
            // Obtain access credentials from environment variables.
            EnvironmentVariableCredentialsProvider credentialsProvider =  CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            
            // Initialize the client by using credentialsProvider and perform subsequent operations.
        }
    }

方法4: RAMRoleARNを使用する

アプリケーションがOSSへのアクセスを許可されている必要がある場合、たとえば、別のAlibaba CloudアカウントのOSSリソースにアクセスする場合、RAMRoleARNを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 RAMロールのAlibaba Cloud Resource Name (ARN) を指定すると、CredentialsツールはSTSからセキュリティトークンを取得し、セッションの有効期限が切れる前にセキュリティトークンを自動的に更新します。 policyパラメーターに値を割り当てて、RAMロールの権限を制限できます。 この方法では、AccessKeyペアを手動で提供する必要があることに注意してください。 これにより、セキュリティリスクが生じ、メンテナンスが複雑になります。 AccessKeyペアを取得する方法の詳細については、「CreateAccessKey」をご参照ください。 RAMロールARNを取得する方法の詳細については、「CreateRole」をご参照ください。

  1. 資格情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  2. AccessKeyペアとRAMRoleARNをアクセス資格情報として設定します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class RamRoleArnAkDemoTest {
    
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // Set the credential type to ram_role_arn.
            config.setType("ram_role_arn");
            // Specify the ARN of the RAM role that you want your application to assume by specifying the ALIBABA_CLOUD_ROLE_ARN environment variable. Example: acs:ram::123456789012****:role/adminrole.
            config.setRoleArn("<RoleArn>");
            // Obtain the AccessKey ID from the environment variable.
            config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID"));
            // Obtain the AccessKey secret from the environment variable.
            config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Specify the role session name by specifying the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
            config.setRoleName("<RoleSessionName>");
            // Optional. Specify limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // Optional. Specify the validity period of the role session.
            config.setRoleSessionExpiration(3600);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // Initialize the client by using credentialsProvider and perform subsequent operations.
        }
    }

方法5: 使用ECSRAMRole

アプリケーションがECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードで実行されている場合、ECSRAMRoleを使用して資格情報プロバイダーを初期化することを推奨します。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ECSRAMRoleを使用すると、ECSインスタンス、エラスティックコンテナインスタンス、またはACKワーカーノードにRAMロールをアタッチして、インスタンスのセキュリティトークンを自動的に更新できます。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 ECSRAMRoleロールの取得方法の詳細については、「CreateRole」をご参照ください。 ECSインスタンスにECSRAMRolesを割り当てる方法の詳細については、「インスタンスRAMロール」をご参照ください。

  1. 資格情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  2. アクセス資格情報としてECSRAMRoleを設定します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class EcsRamRoleDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // Set the credential type to ecs_ram_role. 
            config.setType("ecs_ram_role");
            // Specify the name of the RAM role that is attached to the ECS instance. This parameter is optional. If you do not configure this parameter, the system automatically searches for a RAM role. We recommend that you configure this parameter to reduce the number of requests. 
            config.setRoleName("<RoleName>");
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // Initialize the client by using credentialsProvider and perform subsequent operations.
        }
    }

方法6: OIDCRoleARNを使用する

ACKワーカーノードでRAMロールを設定すると、ノードのポッド内のアプリケーションは、ECSインスタンスにデプロイされたアプリケーションと同じ方法でメタデータサーバーを使用して、アタッチされたロールのセキュリティトークンを取得できます。 ただし、信頼されていないアプリケーション (顧客によって送信され、コードを使用できないアプリケーションなど) がワーカーノードにデプロイされている場合、アプリケーションがメタデータサーバーを使用してワーカーノードにアタッチされているRAMロールのセキュリティトークンを取得することはできません。 クラウドリソースのセキュリティを確保し、信頼できないアプリケーションが必要なセキュリティトークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるために、サービスアカウントのRAMロール (RRSA) 機能を使用できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 ACKは、さまざまなアプリケーションポッドの対応するOpenID Connect (OIDC) トークンファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。 資格情報ツールは、環境変数の構成情報を取得し、STSのAssumeRoleWithOIDC操作を呼び出して、アタッチされたロールのセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」をご参照ください。

  1. 資格情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  1. RAMロールを使用して、アクセス資格情報を提供します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class OidcRoleArnDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // Set the credential type to oidc_role_arn.
            config.setType("oidc_role_arn");
            // Specify the ARN of the RAM role by specifying the ALIBABA_CLOUD_ROLE_ARN environment variable.
            config.setRoleArn("<RoleArn>");
            // Specify the ARN of the OIDC IdP by specifying the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
            config.setOidcProviderArn("<OidcProviderArn>");
            // Specify the path of the OIDC token file by specifying the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
            config.setOidcTokenFilePath("<OidcTokenFilePath>");
            // Specify the role session name by specifying the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
            config.setRoleSessionName("<RoleSessionName>");
            // Optional. Specify limited permissions for the RAM role. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // Specify the validity period of the session.
            config.setRoleSessionExpiration(3600);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // Initialize the client by using credentialsProvider and perform subsequent operations.
        }
    }

方法7: Function ComputeのコンテキストでCredentialsパラメーターを使用する

アプリケーションの関数がfunction Computeにデプロイされて実行されている場合、Function ComputeのコンテキストでCredentialsパラメーターを使用して、資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 Function Computeは、関数に設定されたロールに基づいてサービスロールを引き受けることによってセキュリティトークンを取得します。 次に、Function ComputeのコンテキストでCredentialsパラメーターを使用して、セキュリティトークンがアプリケーションに渡されます。 セキュリティトークンは36時間有効です。 有効期間は変更できません。 関数の最大実行時間は24時間です。 したがって、関数の実行時に有効期限が切れないため、セキュリティトークンを更新する必要はありません。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 Function ComputeにOSSへのアクセスを許可する方法の詳細については、「他のAlibaba Cloudサービスへのアクセス権限の付与」をご参照ください。

  1. Function Computeのコンテキスト依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun.fc.runtime/fc-java-core -->
    <dependency>
        <groupId>com.aliyun.fc.runtime</groupId>
        <artifactId>fc-java-core</artifactId>
        <version>1.4.1</version>
    </dependency>
  2. Function ComputeコンテキストのCredentialsパラメーターを使用して、資格情報プロバイダーを初期化します。

    package example;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import com.aliyun.fc.runtime.Context;
    import com.aliyun.fc.runtime.Credentials;
    import com.aliyun.fc.runtime.StreamRequestHandler;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentialProvider;
    
    public class App implements StreamRequestHandler {
    
        @Override
        public void handleRequest(
            InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
    
            // Obtain the key information. Before you execute the function, make sure that the role of the service to which the function belongs is configured and the role must have the required OSS permissions. We recommend that you use the AliyunFCDefaultRole role.
            Credentials creds = context.getExecutionCredentials();
    
            // Use the obtained credential to create a credential provider instance.
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken());
    
            // Initialize the client by using credentialsProvider and perform subsequent operations.
    
            outputStream.write(new String("done").getBytes());
        }
    }

方法8: CredentialsURIの使用

アプリケーションが外部システムからAlibaba Cloudの資格情報を取得して、柔軟な資格情報管理とキーレスアクセスを実装する必要がある場合は、CredentialsURIを使用して資格情報プロバイダーを初期化できます。 この方法の基本的なロジックは、STSから取得したセキュリティトークンを使用してアクセス資格情報を設定することです。 資格情報ツールは、資格情報クライアントを初期化するために指定したURIを使用してセキュリティトークンを取得します。 この方法では、AccessKeyペアまたはセキュリティトークンを手動で管理する場合に発生するリスクを排除します。 CredentialsURI応答を提供するバックエンドサービスは、アプリケーションが常に有効な資格情報を取得できるように、セキュリティトークンを自動的に更新する必要があることに注意してください。

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

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

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

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. 資格情報の依存関係を追加します。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  3. アクセス資格情報としてCredentialsURIを設定します。

    import com.aliyun.credentials.models.CredentialModel;
    import com.aliyun.oss.common.auth.Credentials;
    import com.aliyun.oss.common.auth.CredentialsProvider;
    import com.aliyun.oss.common.auth.DefaultCredentials;
    
    public class CredentialsUriDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // Set the credential type to credentials_uri.
            config.setType("credentials_uri");
            // Specify the URI of the credential in the http://local_or_remote_uri/ format by specifying the ALIBABA_CLOUD_CREDENTIALS_URI environment variable.
            config.setCredentialsUri("<CredentialsUri>");
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(Credentials credentials) {
                }
    
                @Override
                public Credentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // Initialize the client by using credentialsProvider and perform subsequent operations.
        }
    }

方法9: カスタムアクセス資格情報を使用する

上記のメソッドのいずれも要件を満たしていない場合は、Credential Providers操作を呼び出して、アクセス資格情報を取得するカスタムメソッドを指定できます。 基になるロジックがセキュリティトークンの場合は、資格情報の更新サポートを提供する必要があります。

import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentials;

public class CustomCredentialProviderDemoTest {

    public static void main(String[] args) {

        CredentialsProvider credentialsProvider = new CredentialsProvider(){

            // Initialize variable.
            String accessKeyId = null;
            // Initialize variable.
            String accessKeySecrect = null;
            // Initialize variable.
            // String token = null;

            @Override
            public void setCredentials(Credentials credentials) {
            }

            @Override
            public Credentials getCredentials() {
                //TODO
                // Specify a custom method to obtain access credentials.

                // Return long-term access credentials, which consists of an AccessKey ID and an AccessKey secret.
                return new DefaultCredentials(accessKeyId, accessKeySecrect);

                // Return temporary access credentials, which consists of an AccessKey ID, an AccessKey secret, and a security token.
                // Refresh the temporary access credentials based on the expiration time. 
                // return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
            }
        };
        // Initialize the client by using credentialsProvider and perform subsequent operations.
    }
}

次に何をすべきか

資格情報プロバイダーを初期化した後、資格情報プロバイダーを使用してOSSClientインスタンスを作成する必要があります。 詳細については、「初期化」をご参照ください。