All Products
Search
Document Center

Resource Access Management:Akses Alibaba Cloud dari aplikasi seluler menggunakan token STS

Last Updated:Jul 18, 2026

Aplikasi seluler dapat menggunakan token STS dari suatu RAM role untuk mengakses resource Alibaba Cloud secara aman tanpa menyematkan kredensial jangka panjang.

Informasi latar belakang

Sebuah perusahaan mengembangkan aplikasi seluler yang menggunakan Object Storage Service (OSS). Aplikasi tersebut harus terhubung langsung ke OSS untuk mengunggah atau mengunduh data, tetapi berjalan di perangkat seluler pengguna akhir yang tidak dikendalikan oleh perusahaan.

Perusahaan memiliki persyaratan berikut:

  • Transfer data langsung: Perusahaan ingin agar aplikasi terhubung langsung ke OSS untuk unggahan dan unduhan, bukan meneruskan data melalui server aplikasi backend-nya.

  • Manajemen kredensial yang aman: Perusahaan harus menghindari penyematan kredensial jangka panjang, seperti AccessKey, di dalam aplikasi seluler. Perangkat pengguna akhir merupakan lingkungan runtime yang tidak tepercaya.

  • Kontrol risiko: Untuk mengikuti prinsip hak istimewa minimal, setiap aplikasi harus memiliki izin minimal dan sesi berdurasi pendek saat terhubung ke OSS.

Solusi

Ketika aplikasi seluler perlu mengunggah atau mengunduh data dari OSS, aplikasi tersebut meminta kredensial dari server aplikasi. Server aplikasi, sebagai RAM user, mengasumsikan suatu RAM role dengan memanggil operasi STS AssumeRole dan meneruskan token STS yang dikembalikan ke aplikasi, yang kemudian menggunakannya untuk mengakses OSS.

移动设备应用访问阿里云

  1. Aplikasi meminta kredensial dari server aplikasi.

  2. Buat RAM role dan berikan izin yang diperlukan.

    Untuk informasi lebih lanjut, lihat Buat RAM role dan berikan izin.

  3. Buat RAM user untuk server aplikasi dan izinkan RAM user tersebut mengasumsikan RAM role.

    Untuk informasi lebih lanjut, lihat Buat RAM user dan izinkan pengguna mengasumsikan RAM role.

  4. Server aplikasi memanggil operasi STS AssumeRole untuk mendapatkan token STS untuk RAM role tersebut.

    Untuk informasi lebih lanjut, lihat Mendapatkan token STS di server aplikasi.

  5. Server aplikasi dapat lebih membatasi izin token STS untuk kontrol yang lebih rinci terhadap setiap klien aplikasi.

    Untuk informasi lebih lanjut, lihat Batasi izin token STS.

  6. Saat aplikasi perlu mengunggah atau mengunduh data secara langsung, aplikasi tersebut menggunakan token STS untuk mengakses OSS.

    Untuk informasi lebih lanjut, lihat Gunakan token STS untuk mengakses OSS dari aplikasi.

Buat RAM role dan berikan izin

Asumsikan bahwa ID Akun Alibaba Cloud Anda adalah 123456789012****.

  1. Gunakan Akun Alibaba Cloud Anda untuk membuat RAM role bernama oss-objectmanager dan pilih Cloud Account sebagai tipe principal.

    Catatan

    Saat membuat RAM role, pilih Current Account sebagai principal tepercaya. Hal ini hanya mengizinkan RAM user yang termasuk dalam Akun Alibaba Cloud yang sama untuk mengasumsikan RAM role ini.

    Untuk informasi lebih lanjut, lihat Buat RAM role untuk Akun Alibaba Cloud.

    Setelah RAM role dibuat, Anda dapat melihat ARN dan kebijakan kepercayaannya di halaman detail role.

    • ARN dari RAM role tersebut adalah acs:ram::123456789012****:role/oss-objectmanager.

    • Kebijakan kepercayaan dari RAM role tersebut adalah sebagai berikut.

      Catatan

      Kebijakan kepercayaan berikut mengizinkan principal terotentikasi apa pun dalam Akun Alibaba Cloud 123456789012**** untuk mengasumsikan role tersebut.

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::123456789012****:root"
              ]
            }
          }
        ],
        "Version": "1"
      }
  2. Lampirkan kebijakan sistem AliyunOSSFullAccess ke RAM role oss-objectmanager.

    Untuk informasi lebih lanjut, lihat Berikan izin kepada RAM role.

Buat RAM user dan izinkan asumsi role

  1. Buat RAM user bernama appserver untuk server aplikasi.

    Untuk informasi lebih lanjut, lihat Buat RAM user.

  2. Berikan izin AliyunSTSAssumeRoleAccess kepada RAM user appserver untuk mengizinkan pengguna tersebut mengasumsikan role.

    Untuk informasi lebih lanjut, lihat Berikan izin kepada RAM user.

