Android SDK から Object Storage Service (OSS) にリクエストを送信するには、アクセス認証情報を設定します。認証と認可の要件に基づいて、異なる認証情報プロバイダーを選択できます。
前提条件
OSS Android SDK がインストールされていること。「Android SDK のインストール」をご参照ください。
認証情報プロバイダーの初期化
認証情報プロバイダーの選択
OSS は複数の認証情報プロバイダー初期化方法をサポートしています。シナリオに基づいていずれかを選択してください。
モバイルデバイスは信頼されていない環境です。クライアントに到達した完全なアクセス認証情報 (長期的な AccessKey ペアや一時的な STS トークン) は、リバースエンジニアリングやランタイムデバッグによって抽出される可能性があります。データ漏洩のリスクを軽減するため、モバイルアプリと OSS 間のアクセスパスを次のように構成してください。
-
長期的な AccessKey ペアはアプリケーションサーバーに保管してください。モバイルクライアントには決して含めないでください。
-
モバイルアプリが OSS を呼び出す前に、アプリケーションサーバーから一時的な STS の認証情報または署名付き URL をフェッチするようにしてください。
-
STS の一時的な認証情報を使用する場合は、権限を単一ユーザーのオブジェクトパスプレフィックスに限定する RAM ポリシーを適用し、短い有効期間を設定してください。
-
ID カード、顔写真、支払い認証情報、医療記録などのプライバシー性の高いデータのアップロードおよびダウンロードには、アプリケーションサーバーがモバイルアプリで使用するための署名付き URL を生成するようにしてください。モバイルアプリ自体は認証情報を保持しません。署名付き URL の詳細については、「アクセス認可 (Android SDK)」をご参照ください。
|
認証情報プロバイダーの初期化方法 |
シナリオ |
事前設定済みの AccessKey ペアまたは STS トークンの要否 |
認証情報のタイプ |
認証情報の有効性 |
認証情報のローテーションまたは更新方法 |
|
外部からの攻撃に対して脆弱でなく、頻繁な認証情報のローテーションなしで長期的なアクセスが必要な、安全で安定した環境。 |
はい |
AccessKey |
長期間 |
手動ローテーション |
|
|
認証情報の有効性と権限を制御する必要がある信頼されていない環境。 |
はい |
STS トークン |
一時的 |
カスタム |
|
|
外部システムから認証情報を取得するアプリケーション。 |
いいえ |
STS トークン |
一時的 |
自動更新 |
方法 1: AccessKey ペアの使用
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey secret) を使用して、認証情報プロバイダーを初期化します。この方法は、頻繁な認証情報のローテーションなしで長期的な OSS アクセスが必要な、安全で安定した環境に適しています。手動でのキーメンテナンスはセキュリティリスクをもたらし、メンテナンスが複雑になります。AccessKey ペアを取得するには、「CreateAccessKey - Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペアの作成」 API を呼び出します。
この方法はモバイルクライアントには推奨されません。Alibaba Cloud アカウントはすべてのリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩した場合、システムのセキュリティリスクが非常に高くなります。この方法を使用する必要がある場合は、必要最小限の権限を持つ RAM ユーザーの AccessKey ペアを使用してください。
サンプルコード
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
CredentialProvider credentialProvider = new DefaultCredentialProvider(ak, sk);
方法 2: STS トークンの使用
STS からの一時的な認証情報を使用して認証情報プロバイダーを初期化します。これは、一時的な OSS アクセスと、きめ細かいリアルタイムの権限制御を必要とするアプリケーションに適しています。認証情報には、AccessKey ID、AccessKey secret、および STS トークンが含まれます。手動でのトークンメンテナンスはセキュリティリスクをもたらし、メンテナンスが複雑になります。STS トークンを取得するには、「AssumeRole - RAM ロールの一時的な ID 認証情報の取得」 API を呼び出します。
以下の例は、STS トークンを手動または自動で更新する方法を示しています。
STS トークンの手動更新
String ak = "<ALIBABA_CLOUD_ACCESS_KEY_ID>";
String sk = "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>";
String token = "<ALIBABA_CLOUD_SECURITY_TOKEN>";
CredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(ak, sk, token);
STS トークンの自動更新
CredentialProvider 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 の使用
アプリケーションが柔軟な認証情報管理とキーレスアクセスのために外部システムから認証情報を取得する必要がある場合、CredentialsURI を使用して認証情報プロバイダーを初期化します。基盤となる実装では STS トークンが使用されます。Credentials ツールは、指定された URI を使用して STS トークンを取得し、クライアントを初期化します。これにより、AccessKey ペアや STS トークンを直接提供する必要がなくなります。
remote_url (サンプルコード内の authServerUrl) は、お客様自身がデプロイしたバックエンドサービスから提供される必要があります。これは Alibaba Cloud が提供する URL ではありません。Credentials ツールはこの URL に HTTP GET リクエストを送信し、バックエンドサービスは以下で説明するプロトコルに準拠した一時的な認証情報を返す必要があります。
-
URI は、次のプロトコルに準拠したレスポンスを返す必要があります:
-
レスポンスステータスコード: 200
-
レスポンスボディの構造:
{ "StatusCode":200, "AccessKeyId":"AccessKeyId", "AccessKeySecret":"AccessKeySecret", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"SecurityToken" }レスポンスボディでは、
StatusCodeはバックエンドサービスによって 200 に設定されます。AccessKeyId、AccessKeySecret、Expiration、およびSecurityTokenフィールドは、STS のAssumeRoleAPI によって返される Credentials オブジェクトから取得します。バックエンドサービスはAssumeRoleを呼び出してこれらの値を取得し、レスポンスボディに含める必要があります。AssumeRoleの詳細については、「STS の一時的なアクセス認証情報を使用した OSS へのアクセス」をご参照ください。
バックエンドサービスのサンプル (Python):
from alibabacloud_sts20150401.client import Client as StsClient from alibabacloud_sts20150401 import models as sts_models import json def get_credentials(): request = sts_models.AssumeRoleRequest( role_arn='<your_role_arn>', role_session_name='<your_session_name>' ) response = sts_client.assume_role(request) creds = response.body.credentials return json.dumps({ 'StatusCode': 200, 'AccessKeyId': creds.access_key_id, 'AccessKeySecret': creds.access_key_secret, 'Expiration': creds.expiration, 'SecurityToken': creds.security_token })バックエンドサービスのサンプル (Node.js):
const STS = require("@alicloud/sts20150401"); const stsClient = new STS.default({ accessKeyId: "<yourAccessKeyId>", accessKeySecret: "<yourAccessKeySecret>", endpoint: "sts.aliyuncs.com", }); const result = await stsClient.assumeRole("<roleArn>", "<sessionName>"); const creds = result.body.credentials; res.status(200).json({ StatusCode: 200, AccessKeyId: creds.accessKeyId, AccessKeySecret: creds.accessKeySecret, Expiration: creds.expiration, SecurityToken: creds.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; * } * }); */