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
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:
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:
Metode 1
Panggil operasi AssumeRole untuk memperoleh kredensial akses sementara.
Metode 2
Gunakan STS SDK untuk berbagai bahasa untuk memperoleh kredensial akses sementara.
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);CatatanJika 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.