全部产品
Search
文档中心

Object Storage Service:Otorisasi akses (Android SDK)

更新时间:Dec 17, 2025

Kit Pengembangan Perangkat Lunak (SDK) Android menyediakan mode autentikasi STS, mode tanda tangan sendiri, dan URL yang ditandatangani sebelumnya (presigned URLs) untuk mengamankan perangkat seluler.

Informasi latar belakang

Baik pada mode autentikasi STS maupun mode tanda tangan sendiri, fungsi callback yang Anda implementasikan harus mengembalikan token dan signature saat dipanggil. Untuk mengirim permintaan jaringan ke server aplikasi guna memperoleh token dan signature tersebut, Anda dapat memanggil API sinkron dari pustaka jaringan. Callback dijalankan dalam subthread ketika SDK memulai permintaan, sehingga tidak memblokir thread utama.

Mode autentikasi STS

Catatan

Untuk menggunakan mode STS dalam otorisasi, Anda harus terlebih dahulu mengaktifkan Alibaba Cloud Resource Access Management (RAM).

Anda dapat menggunakan Alibaba Cloud Security Token Service (STS) untuk memberikan akses berizin sementara ke OSS. STS adalah layanan web yang menyediakan token akses sementara bagi pengguna komputasi awan. Dengan STS, Anda dapat menerbitkan kredensial akses dengan waktu hidup (TTL) dan izin tertentu kepada aplikasi pihak ketiga atau pengguna federasi yang identitasnya Anda kelola. Untuk informasi lebih lanjut, lihat Apa itu STS?.

STS memberikan manfaat berikut:

  • Anda tidak perlu mengekspos pasangan AccessKey jangka panjang ke aplikasi pihak ketiga. Sebagai gantinya, Anda dapat menghasilkan token akses dengan izin akses dan periode validitas tertentu untuk diberikan ke aplikasi tersebut.

  • Anda tidak perlu mengelola pencabutan izin karena token akses secara otomatis menjadi tidak valid setelah masa berlakunya habis.

Untuk menggunakan STS guna memberikan akses sementara ke OSS, ikuti langkah-langkah berikut:

  1. Peroleh kredensial akses sementara.

    Kredensial akses sementara mencakup pasangan AccessKey sementara—terdiri atas ID AccessKey dan Rahasia AccessKey—serta token keamanan. Masa berlaku kredensial akses sementara diukur dalam detik, dengan nilai minimum 900 dan nilai maksimum sesuai durasi sesi maksimum yang ditetapkan untuk peran RAM saat ini. Untuk informasi lebih lanjut, lihat Menyetel durasi sesi maksimum untuk peran RAM.

    Anda dapat memperoleh kredensial akses sementara dengan salah satu dari dua cara berikut:

  2. Gunakan kredensial akses sementara untuk menginisialisasi 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);                  

    Saat menginisialisasi SDK dengan kredensial akses sementara, perhatikan periode validitas StsToken.

    Kode berikut menunjukkan cara memperbarui StsToken ketika sisa periode validitasnya kurang dari 5 menit:

    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;
    // Jika StsToken akan kedaluwarsa dalam waktu kurang dari 5 menit, perbarui StsToken.
    if (DateUtil.getFixedSkewedTimeMillis() / 1000 > expiration - 5 * 60) {
        oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"));
    }
    • Perbarui StsToken secara manual

      Saat StsToken hampir kedaluwarsa, Anda dapat membuat ulang OSSClient atau memperbarui CredentialProvider sebagai berikut:

      oss.updateCredentialProvider(new OSSStsTokenCredentialProvider("StsToken.AccessKeyId", "StsToken.SecretKeyId", "StsToken.SecurityToken"));                   
    • Perbarui StsToken secara otomatis

      Untuk mengaktifkan pembaruan otomatis StsToken oleh SDK, Anda harus mengimplementasikan callback di aplikasi Anda. SDK akan memanggil callback tersebut untuk memperoleh Federation Token (StsToken), lalu menggunakannya untuk penandatanganan. SDK juga akan memanggil kembali callback tersebut untuk memperoleh StsToken baru saat token saat ini hampir kedaluwarsa.

      String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
      
      OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
      
          @Override
          public OSSFederationToken getFederationToken() {
          // Peroleh FederationToken dan buat sebagai objek OSSFederationToken untuk dikembalikan. Jika gagal memperoleh FederationToken karena alasan apa pun, server langsung mengembalikan null.
      
              OSSFederationToken token;
              // Peroleh token dari server Anda.
              return token;
          }
      };
      
      OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);                    
      Catatan

      Jika Anda telah memperoleh bidang-bidang yang diperlukan untuk StsToken melalui cara lain, Anda juga dapat langsung mengembalikan StsToken dalam callback tersebut. Namun, Anda harus menangani pembaruan StsToken secara manual dan mengatur ulang OSSCredentialProvider untuk instans OSSClient setelah pembaruan.

      Sebagai contoh, jika Anda mengakses server di http://localhost:8080/distribute-token.json, data berikut dikembalikan:

      {
          "StatusCode": 200,
          "AccessKeyId":"STS.iA645eTOXEqP3cg3****",
          "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU****",
          "Expiration":"2015-11-03T09:52:59Z",
          "SecurityToken":"CAES7QIIARKAAZPlqaN9ILiQZPS+JDkS/GSZN45RLx4YS/p3OgaUC+oJl3XSlbJ7StKpQ****"}                    

      Contoh berikut menunjukkan cara mengimplementasikan 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 yang ditandatangani sebelumnya (Presigned URL)

