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

Object Storage Service:Android 向け OSS SDK を使用したアクセスの承認

最終更新日:Apr 22, 2025

Android 向け Object Storage Service (OSS) SDK は、モバイルデバイスのデータセキュリティを確保するために、Security Token Service (STS) 認証モード、自签名モード、および署名付き URL を提供します。

背景情報

STS 認証モードまたは自签名モードを使用する場合は、実装するコールバック関数がセキュリティトークンと署名を返すことができることを確認してください。 コールバック関数でリクエストを送信してアプリサーバーからトークンと署名を取得する必要がある場合は、ネットワークライブラリに含まれる同期 API 操作を呼び出すことをお勧めします。 コールバック関数は、SDK によって生成されたリクエストの子スレッドで実行され、メインスレッドをブロックしません。

STS 認証モード

説明

STS 認証モードを使用するには、まず Alibaba Cloud Resource Access Management (RAM) をアクティブ化する必要があります。

STS を使用して、OSS への一時的なアクセスを承認できます。 STS は、ユーザーに一時的なアクセストークンを提供する Web サービスです。 STS を使用すると、カスタムの有効期間とカスタムの権限を持つ一時的なアクセス認証情報を、サードパーティアプリケーションまたは管理対象の RAM ユーザーに付与できます。 STS の詳細については、「STS とは」をご参照ください。

STS には次の利点があります。

  • セキュリティトークンを生成し、アクセスセキュリティトークンをサードパーティアプリケーションに送信するだけで済みます。 AccessKey ペアをサードパーティアプリケーションに提供する必要はありません。 このセキュリティトークンのアクセス権限と有効期間を指定できます。

  • セキュリティトークンは、有効期限が切れると自動的に期限切れになります。 したがって、セキュリティトークンのアクセス権限を手動で取り消す必要はありません。

STS によって提供される一時的なアクセス認証情報を使用して OSS にアクセスするには、次の操作を実行します。

  1. 一時的なアクセス認証情報を取得します。

    一時的なアクセス認証情報には、セキュリティトークンと、AccessKey ID と AccessKey シークレットで構成される一時的な AccessKey ペアが含まれます。 一時的なアクセス認証情報の有効期間は秒単位です。 一時的なアクセス認証情報の最小有効期間は 900 秒です。 一時的なアクセス認証情報の最大有効期間は、現在のロールに指定された最大セッション期間です。 詳細については、「RAM ロールの最大セッション期間を指定する」をご参照ください。

    次のいずれかの方法を使用して、一時的なアクセス認証情報を取得できます。

    • 方法 1

      AssumeRole 操作を呼び出します。

    • 方法 2

      STS SDK を使用します。

  2. 一時的なアクセス認証情報を使用して、Android 向け OSS SDK を初期化します。

String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";

OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken");

OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);                  

一時的なアクセス認証情報を使用して SDK を初期化する場合は、STS トークンの有効期間に注意してください。

次のサンプルコードは、トークンの残りの有効期間が 5 分未満の場合に STS トークンを更新する方法の例を示しています。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse("<StsToken.Expiration>");
long expiration = date.getTime() / 1000;
// Update the STS token when its remaining validity period is less than 5 minutes. 
if (DateUtil.getFixedSkewedTimeMillis() / 1000 > expiration - 5 * 60) {
    oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"));
}
  • STS トークンを手動で更新する

    STS トークンの有効期限が切れそうな場合は、次の行を実行して別の OSSClient インスタンスを作成するか、CredentialProvider を更新できます。

    oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"));                   
  • STS トークンを自動的に更新する

    SDK が STS トークンを自動的に更新するようにするには、アプリでコールバックを実装する必要があります。 コールバックはフェデレーショントークン (STS トークン) を取得し、SDK に返します。 SDK は STS トークンを使用して署名を生成します。 STS トークンを更新する必要がある場合、SDK はコールバックを呼び出して新しいトークンを取得します。

    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    
    OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
    
        @Override
        public OSSFederationToken getFederationToken() {
        // Obtain a federation token, construct the token, and then return the token as an OSSFederationToken object. If no federation token is obtained, null is returned. 
    
            OSSFederationToken token;
            // サーバーからフェデレーショントークンを取得します。
            return token;
        }
    };
    
    OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);                    
    説明

    STS トークンの生成に必要なすべてのフィールドを他の方法で取得する場合は、コールバックでトークンを直接返すことができます。 この場合、トークンを手動で更新してから、OSSClient インスタンスの OSSCredentialProvider を再構成する必要があります。

    トークンをリクエストするサーバーの URL が http://localhost:8080/distribute-token.json の場合、次のサンプルレスポンスが返されます。

    {
        "StatusCode": 200,
        "AccessKeyId":"STS.iA645eTOXEqP3cg3****",
        "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU****",
        "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;
        }
    };                    

