Android SDK から OSS にリクエストを送信するには、アクセス認証情報を構成します。認証および認可の要件に応じて、異なる認証情報プロバイダーを選択できます。
前提条件
OSS Android SDK がインストールされていること。 Android SDK のインストール
認証情報プロバイダーの初期化
認証情報プロバイダーの選択
OSS は複数の認証情報プロバイダー初期化方法に対応しています。シナリオに応じて 1 つを選択してください。
モバイルデバイスは信頼されていない環境です。クライアントに到達するすべての完全なアクセス認証情報 (長期的な AccessKey ペアまたは一時的な STS トークン) は、リバースエンジニアリングまたはランタイムデバッグを通じて抽出される可能性があります。データ漏洩のリスクを軽減するために、モバイルアプリと OSS 間のアクセスパスを次のように構成してください:
-
長期的な AccessKey ペアはアプリケーションサーバーに保管してください。モバイルクライアントには絶対に配布しないでください。
-
モバイルアプリが OSS を呼び出す前に、アプリケーションサーバーから STS の一時的な認証情報または署名付き URL を取得するようにしてください。
-
STS の一時的な認証情報を使用する場合は、単一ユーザーのオブジェクトパスプレフィックスに権限を限定する RAM ポリシーを適用し、短い有効期間を設定してください。
-
身分証明書、顔画像、支払い認証情報、医療記録などのプライバシーに敏感なデータのアップロードおよびダウンロードについては、アプリケーションサーバーがモバイルアプリで使用する署名付き URL を生成するようにしてください。モバイルアプリ自体は認証情報を保持しません。署名付き URL の詳細については、「アクセスの認可 (Android SDK)」をご参照ください。
|
認証情報プロバイダー初期化方法 |
シナリオ |
事前に構成された AccessKey ペアまたは STS トークンが必要 |
認証情報の種類 |
認証情報の有効期間 |
認証情報のローテーションまたは更新方法 |
|
外部からの攻撃に対して脆弱性がなく、頻繁な認証情報のローテーションなしで長期的なアクセスを必要とする、安全で安定した環境。 |
はい |
AccessKey |
長期 |
手動ローテーション |
|
|
認証情報の有効期間と権限を制御する必要がある、信頼されていない環境。 |
はい |
STS トークン |
一時的 |
カスタム |
|
|
外部システムから認証情報を取得するアプリケーション。 |
いいえ |
STS トークン |
一時的 |
自動更新 |
方法 1:AccessKey ペアの使用
Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey シークレット) を使用して、認証情報プロバイダーを初期化します。この方法は、頻繁な認証情報のローテーションなしで長期的な OSS アクセスを必要とする、安全で安定した環境に適しています。手動によるキー管理はセキュリティリスクをもたらし、メンテナンスの複雑さを増大させます。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 トークンの使用
STS からの一時的な認証情報を使用して、認証情報プロバイダーを初期化します。これは、きめ細かいリアルタイムの権限制御を伴う一時的な OSS アクセスを必要とするアプリケーションに適しています。認証情報には、AccessKey ID、AccessKey シークレット、および STS トークンが含まれます。手動によるトークン管理はセキュリティリスクをもたらし、メンテナンスの複雑さを増大させます。STS トークンを取得するには、「AssumeRole - RAM ロールの一時的な ID 認証情報の取得」を呼び出してください。
次の例は、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 シークレット、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 シークレット、STS トークン、および有効期限から OSSFederationToken オブジェクトを構築します。
OSSFederationToken federationToken = new OSSFederationToken(ak, sk, token, expiration);
return federationToken;
}
};
方法 3: CredentialsURI の使用
アプリケーションが柔軟な認証情報管理とキーレスアクセスのために外部システムから認証情報を取得する必要がある場合は、CredentialsURI を使用して認証情報プロバイダーを初期化します。内部実装では STS トークンを使用します。Credentials ツールは、指定された URI を使用して STS トークンを取得し、クライアントを初期化します。これにより、AccessKey ペアまたは 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; * } * }); */