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

Object Storage Service:アクセス権限付与 (Android SDK)

最終更新日:Dec 17, 2025

Android ソフトウェア開発キット (SDK) は、モバイルデバイスのセキュリティを確保するために、STS 認証モード、自己署名モード、および署名付き URL を提供します。

背景情報

STS 認証モードと自己署名モードの両方で、実装するコールバック関数は、呼び出されたときにトークンと署名を返す必要があります。ネットワークライブラリの同期 API を呼び出すことで、アプリケーションサーバーにネットワークリクエストを送信して、トークンと署名を取得できます。SDK がリクエストを開始すると、コールバックはサブスレッドで実行されるため、メインスレッドはブロックされません。

STS 認証モード

説明

STS モードを権限付与に使用するには、まず Alibaba Cloud の Resource Access Management (RAM) を有効化する必要があります。

Alibaba Cloud の Security Token Service (STS) を使用して、OSS への一時的な権限付与アクセスを行うことができます。STS は、クラウドコンピューティングユーザーに一時的なアクセストークンを提供する Web サービスです。STS を使用すると、管理している ID を持つサードパーティのアプリケーションまたはフェデレーションユーザーに対して、カスタムの有効期間 (TTL) とカスタムの権限を持つアクセス認証情報を発行できます。詳細については、「STS とは」をご参照ください。

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

  • 長期的な AccessKey ペアをサードパーティのアプリケーションに公開する必要はありません。代わりに、カスタムのアクセス権限と特定の有効期間を持つアクセストークンを生成して、アプリケーションに提供できます。

  • アクセストークンは有効期限が切れると自動的に無効になるため、権限の失効を管理する必要はありません。

STS を使用して OSS への一時的なアクセスを許可するには、次の手順を実行します。

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

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

    一時的なアクセス認証情報は、次の 2 つの方法のいずれかで取得できます。

    • 方法 1

      AssumeRole 操作を呼び出して、一時的なアクセス認証情報を取得します。

    • 方法 2

      さまざまな言語の STS SDK を使用して、一時的なアクセス認証情報を取得します。

  2. 一時的なアクセス認証情報を使用して 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 を初期化する場合、StsToken の有効期間にご注意ください。

    次のコードは、StsToken の残りの有効期間が 5 分未満になった場合に StsToken を更新する方法を示しています。

    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;
    // If the StsToken is about to expire in less than 5 minutes, update the StsToken.
    if (DateUtil.getFixedSkewedTimeMillis() / 1000 > expiration - 5 * 60) {
        oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"));
    }
    • StsToken の手動更新

      StsToken の有効期限が近づいたら、次のように OSSClient を再構築するか、CredentialProvider を更新できます。

      oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"));                   
    • StsToken の自動更新

      SDK が StsToken を自動的に更新できるようにするには、アプリケーションでコールバックを実装する必要があります。SDK は、実装されたコールバックを呼び出してフェデレーショントークン (StsToken) を取得します。SDK はこのトークンを署名に使用し、現在の StsToken の有効期限が近づくとコールバックを呼び出して新しい StsToken を取得します。

      String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
      
      OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
      
          @Override
          public OSSFederationToken getFederationToken() {
          // Obtain the FederationToken and construct it as an OSSFederationToken object to return. If the FederationToken fails to be obtained for any reason, the server directly returns null.
      
              OSSFederationToken token;
              // Obtain the token from your server.
              return token;
          }
      };
      
      OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);                    
      説明

      他の手段で StsToken に必要なフィールドをすでに取得している場合は、コールバックで StsToken を直接返すこともできます。ただし、StsToken の更新を手動で処理し、更新後に OSSClient インスタンスの OSSCredentialProvider をリセットする必要があります。

      たとえば、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 を使用してオブジェクトをダウンロードまたはプレビューする場合、そのプリンシPALに oss:GetObject 権限を付与する必要があります。

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

次の例は、署名付き URL を使用して一時的な権限付与を行う方法を示しています。

署名付き URL の生成とそれを使用したファイルのアップロード

  1. アップロード用の署名付き URL を生成します。

    // バケット名を指定します (例: examplebucket)。
    String bucketName = "examplebucket";
    // バケット名を含まないソースオブジェクトの完全なパスを指定します (例: exampleobject.txt)。
    String objectKey = "exampleobject.txt";
    // Content-Type を設定します。
    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";
    // Content-Type を設定します。
    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 の生成とそれを使用したファイルのダウンロード

  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) {
                // ダウンロードしたデータを処理します (例: 画像の表示、ファイルへの書き込み)。
            }
        }
    });