Object Storage Service (OSS) SDK untuk iOS menyediakan mode autentikasi Security Token Service (STS), mode tanda tangan sendiri, dan URL yang ditandatangani sebelumnya (presigned URLs) untuk memastikan keamanan data seluler.
Catatan
Saat menggunakan mode autentikasi STS atau mode tanda tangan sendiri, pastikan fungsi callback yang Anda gunakan dapat mengembalikan token keamanan dan signature. Jika Anda perlu memperoleh token dan signature dari server aplikasi melalui permintaan dalam fungsi callback, disarankan untuk memanggil operasi API sinkron yang disediakan oleh library jaringan. Fungsi callback dijalankan di thread anak dari permintaan yang dihasilkan oleh SDK dan tidak memblokir thread utama.
Mode autentikasi STS
Untuk mengakses OSS menggunakan kredensial akses sementara yang disediakan oleh STS, lakukan langkah-langkah berikut:
Peroleh kredensial akses sementara.
Kredensial akses sementara mencakup token keamanan dan pasangan AccessKey sementara, yang terdiri atas ID AccessKey dan Rahasia AccessKey. Periode validitas minimum kredensial akses sementara adalah 900 detik, sedangkan periode validitas maksimumnya mengikuti durasi sesi maksimum yang ditentukan untuk role tersebut. Untuk informasi selengkapnya, lihat Tentukan durasi sesi maksimum untuk RAM role.
Anda dapat memperoleh kredensial akses sementara dengan salah satu metode berikut:
Metode 1
Panggil operasi AssumeRole.
Metode 2
Gunakan STS SDK untuk berbagai bahasa untuk memperoleh kredensial akses sementara.
Gunakan kredensial akses sementara tersebut untuk menginisialisasi OSS SDK untuk iOS.
id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];CatatanAnda dapat menggunakan OSSAuthCredentialProvider untuk menginisialisasi OSS SDK untuk iOS. Untuk informasi selengkapnya, lihat Inisialisasi.
Saat menginisialisasi SDK menggunakan kredensial akses sementara, perhatikan periode validitas token STS. Contoh kode berikut menunjukkan cara menentukan periode validitas token STS:
NSDateFormatter * fm = [NSDateFormatter new]; fm.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; [fm setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; NSDate *expirationDate = [fm dateFromString:@"<StsToken.Expiration>"]; NSTimeInterval interval = [expirationDate timeIntervalSinceDate:[NSDate date]]; // Token STS akan kedaluwarsa kurang dari lima menit lagi. if (interval < 5 * 60) { id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential]; }Perbarui token STS secara manual
Saat token STS hampir kedaluwarsa, buat instans OSSClient baru atau perbarui CredentialProvider dengan metode berikut:
id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"<StsToken.AccessKeyId>" secretKeyId:@"<StsToken.SecretKeyId>" securityToken:@"<StsToken.SecurityToken>"]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];Perbarui token STS secara otomatis
Agar SDK dapat memperbarui token STS secara otomatis, Anda harus mengimplementasikan callback di aplikasi Anda. Callback tersebut memperoleh token federasi (token STS) dan mengembalikannya ke SDK. SDK kemudian menggunakan token tersebut untuk menghasilkan signature. Saat token STS perlu diperbarui, SDK akan memanggil callback untuk memperoleh token baru.
id<OSSCredentialProvider> credential = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * { // Implementasikan fungsi yang memperoleh token federasi dan mengembalikannya sebagai objek OSSFederationToken. // Jika token federasi tidak berhasil diperoleh, kembalikan nil. OSSFederationToken * token; // Peroleh token federasi dari server Anda. ... return token; }]; client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];CatatanJika semua bidang yang diperlukan untuk menghasilkan token STS telah Anda peroleh melalui metode lain, Anda dapat langsung mengembalikan token tersebut dalam callback. Dalam kasus ini, Anda tetap harus memperbarui token secara manual, lalu mengonfigurasi ulang OSSCredentialProvider pada instans OSSClient.
Jika URL server tempat Anda meminta token adalah http://localhost:8080/distribute-token.json, respons contoh berikut akan dikembalikan:
{ "StatusCode": 200, "AccessKeyId":"STS.iA645eTOXEqP3cg3****", "AccessKeySecret":"rV3VQrpFQ4BsyHSAvi5NVLpPIVffDJv4LojU****", "Expiration":"2015-11-03T09:52:59Z", "SecurityToken":"CAES7QIIARKAAZPlqaN9ILiQZPS+JDkS/GSZN45RLx4YS/p3OgaUC+oJl3XSlbJ7StKpQ****" }Contoh kode berikut menunjukkan cara mengimplementasikan OSSFederationCredentialProvider:
id<OSSCredentialProvider> credential2 = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * { // Buat permintaan untuk mengakses server aplikasi Anda. NSURL * url = [NSURL URLWithString:@"http://localhost:8080/distribute-token.json"]; // Gunakan permintaan untuk mengatur parameter yang dibutuhkan oleh server Anda. NSURLRequest * request = [NSURLRequest requestWithURL:url]; OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource]; NSURLSession * session = [NSURLSession sharedSession]; // Kirim permintaan. NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { [tcs setError:error]; return; } [tcs setResult:data]; }]; [sessionTask resume]; // Tunggu hingga respons terhadap permintaan dikembalikan. [tcs.task waitUntilFinished]; // Uraikan hasil yang dikembalikan. if (tcs.task.error) { NSLog(@"get token error: %@", tcs.task.error); return nil; } else { // Data yang dikembalikan dalam format JSON. Uraikan data tersebut untuk memperoleh nilai-nilai bidang token. NSDictionary * object = [NSJSONSerialization JSONObjectWithData:tcs.task.result options:kNilOptions error:nil]; OSSFederationToken * token = [OSSFederationToken new]; token.tAccessKey = [object objectForKey:@"AccessKeyId"]; token.tSecretKey = [object objectForKey:@"AccessKeySecret"]; token.tToken = [object objectForKey:@"SecurityToken"]; token.expirationTimeInGMTFormat = [object objectForKey:@"Expiration"]; NSLog(@"get token: %@", token); return token; } }];
Presigned URLs
Catatan penggunaan
Saat menggunakan OSS SDK untuk menghasilkan presigned URL, SDK menggunakan algoritma tertentu berdasarkan informasi kunci yang disimpan di komputer lokal untuk menghitung signature dan menambahkannya ke URL guna memastikan validitas dan keamanan URL tersebut. Proses perhitungan dan pembentukan URL sepenuhnya dilakukan 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, agar pengguna pihak ketiga dapat melakukan operasi terkait pada sumber daya yang diizinkan oleh presigned URL tersebut, principal yang memanggil operasi API untuk menghasilkan presigned URL harus memiliki izin yang sesuai.
Misalnya, jika suatu principal ingin mengunggah objek menggunakan presigned URL, Anda harus memberikan izin oss:PutObject kepada principal tersebut. Jika principal tersebut ingin mengunduh atau melihat pratinjau objek menggunakan presigned URL, Anda harus memberikan izin oss:GetObject.
Presigned URL yang dihasilkan menggunakan contoh kode 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 mestinya.