モバイルデバイスは信頼できない環境です。したがって、SDKはサーバーに基づいた2つの認証モード、STS authentication mode
とself-signed mode
を提供します。
STS認証モード
前書き
OSSは、Alibaba Cloud STSサービスを使用してアクセス許可を一時的に付与することができます。Alibaba Cloud STS(Security Token Service)は、クラウドコンピューティングのユーザーに一時的なアクセストークンを提供するWebサービスです。
STSを使用すると、サードパーティのアプリケーションまたは連合ユーザー(ユーザーIDを管理できます)に、カスタム有効期間とアクセス権を持つアクセス資格情報を割り当てることができます。アプリケーションのアクセス信用証明は、FederationTokenと呼ばれます。
サードパーティのアプリケーションまたはフェデレーションユーザーは、これらのアクセス資格情報を使用してAlibaba Cloud APIを直接呼び出したり、Alibaba Cloudが提供するSDKを使用してクラウド製品のAPIにアクセスすることができます。
- 長期キー(AccessKey)をサードパーティアプリケーションに開示する必要はありません。アクセストークンを生成して、アクセストークンをサードパーティのアプリケーションに送信する必要があります。このトークンのアクセス許可と妥当性をカスタマイズできます。
- 権限を取り消す必要はありません。有効期限が切れると、アクセストークンは自動的に無効になります。
たとえば、アプリケーションでの対話プロセスを次の図に示します。
解決策は次のとおりです。
- アプリケーションにログオンします。アプリケーションIDを管理できます。ID管理システムをカスタマイズしたり、外部WebアカウントまたはOpenIDを使用することができます。各有効なアプリユーザーに対して、AppServerは最小アクセス許可を正確に定義することができます。
- AppServerは、セキュリティトークン(SecurityToken)をSTSに要求します。STSが呼び出される前に、AppServerは、アプリケーションユーザーの最小アクセス許可(ポリシー構文内)と承認の有効期限を判断する必要があります。次に、STS AssumeRole APIを呼び出してセキュリティトークンを取得できます。 役割と使用方法の詳細については、RAMユーザーガイドの Role Managementを参照してください。
- STSは、有効なアクセス資格情報(アプリケーション内のFederationToken)をAppServerに返します。アクセス信任状には、SecurityToken、一時的なアクセスキーのペア(AccessKeyIDとAccessKeySecret)、および有効期限が含まれています。
- AppServerはFederationTokenをClientAppに返します。ClientAppはこの資格情報をキャッシュできます。資格情報が無効になると、ClientAppはAppServerから新しい有効なアクセス資格情報を要求する必要があります。たとえば、アクセスクレデンシャルが1時間有効である場合、ClientAppは30分ごとにアクセスクレデンシャルを更新するようにAppServerに要求できます。
- ClientAppはローカルにキャッシュされたFederationTokenを使用してAlibaba CloudサービスAPIを要求します。 クラウドサービスはSTSアクセス認証情報を検出し、認証情報をSTSサービスで検証し、それに応じてユーザー要求に応答します。
STSセキュリティトークンの詳細については、RAMユーザーガイドのRole Managementを参照してください。キーは、STSのAssumeRoleAPIを呼び出して、有効なアクセス認証情報を取得することです。 STS SDKを直接使用してこのメソッドを呼び出すこともできます。クリックして詳細を表示。
この認証モードを使用するには、まずAlibaba Cloud RAMサービスを有効にする必要があります。
STSユーザーマニュアル: クリックして詳細を表示
OSS認証ポリシーの設定: クリックして詳細を表示
StsTokenを直接設定する
特定の方法(ビジネスサーバーからのネットワーク要求など)によってアプリケーション内にStsTokenのペアを取得し、それを使用してSDKを初期化することができます。この方法を採用する場合は、STSTokenの有効期限に従わなければなりません。STSTokenの有効期限が近づいたら、SDKの新しいSTSTokenを更新するためのイニシアティブをとる必要があります。
初期化コードは次のとおりです。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider("<StsToken.AccessKeyId>", "<StsToken.SecretKeyId>", "<StsToken.SecurityToken>");
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
トークンが期限切れになるのを確認したら、次の方法で新しいOSSClientを再構築したり、CredentialProviderを更新したりできます。
oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("<StsToken.AccessKeyId>", "<StsToken.SecretKeyId>", "<StsToken.SecurityToken>"));
コールバックを実装してStsTokenを取得する
SDKで自動的にトークンの更新を管理する場合は、トークンを取得するようにSDKを構成する必要があります。SDKのアプリケーションでは、FederationToken(STSToken)を取得してトークンを返すコールバックを実装する必要があります。SDKはトークンを署名に使用します。トークンを更新する必要がある場合、SDKはコールバックを呼び出してトークンを取得します(次の図を参照)。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
@Override
public OSSFederationToken getFederationToken() {
// Here you must implement a method to get a FederationToken and construct it into the OSSFederationToken object to return it
// If the token is not obtained, "nil" is returned
OSSFederationToken * token;
// The following are some codes that can be used to obtain the token, for example from your server
...
return token;
}
};
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
トークンを更新する必要がある場合、SDKはコールバックを呼び出してトークンを取得します(次の図を参照)。この場合、トークンを手動で更新してから、OSSClientインスタンスのOSSCredentialProviderをリセットする必要があります。
例:
設定したサーバーのURLがhttp://localhost:8080/distribute-token.jsonであるとします。 URLにアクセスすると、返されるデータは次のようになります。
{
"StatusCode": 200,
"AccessKeyId":"STS.iA645eTOXEqP3cg3VeHf",
"AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojUBZCf",
"Expiration":"2015-11-03T09:52:59Z",
"SecurityToken":"CAES7QIIARKAAZPlqaN9ILiQZPS+JDkS/GSZN45RLx4YS/p3OgaUC+oJl3XSlbJ7StKpQ...."}
次のコードを使用して、OSSFederationCredentialProvider
インスタンスを実装することができます。
OSSCredentialProvider credetialProvider = new OSSFederationCredentialProvider() {
@Override
public OSSFederationToken getFederationToken() {
try {
URL stsUrl = new URL("http://localhost:8080/distribute-token.json");
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");
return new OSSFederationToken(ak, sk, token, expiration);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
};
自己署名モード
AccessKeyIDとAccessKeySecretをビジネスサーバーに格納してから、SDKにコールバックを実装して取得できます。マージされた署名文字列をサーバーに送信し、ビジネスサーバーでOSS指定の署名アルゴリズムを使用して文字列に署名し、署名付き文字列をコールバックに転送します。
署名アルゴリズムのリファレンス: クリックして詳細を表示
コンテンツは、さまざまな要求パラメータに従ってマージされた文字列です。アルゴリズムは次のとおりです。
signature = "OSS " + AccessKeyId + ":" + base64(hmac-sha1(AccessKeySecret, content))
次のように:
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
credentialProvider = new OSSCustomSignerCredentialProvider() {
@Override
public String signContent(String content) {
// Here you must sign a string using the OSS-specified signature algorithm, merge the AccessKeyID with the signed string, and return the string
// Generally, post the string to your business server and then return the signature
// If the signing fails, "nil" is returned after the error is described
// The following is a demo using a local algorithm for signing
return "OSS " + AccessKeyId + ":" + base64(hmac-sha1(AccessKeySecret, content));
}
};
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
注意: STS認証モードと自己署名モードでは、実装されたコールバック関数を呼び出すときに結果が返されるようにしてください。したがって、ネットワーク要求でビジネスサーバーからトークンと署名を取得する必要がある場合は、ネットワークライブラリの同期APIを呼び出すことをお勧めします。コールバックは、メインスレッドをブロックしないSDKからの要求のサブスレッドで実行されます。