Android SDK を使用して Object Storage Service (OSS) にリクエストを送信するには、アクセス認証情報を設定する必要があります。Alibaba Cloud サービスは、アクセス認証情報を使用して、ID とアクセス権限を検証します。認証と権限付与の要件に応じて、さまざまな方法で認証情報を提供できます。
前提条件
アクセス認証情報を設定する前に、OSS Android SDK をインストールする必要があります。詳細については、「Android SDK のインストール」をご参照ください。
認証情報プロバイダーの初期化
認証情報プロバイダーの選択
OSS は、認証情報プロバイダーを初期化するための複数のメソッドをサポートしています。シナリオの認証および権限付与の要件を満たすメソッドを選択できます。
認証情報プロバイダーの初期化メソッド | シナリオ | 事前に設定された AccessKey ペアまたは STS トークンが必要か | 基盤となる認証情報タイプ | 認証情報の有効期間 | 認証情報のローテーションまたは更新メソッド |
安全で安定した環境で実行され、外部からの攻撃に対して脆弱ではなく、頻繁な認証情報のローテーションなしで Alibaba Cloud サービスへの長期的なアクセスが必要なアプリケーション。 | はい | AccessKey | 長期的 | 手動ローテーション | |
アクセス認証情報の有効期間と権限を制御する必要がある、信頼できない環境で実行されるアプリケーション。 | はい | STS トークン | 一時的 | カスタム | |
外部システムからアクセス認証情報を取得する必要があるアプリケーション。 | いいえ | STS トークン | 一時的 | 自動更新 |
方法 1:AccessKey ペアの使用
アプリケーションが安全で安定した環境で実行され、外部からの攻撃に対して脆弱ではなく、OSS への長期的なアクセスが必要で、頻繁な認証情報のローテーションが許可されていない場合は、Alibaba Cloud アカウントまたは Resource Access Management (RAM) ユーザーの AccessKey ペア (AccessKey ID と AccessKey Secret) を使用して認証情報プロバイダーを初期化できます。ただし、この方法では AccessKey ペアを手動でメンテナンスする必要があり、セキュリティリスクをもたらし、メンテナンスの複雑さが増します。AccessKey ペアの取得方法の詳細については、「CreateAccessKey - Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペアの作成」をご参照ください。
この方法にはセキュリティリスクがあり、モバイルクライアントには推奨されません。Alibaba Cloud アカウントは、そのすべてのリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、システムは高いセキュリティリスクにさらされます。この方法を使用する必要がある場合は、必要最小限の権限を持つ RAM ユーザーの AccessKey ペアを使用してください。
サンプルコード
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(ak, sk);方法 2:STS トークンの使用
アプリケーションが OSS への一時的なアクセス、きめ細かなアクセスの制御、およびセキュリティと柔軟性を向上させるためのリアルタイムの権限調整を必要とする場合は、Security Token Service (STS) から取得した一時的な認証情報を使用して認証情報プロバイダーを初期化できます。これらの認証情報には、AccessKey ID、AccessKey Secret、および STS トークンが含まれます。ただし、この方法では STS トークンを手動でメンテナンスする必要があり、セキュリティリスクをもたらし、メンテナンスの複雑さが増します。STS トークンの取得方法の詳細については、「AssumeRole - RAM ロールの一時的な認証情報の取得」をご参照ください。
コード内の AccessKey ペアと STS トークンを使用して、認証情報を参照できます。次の例では、STS トークンを更新する方法を示します。
STS トークンの手動更新
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
String token = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);STS トークンの自動更新
OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
@Override
public OSSFederationToken getFederationToken() {
/* AccessKey ID、AccessKey Secret、STS トークン、および有効期限を取得します。
* 次の例では、アプリケーションサーバーから認証情報を取得する方法を示します:
* URL stsUrl = new URL("<server_url>");
* HttpURLConnection conn = (HttpURLConnection) stsUrl.openConnection();
* InputStream input = conn.getInputStream();
* String jsonText = IOUtils.readStreamAsString(input, OSSConstants.DEFAULT_CHARSET_NAME);
* JSONObject jsonObjs = new JSONObject(jsonText);
* String ak = jsonObjs.getString("AccessKeyId");
* String sk = jsonObjs.getString("AccessKeySecret");
* String token = jsonObjs.getString("SecurityToken");
* String expiration = jsonObjs.getString("Expiration");
*/
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
String token = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
String expiration = "<ALIBABA_CLOUD_EXPIRATION>";
// AccessKey ID、AccessKey Secret、STS トークン、および有効期限から OSSFederationToken オブジェクトを構築します。
OSSFederationToken federationToken = new OSSFederationToken(ak, sk, token, 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 認証情報をアクセス認証情報として設定します。
String authServerUrl = "<remote_url>"; OSSAuthCredentialsProvider credentialProvider = new OSSAuthCredentialsProvider(authServerUrl); /* データが暗号化されている場合は、次のコードを使用して復号化できます。 * credentialProvider.setDecoder(new OSSAuthCredentialsProvider.AuthDecoder() { * @Override * public String decode(String data) { * String result = null; * // データを復号化します。 * // result = ... * return result; * } * }); */