Mengautentikasi Pengguna dengan Database Dokumen Azure Cosmos DB dan Xamarin.Forms
Database dokumen Azure Cosmos DB mendukung koleksi yang dipartisi, yang dapat mencakup beberapa server dan partisi, sambil mendukung penyimpanan dan throughput tanpa batas. Artikel ini menjelaskan cara menggabungkan kontrol akses dengan koleksi yang dipartisi, sehingga pengguna hanya dapat mengakses dokumen mereka sendiri dalam aplikasi Xamarin.Forms .
Gambaran Umum
Kunci partisi harus ditentukan saat membuat koleksi yang dipartisi, dan dokumen dengan kunci partisi yang sama akan disimpan dalam partisi yang sama. Oleh karena itu, menentukan identitas pengguna sebagai kunci partisi akan menghasilkan koleksi yang dipartisi yang hanya akan menyimpan dokumen untuk pengguna tersebut. Ini juga memastikan bahwa database dokumen Azure Cosmos DB akan diskalakan seiring dengan meningkatnya jumlah pengguna dan item.
Akses harus diberikan ke koleksi apa pun, dan model kontrol akses Azure Cosmos DB for NoSQL menentukan dua jenis konstruksi akses:
- Kunci master memungkinkan akses administratif penuh ke semua sumber daya dalam akun Azure Cosmos DB, dan dibuat saat akun Azure Cosmos DB dibuat.
- Token sumber daya menangkap hubungan antara pengguna database dan izin yang dimiliki pengguna untuk sumber daya Azure Cosmos DB tertentu, seperti koleksi atau dokumen.
Mengekspos kunci master membuka akun Azure Cosmos DB untuk kemungkinan penggunaan berbahaya atau lalai. Namun, token sumber daya Azure Cosmos DB menyediakan mekanisme yang aman untuk memungkinkan klien membaca, menulis, dan menghapus sumber daya tertentu di akun Azure Cosmos DB sesuai dengan izin yang diberikan.
Pendekatan umum untuk meminta, menghasilkan, dan mengirimkan token sumber daya ke aplikasi seluler adalah dengan menggunakan broker token sumber daya. Diagram berikut menunjukkan gambaran umum tingkat tinggi tentang bagaimana aplikasi sampel menggunakan broker token sumber daya untuk mengelola akses ke data database dokumen:
Broker token sumber daya adalah layanan API Web tingkat menengah, yang dihosting di Azure App Service, yang memiliki kunci master akun Azure Cosmos DB. Aplikasi sampel menggunakan broker token sumber daya untuk mengelola akses ke data database dokumen sebagai berikut:
- Saat masuk, Xamarin.Forms aplikasi menghubungi Azure App Service untuk memulai alur autentikasi.
- Azure App Service melakukan alur autentikasi OAuth dengan Facebook. Setelah alur autentikasi selesai, Xamarin.Forms aplikasi menerima token akses.
- Aplikasi ini Xamarin.Forms menggunakan token akses untuk meminta token sumber daya dari broker token sumber daya.
- Broker token sumber daya menggunakan token akses untuk meminta identitas pengguna dari Facebook. Identitas pengguna kemudian digunakan untuk meminta token sumber daya dari Azure Cosmos DB, yang digunakan untuk memberikan akses baca/tulis ke koleksi yang dipartisi pengguna yang diautentikasi.
- Aplikasi ini Xamarin.Forms menggunakan token sumber daya untuk langsung mengakses sumber daya Azure Cosmos DB dengan izin yang ditentukan oleh token sumber daya.
Catatan
Ketika token sumber daya kedaluwarsa, permintaan database dokumen berikutnya akan menerima pengecualian 401 yang tidak sah. Pada titik ini, Xamarin.Forms aplikasi harus membuat ulang identitas dan meminta token sumber daya baru.
Untuk informasi selengkapnya tentang partisi Azure Cosmos DB, lihat Cara mempartisi dan menskalakan di Azure Cosmos DB. Untuk informasi selengkapnya tentang kontrol akses Azure Cosmos DB, lihat Mengamankan akses ke data Azure Cosmos DB dan Kontrol akses di Azure Cosmos DB for NoSQL.
Siapkan
Proses untuk mengintegrasikan broker token sumber daya ke dalam aplikasi Xamarin.Forms adalah sebagai berikut:
- Buat akun Azure Cosmos DB yang akan menggunakan kontrol akses. Untuk informasi selengkapnya, lihat Konfigurasi Azure Cosmos DB.
- Buat Azure App Service untuk menghosting broker token sumber daya. Untuk informasi selengkapnya, lihat Azure App Service Configuration.
- Buat aplikasi Facebook untuk melakukan autentikasi. Untuk informasi selengkapnya, lihat Konfigurasi Aplikasi Facebook.
- Konfigurasikan Azure App Service untuk melakukan autentikasi yang mudah dengan Facebook. Untuk informasi selengkapnya, lihat Konfigurasi Autentikasi Azure App Service.
- Konfigurasikan Xamarin.Forms aplikasi sampel untuk berkomunikasi dengan Azure App Service dan Azure Cosmos DB. Untuk informasi selengkapnya, lihat Xamarin.Forms Konfigurasi Aplikasi.
Catatan
Jika Anda tidak memiliki langganan Azure, buatlah akun gratis sebelum Anda memulai.
Konfigurasi Azure Cosmos DB
Proses untuk membuat akun Azure Cosmos DB yang akan menggunakan kontrol akses adalah sebagai berikut:
- Membuat akun Azure Cosmos DB. Untuk informasi selengkapnya, lihat Membuat akun Azure Cosmos DB.
- Di akun Azure Cosmos DB, buat koleksi baru bernama
UserItems
, yang menentukan kunci partisi ./userid
Konfigurasi Azure App Service
Proses untuk menghosting broker token sumber daya di Azure App Service adalah sebagai berikut:
Di portal Azure, buat aplikasi web App Service baru. Untuk informasi selengkapnya, lihat Membuat aplikasi web di Lingkungan App Service.
Di portal Azure, buka bilah App Pengaturan untuk aplikasi web, dan tambahkan pengaturan berikut:
accountUrl
– nilainya harus url akun Azure Cosmos DB dari bilah Kunci akun Azure Cosmos DB.accountKey
– nilainya harus berupa kunci master Azure Cosmos DB (primer atau sekunder) dari bilah Kunci akun Azure Cosmos DB.databaseId
– nilai harus menjadi nama database Azure Cosmos DB.collectionId
– nilai harus menjadi nama koleksi Azure Cosmos DB (dalam hal ini,UserItems
).hostUrl
– nilai harus berupa URL aplikasi web dari bilah Gambaran Umum akun App Service.
Cuplikan layar berikut menunjukkan konfigurasi ini:
Terbitkan solusi broker token sumber daya ke aplikasi web Azure App Service.
Konfigurasi Aplikasi Facebook
Proses untuk membuat aplikasi Facebook untuk melakukan autentikasi adalah sebagai berikut:
- Membuat aplikasi Facebook. Untuk informasi selengkapnya, lihat Mendaftarkan dan Mengonfigurasi Aplikasi di Pusat Pengembang Facebook.
- Tambahkan produk Login Facebook ke aplikasi. Untuk informasi selengkapnya, lihat Menambahkan Login Facebook ke Aplikasi atau Situs Web Anda di Pusat Pengembang Facebook.
- Konfigurasikan Login Facebook sebagai berikut:
- Aktifkan Login OAuth Klien.
- Aktifkan Login Web OAuth.
- Atur URI pengalihan OAuth yang Valid ke URI aplikasi web App Service, dengan
/.auth/login/facebook/callback
ditambahkan.
Cuplikan layar berikut menunjukkan konfigurasi ini:
Untuk informasi selengkapnya, lihat Mendaftarkan aplikasi Anda dengan Facebook.
Konfigurasi Autentikasi Azure App Service
Proses untuk mengonfigurasi autentikasi mudah App Service adalah sebagai berikut:
Di Portal Microsoft Azure, navigasikan ke aplikasi web App Service.
Di Portal Microsoft Azure, buka bilah Autentikasi / Otorisasi dan lakukan konfigurasi berikut:
- Autentikasi App Service harus diaktifkan.
- Tindakan yang harus diambil saat permintaan tidak diautentikasi harus diatur ke Masuk dengan Facebook.
Cuplikan layar berikut menunjukkan konfigurasi ini:
Aplikasi web App Service juga harus dikonfigurasi untuk berkomunikasi dengan aplikasi Facebook untuk mengaktifkan alur autentikasi. Ini dapat dicapai dengan memilih IdP Facebook, dan memasukkan nilai ID Aplikasi dan Rahasia Aplikasi dari pengaturan aplikasi Facebook di Pusat Pengembang Facebook. Untuk informasi selengkapnya, lihat Menambahkan informasi Facebook ke aplikasi Anda.
Xamarin.Forms Konfigurasi Aplikasi
Proses untuk mengonfigurasi Xamarin.Forms aplikasi sampel adalah sebagai berikut:
- Buka solusinya Xamarin.Forms .
- Buka
Constants.cs
dan perbarui nilai konstanta berikut:EndpointUri
– nilainya harus url akun Azure Cosmos DB dari bilah Kunci akun Azure Cosmos DB.DatabaseName
– nilai harus menjadi nama database dokumen.CollectionName
– nilai harus menjadi nama koleksi database dokumen (dalam hal ini,UserItems
).ResourceTokenBrokerUrl
– nilainya harus berupa URL aplikasi web broker token sumber daya dari bilah Gambaran Umum akun App Service.
Memulai Masuk
Aplikasi sampel memulai proses masuk dengan mengalihkan browser ke URL Penyedia Identitas, seperti yang ditunjukkan dalam contoh kode berikut:
var auth = new Xamarin.Auth.WebRedirectAuthenticator(
new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/facebook"),
new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/done"));
Ini menyebabkan alur autentikasi OAuth dimulai antara Azure App Service dan Facebook, yang menampilkan halaman masuk Facebook:
Login dapat dibatalkan dengan menekan tombol Batalkan di iOS atau dengan menekan tombol Kembali di Android, dalam hal ini pengguna tetap tidak diautentikasi dan antarmuka pengguna idP dihapus dari layar.
Mendapatkan Token Sumber Daya
Setelah autentikasi berhasil, peristiwa akan WebRedirectAuthenticator.Completed
diaktifkan. Contoh kode berikut menunjukkan penanganan peristiwa ini:
auth.Completed += async (sender, e) =>
{
if (e.IsAuthenticated && e.Account.Properties.ContainsKey("token"))
{
var easyAuthResponseJson = JsonConvert.DeserializeObject<JObject>(e.Account.Properties["token"]);
var easyAuthToken = easyAuthResponseJson.GetValue("authenticationToken").ToString();
// Call the ResourceBroker to get the resource token
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Add("x-zumo-auth", easyAuthToken);
var response = await httpClient.GetAsync(Constants.ResourceTokenBrokerUrl + "/api/resourcetoken/");
var jsonString = await response.Content.ReadAsStringAsync();
var tokenJson = JsonConvert.DeserializeObject<JObject>(jsonString);
resourceToken = tokenJson.GetValue("token").ToString();
UserId = tokenJson.GetValue("userid").ToString();
if (!string.IsNullOrWhiteSpace(resourceToken))
{
client = new DocumentClient(new Uri(Constants.EndpointUri), resourceToken);
...
}
...
}
}
};
Hasil autentikasi yang berhasil adalah token akses, yang merupakan properti yang tersedia AuthenticatorCompletedEventArgs.Account
. Token akses diekstrak dan digunakan dalam permintaan GET ke API broker resourcetoken
token sumber daya.
resourcetoken
API menggunakan token akses untuk meminta identitas pengguna dari Facebook, yang pada gilirannya digunakan untuk meminta token sumber daya dari Azure Cosmos DB. Jika dokumen izin yang valid sudah ada untuk pengguna dalam database dokumen, dokumen diambil dan dokumen JSON yang berisi token sumber daya dikembalikan ke Xamarin.Forms aplikasi. Jika dokumen izin yang valid tidak ada untuk pengguna, pengguna dan izin dibuat dalam database dokumen, dan token sumber daya diekstrak dari dokumen izin dan dikembalikan ke Xamarin.Forms aplikasi dalam dokumen JSON.
Catatan
Pengguna database dokumen adalah sumber daya yang terkait dengan database dokumen, dan setiap database mungkin berisi nol atau lebih pengguna. Izin database dokumen adalah sumber daya yang terkait dengan pengguna database dokumen, dan setiap pengguna mungkin berisi nol atau lebih izin. Sumber daya izin menyediakan akses ke token keamanan yang diperlukan pengguna saat mencoba mengakses sumber daya seperti dokumen.
resourcetoken
Jika API berhasil diselesaikan, API akan mengirim kode status HTTP 200 (OK) dalam respons, bersama dengan dokumen JSON yang berisi token sumber daya. Data JSON berikut menunjukkan pesan respons yang berhasil tipikal:
{
"id": "John Smithpermission",
"token": "type=resource&ver=1&sig=zx6k2zzxqktzvuzuku4b7y==;a74aukk99qtwk8v5rxfrfz7ay7zzqfkbfkremrwtaapvavw2mrvia4umbi/7iiwkrrq+buqqrzkaq4pp15y6bki1u//zf7p9x/aefbvqvq3tjjqiffurfx+vexa1xarxkkv9rbua9ypfzr47xpp5vmxuvzbekkwq6txme0xxxbjhzaxbkvzaji+iru3xqjp05amvq1r1q2k+qrarurhmjzah/ha0evixazkve2xk1zu9u/jpyf1xrwbkxqpzebvqwma+hyyaazemr6qx9uz9be==;",
"expires": 4035948,
"userid": "John Smith"
}
Penanganan WebRedirectAuthenticator.Completed
aktivitas membaca respons dari resourcetoken
API dan mengekstrak token sumber daya dan id pengguna. Token sumber daya kemudian diteruskan sebagai argumen ke DocumentClient
konstruktor, yang merangkum titik akhir, kredensial, dan kebijakan koneksi yang digunakan untuk mengakses Azure Cosmos DB, dan digunakan untuk mengonfigurasi dan menjalankan permintaan terhadap Azure Cosmos DB. Token sumber daya dikirim dengan setiap permintaan untuk langsung mengakses sumber daya, dan menunjukkan bahwa akses baca/tulis ke koleksi yang dipartisi pengguna terautentikasi diberikan.
Mengambil Dokumen
Mengambil dokumen yang hanya milik pengguna yang diautentikasi dapat dicapai dengan membuat kueri dokumen yang menyertakan id pengguna sebagai kunci partisi, dan ditunjukkan dalam contoh kode berikut:
var query = client.CreateDocumentQuery<TodoItem>(collectionLink,
new FeedOptions
{
MaxItemCount = -1,
PartitionKey = new PartitionKey(UserId)
})
.Where(item => !item.Id.Contains("permission"))
.AsDocumentQuery();
while (query.HasMoreResults)
{
Items.AddRange(await query.ExecuteNextAsync<TodoItem>());
}
Kueri secara asinkron mengambil semua dokumen milik pengguna yang diautentikasi, dari koleksi yang ditentukan, dan menempatkannya dalam List<TodoItem>
koleksi untuk ditampilkan.
Metode CreateDocumentQuery<T>
menentukan Uri
argumen yang mewakili koleksi yang harus dikueri untuk dokumen, dan FeedOptions
objek. Objek FeedOptions
menentukan bahwa jumlah item yang tidak terbatas dapat dikembalikan oleh kueri, dan id pengguna sebagai kunci partisi. Ini memastikan bahwa hanya dokumen dalam koleksi yang dipartisi pengguna yang dikembalikan dalam hasilnya.
Catatan
Perhatikan bahwa dokumen izin, yang dibuat oleh broker token sumber daya, disimpan dalam koleksi dokumen yang sama dengan dokumen yang dibuat oleh Xamarin.Forms aplikasi. Oleh karena itu, kueri dokumen berisi Where
klausul yang menerapkan predikat pemfilteran ke kueri terhadap kumpulan dokumen. Klausa ini memastikan bahwa dokumen izin tidak dikembalikan dari kumpulan dokumen.
Untuk informasi selengkapnya tentang mengambil dokumen dari kumpulan dokumen, lihat Mengambil Dokumen Koleksi Dokumen.
Menyisipkan Dokumen
Sebelum menyisipkan dokumen ke dalam koleksi dokumen, TodoItem.UserId
properti harus diperbarui dengan nilai yang digunakan sebagai kunci partisi, seperti yang ditunjukkan dalam contoh kode berikut:
item.UserId = UserId;
await client.CreateDocumentAsync(collectionLink, item);
Ini memastikan bahwa dokumen akan dimasukkan ke dalam koleksi yang dipartisi pengguna.
Untuk informasi selengkapnya tentang menyisipkan dokumen ke dalam kumpulan dokumen, lihat Menyisipkan Dokumen ke dalam Kumpulan Dokumen.
Menghapus Dokumen
Nilai kunci partisi harus ditentukan saat menghapus dokumen dari koleksi yang dipartisi, seperti yang ditunjukkan dalam contoh kode berikut:
await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(Constants.DatabaseName, Constants.CollectionName, id),
new RequestOptions
{
PartitionKey = new PartitionKey(UserId)
});
Ini memastikan bahwa Azure Cosmos DB mengetahui koleksi yang dipartisi mana untuk menghapus dokumen.
Untuk informasi selengkapnya tentang menghapus dokumen dari kumpulan dokumen, lihat Menghapus Dokumen dari Kumpulan Dokumen.
Ringkasan
Artikel ini menjelaskan cara menggabungkan kontrol akses dengan koleksi yang dipartisi, sehingga pengguna hanya dapat mengakses dokumen database dokumen mereka sendiri dalam aplikasi Xamarin.Forms . Menentukan identitas pengguna sebagai kunci partisi memastikan bahwa koleksi yang dipartisi hanya dapat menyimpan dokumen untuk pengguna tersebut.