Bagikan melalui


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:

Proses Autentikasi 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:

  1. Saat masuk, Xamarin.Forms aplikasi menghubungi Azure App Service untuk memulai alur autentikasi.
  2. Azure App Service melakukan alur autentikasi OAuth dengan Facebook. Setelah alur autentikasi selesai, Xamarin.Forms aplikasi menerima token akses.
  3. Aplikasi ini Xamarin.Forms menggunakan token akses untuk meminta token sumber daya dari broker token sumber daya.
  4. 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.
  5. 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:

  1. Buat akun Azure Cosmos DB yang akan menggunakan kontrol akses. Untuk informasi selengkapnya, lihat Konfigurasi Azure Cosmos DB.
  2. Buat Azure App Service untuk menghosting broker token sumber daya. Untuk informasi selengkapnya, lihat Azure App Service Configuration.
  3. Buat aplikasi Facebook untuk melakukan autentikasi. Untuk informasi selengkapnya, lihat Konfigurasi Aplikasi Facebook.
  4. Konfigurasikan Azure App Service untuk melakukan autentikasi yang mudah dengan Facebook. Untuk informasi selengkapnya, lihat Konfigurasi Autentikasi Azure App Service.
  5. 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:

  1. Membuat akun Azure Cosmos DB. Untuk informasi selengkapnya, lihat Membuat akun Azure Cosmos DB.
  2. 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:

  1. Di portal Azure, buat aplikasi web App Service baru. Untuk informasi selengkapnya, lihat Membuat aplikasi web di Lingkungan App Service.

  2. 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:

    App Service Web App Pengaturan

  3. 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:

  1. Membuat aplikasi Facebook. Untuk informasi selengkapnya, lihat Mendaftarkan dan Mengonfigurasi Aplikasi di Pusat Pengembang Facebook.
  2. Tambahkan produk Login Facebook ke aplikasi. Untuk informasi selengkapnya, lihat Menambahkan Login Facebook ke Aplikasi atau Situs Web Anda di Pusat Pengembang Facebook.
  3. 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:

Pengaturan OAuth Login Facebook

Untuk informasi selengkapnya, lihat Mendaftarkan aplikasi Anda dengan Facebook.

Konfigurasi Autentikasi Azure App Service

Proses untuk mengonfigurasi autentikasi mudah App Service adalah sebagai berikut:

  1. Di Portal Microsoft Azure, navigasikan ke aplikasi web App Service.

  2. 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:

    Pengaturan Autentikasi Aplikasi Web App Service

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:

  1. Buka solusinya Xamarin.Forms .
  2. 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:

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.