URL 署名

使用上の注意

  • OSS SDK を使用して署名付き URL を生成する場合、OSS SDK はローカルコンピュータに保存されているキー情報に基づいて特定のアルゴリズムを使用して署名を計算し、URL に署名を追加して、URL の有効性とセキュリティを確保します。 URL を計算および構築するための操作は、クライアントで完了します。 ネットワーク経由でサーバーにリクエストを送信する必要はありません。 この方法では、署名付き URL を生成するときに、呼び出し元に特定の権限を付与する必要はありません。 ただし、サードパーティユーザーが署名付き URL によって承認されたリソースに対して関連操作を実行できるようにするには、署名付き URL を生成する API 操作を呼び出すプリンシパルが対応する権限を持っていることを確認する必要があります。

    たとえば、プリンシパルが署名付き URL を使用してオブジェクトをアップロードする場合、プリンシパルに oss:PutObject 権限を付与する必要があります。 プリンシパルが署名付き URL を使用してオブジェクトをダウンロードまたはプレビューする場合、プリンシパルに oss:GetObject 権限を付与する必要があります。

  • 次のサンプルコードを使用して生成された署名付き URL には、プラス記号(+)が含まれている場合があります。 この場合、URL 内のプラス記号(+)を %2B に置き換えます。 そうしないと、署名付き URL を使用してオブジェクトにアクセスできない場合があります。

次のサンプルコードは、一時的なアクセス承認のために署名付き URL を生成する方法の例を示しています。

署名付き URL を生成し、署名付き URL を使用してファイルをアップロードする

  1. 署名付き URL を生成します。

    // バケット名を指定します。例:examplebucket。
    String bucketName = "examplebucket";
    // ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例:exampleobject.txt。
    String objectKey = "exampleobject.txt";
    // contentType ヘッダーを指定します。
    String contentType = "application/octet-stream";
    String url = null;
    try {
        // オブジェクトをアップロードするための署名付き URL を生成します。
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
        // 署名付き URL の有効期間を 30 分に設定します。
        request.setExpiration(30*60);
        request.setContentType(contentType);    
        request.setMethod(HttpMethod.PUT);
        url = oss.presignConstrainedObjectURL(request);
        Log.d("url", url);
    } catch (ClientException e) {
        e.printStackTrace();
    }
  2. 署名付き URL を使用してオブジェクトをアップロードします。

    // 生成された署名付き URL を入力します。
    String url = "";
    // ローカルファイルの完全なパスを指定します。
    String localFile = "/storage/emulated/0/oss/examplefile";
    // contentType ヘッダーを指定します。
    String contentType = "application/octet-stream";
    // 署名付き URL を使用してオブジェクトをアップロードします。
    OkHttpClient client = new OkHttpClient();
    Request putRequest = new Request.Builder()
            .url(url)
            .put(RequestBody.create(MediaType.parse(contentType), new File(localFile)))
            .build();
    client.newCall(putRequest).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }
    
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            Log.d("response", response.body().string());
        }
    });

署名付き URL を生成し、署名付き URL を使用してオブジェクトをダウンロードする

  1. 署名付き URL を生成します。

    // バケット名を指定します。例:examplebucket。
    String bucketName = "examplebucket";
    // ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例:exampleobject.txt。
    String objectKey = "exampleobject.txt";
    String url = null;
    try {
        // オブジェクトをダウンロードするための署名付き URL を生成します。
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
        // 署名付き URL の有効期間を 30 分に設定します。
        request.setExpiration(30*60);
        request.setMethod(HttpMethod.GET);
        url = oss.presignConstrainedObjectURL(request);
        Log.d("url", url);
    } catch (ClientException e) {
        e.printStackTrace();
    }
  2. 署名付き URL を使用してオブジェクトをダウンロードします。

    // 生成された署名付き URL を入力します。
    String url = "";
    OkHttpClient client = new OkHttpClient();
    // 署名付き URL を使用してオブジェクトをダウンロードします。
    Request getRequest = new Request.Builder()
            .url(url)
            .get()
            .build();
    client.newCall(getRequest).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }
    
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.code() == 203 || response.code() >= 300) {
                Log.d("download", "fail");
                Log.d("download", response.body().string());
                return;
            }
            // オブジェクトがダウンロードされます。
            InputStream inputStream = response.body().byteStream();
    
            byte[] buffer = new byte[2048];
            int len;
    
            while ((len = inputStream.read(buffer)) != -1) {
                // ダウンロードされたデータを処理します。たとえば、画像を表示したり、オブジェクトに書き込み操作を実行したりします。
            }
        }
    });