Dapatkan token STS

  1. Server aplikasi menggunakan AccessKey RAM user untuk memanggil operasi STS AssumeRole.

    Catatan
    • Sebelum menggunakan Alibaba Cloud Command Line Interface (CLI), Anda harus menginstalnya di server aplikasi dan mengonfigurasinya dengan kredensial RAM user. Untuk informasi lebih lanjut, lihat Referensi CLI STS.

    • Pada contoh ini, parameter Policy tidak ditentukan. Oleh karena itu, token STS yang dikembalikan mewarisi semua izin dari RAM role oss-objectmanager. Untuk membatasi lebih lanjut izin token STS, lihat Batasi izin token STS.

    Contoh berikut menunjukkan cara menggunakan Alibaba Cloud CLI untuk memanggil operasi AssumeRole:

    aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-001'
  2. STS mengembalikan token STS ke server aplikasi. Token STS tersebut mencakup AccessKeyId, AccessKeySecret, dan SecurityToken.

    Kode berikut memberikan contoh tanggapan:

    {
         "AssumedRoleUser": {
             "AssumedRoleId": "391578752573****:client-001",
             "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-001"
         }, 
         "Credentials": {
             "AccessKeySecret": "yourAccessKeySecret",
             "SecurityToken": "yourSecurityToken",
             "Expiration": "2016-01-13T15:02:37Z",
             "AccessKeyId": "yourAccessKeyId"
         }, 
         "RequestId": "E1779AAB-E7AF-47D6-A9A4-53128708B6CE"
     }
    Catatan

    SecurityToken memiliki masa kedaluwarsa yang singkat. Jika diperlukan sesi yang lebih lama, server aplikasi harus menerbitkan ulang token STS secara berkala, misalnya setiap 1.800 detik.

Batasi izin token STS

Anda dapat menggunakan parameter Policy dalam pemanggilan AssumeRole untuk membatasi izin token STS berdasarkan pengguna atau perangkat, sehingga mengurangi risiko peningkatan hak istimewa.

Contoh berikut memberikan izin untuk mengunduh objek yang sesuai dengan path sample-bucket/2015/01/01/*.jpg.

  • Contoh permintaan

    aliyun sts AssumeRole --RoleArn 'acs:ram::123456789012****:role/oss-objectmanager' --RoleSessionName 'client-002' --Policy '{"Version":"1", "Statement": [{"Effect":"Allow", "Action":"oss:GetObject", "Resource":"acs:oss:*:*:sample-bucket/2015/01/01/*.jpg"}]}'
    Catatan

    Masa kedaluwarsa default untuk token STS adalah 3.600 detik. Anda dapat menetapkan masa kedaluwarsa yang berbeda dengan menggunakan parameter DurationSeconds. Untuk informasi lebih lanjut, lihat AssumeRole.

  • Contoh tanggapan

    {
       "AssumedRoleUser": {
           "AssumedRoleId": "391578752573****:client-002",
           "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-002"
       },
       "Credentials": {
           "AccessKeySecret": "yourAccessKeySecret",
           "SecurityToken": "yourSecurityToken",
           "Expiration": "2016-01-13T15:03:39Z",
           "AccessKeyId": "yourAccessKeyId"
       }, 
       "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567"
    }

Gunakan token STS untuk mengakses OSS

  1. Server aplikasi meneruskan token STS ke aplikasi seluler.

  2. Aplikasi seluler menggunakan token STS untuk mengakses OSS.

    Contoh berikut menggunakan OSS Android SDK untuk mengunduh file dari OSS dengan token STS.

    // Ganti yourEndpoint dengan endpoint wilayah tempat bucket Anda berada. Misalnya, untuk wilayah China (Hangzhou), endpoint-nya adalah https://oss-cn-hangzhou.aliyuncs.com.
    String endpoint = "yourEndpoint";
    // Ganti yourRegion dengan ID wilayah tempat bucket Anda berada. Misalnya, untuk wilayah China (Hangzhou), ID wilayahnya adalah cn-hangzhou.
    String region = "yourRegion";
    
    // AccessKey ID dan AccessKey Secret sementara yang diperoleh dari STS.
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // Token keamanan yang diperoleh dari STS.
    String securityToken = "yourSecurityToken";
    
    OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken);
    ClientConfiguration config = new ClientConfiguration();
    config.setSignVersion(SignVersion.V4);
    // Buat instans OSSClient.
    OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
    oss.setRegion(region);
    // Buat permintaan unduhan.
    GetObjectRequest get = new GetObjectRequest("sample-bucket", "2015/01/01/grass.jpg");
    
    OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
        @Override
         // Saat berhasil, permintaan GetObject mengembalikan GetObjectResult yang berisi aliran input. Anda harus memproses aliran tersebut.
        public void onSuccess(GetObjectRequest request, GetObjectResult result) {
            // Permintaan berhasil.
            Log.d("asyncGetObject", "DownloadSuccess");
            Log.d("Content-Length", "" + result.getContentLength());
            
            try (InputStream inputStream = result.getObjectContent()) {
                byte[] buffer = new byte[2048];
                int len;
                while ((len = inputStream.read(buffer)) != -1) {
                // Proses data.
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        // Callback onFailure dipicu jika permintaan gagal. Tangani exception tersebut.
        public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
            if (clientExcepion != null) {
                // Tangani exception sisi klien, seperti error jaringan.
                clientExcepion.printStackTrace();
            }
            if (serviceException != null) {
                // Tangani exception sisi layanan.
                Log.e("ErrorCode", serviceException.getErrorCode());
                Log.e("RequestId", serviceException.getRequestId());
                Log.e("HostId", serviceException.getHostId());
                Log.e("RawMessage", serviceException.getRawMessage());
            }
        }
    });
    // Batalkan tugas.
    // task.cancel(); 
    // Tunggu hingga tugas selesai.
    // task.waitUntilFinished();