Catatan

  • Saat Anda menggunakan SDK OSS untuk menghasilkan presigned URL, SDK OSS menggunakan algoritma tertentu berdasarkan informasi kunci yang disimpan di komputer lokal untuk menghitung signature dan menambahkannya ke URL guna memastikan validitas dan keamanan URL. Operasi penghitungan dan pembentukan URL tersebut dilakukan sepenuhnya di sisi klien tanpa perlu mengirim permintaan ke server melalui jaringan. Oleh karena itu, Anda tidak perlu memberikan izin khusus kepada pemanggil saat menghasilkan presigned URL. Namun, untuk memungkinkan pengguna pihak ketiga melakukan operasi terkait pada resource yang diotorisasi oleh presigned URL, principal yang memanggil operasi API untuk menghasilkan presigned URL harus memiliki izin yang sesuai.

    Sebagai contoh, jika suatu principal ingin mengunggah objek menggunakan presigned URL, Anda harus memberikan izin oss:PutObject kepada principal tersebut. Jika suatu principal ingin mengunduh atau melihat pratinjau objek menggunakan presigned URL, Anda harus memberikan izin oss:GetObject kepada principal tersebut.

  • Presigned URL yang dihasilkan menggunakan kode contoh berikut mungkin berisi tanda plus (+). Dalam hal ini, ganti tanda plus (+) dalam URL tersebut dengan %2B. Jika tidak, presigned URL tersebut mungkin tidak dapat digunakan untuk mengakses objek sebagaimana diharapkan.

Contoh berikut menunjukkan cara menggunakan presigned URL untuk otorisasi sementara.

Hasilkan presigned URL dan gunakan untuk mengunggah file

  1. Hasilkan presigned URL untuk pengunggahan.

    // Tentukan nama bucket, misalnya examplebucket.
    String bucketName = "examplebucket";
    // Tentukan path lengkap objek sumber tanpa nama bucket, misalnya exampleobject.txt.
    String objectKey = "exampleobject.txt";
    // Setel content-type.
    String contentType = "application/octet-stream";
    String url = null;
    try {
        // Hasilkan presigned URL untuk mengunggah file.
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
        // Atur waktu kedaluwarsa presigned URL menjadi 30 menit.
        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. Unggah file menggunakan presigned URL.

    // Tentukan presigned URL yang dihasilkan.
    String url = "";
    // Tentukan path lengkap file lokal.
    String localFile = "/storage/emulated/0/oss/examplefile";
    // Setel content-type.
    String contentType = "application/octet-stream";
    // Unggah file menggunakan presigned 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());
        }
    });

Hasilkan presigned URL dan gunakan untuk mengunduh file

  1. Hasilkan presigned URL untuk pengunduhan.

    // Tentukan nama bucket, misalnya examplebucket.
    String bucketName = "examplebucket";
    // Tentukan path lengkap objek sumber tanpa nama bucket, misalnya exampleobject.txt.
    String objectKey = "exampleobject.txt";
    String url = null;
    try {
        // Hasilkan presigned URL untuk mengunduh file.
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
        // Atur waktu kedaluwarsa presigned URL menjadi 30 menit.
        request.setExpiration(30*60);
        request.setMethod(HttpMethod.GET);
        url = oss.presignConstrainedObjectURL(request);
        Log.d("url", url);
    } catch (ClientException e) {
        e.printStackTrace();
    }
  2. Unduh file menggunakan presigned URL.

    // Tentukan presigned URL yang dihasilkan.
    String url = "";
    OkHttpClient client = new OkHttpClient();
    // Unduh file menggunakan presigned 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;
            }
            // Permintaan berhasil.
            InputStream inputStream = response.body().byteStream();
    
            byte[] buffer = new byte[2048];
            int len;
    
            while ((len = inputStream.read(buffer)) != -1) {
                // Proses data yang diunduh, seperti menampilkan citra atau menulis ke file.
            }
        }
    });