Ověřování uživatelů pomocí databáze dokumentů Azure Cosmos DB a Xamarin.Forms

Databáze dokumentů Azure Cosmos DB podporují dělené kolekce, které můžou zahrnovat více serverů a oddílů a současně podporují neomezené úložiště a propustnost. Tento článek vysvětluje, jak zkombinovat řízení přístupu s dělenými kolekcemi, aby uživatel měl přístup jenom k vlastním dokumentům Xamarin.Forms v aplikaci.

Přehled

Klíč oddílu musí být zadán při vytváření dělené kolekce a dokumenty se stejným klíčem oddílu budou uloženy ve stejném oddílu. Proto zadáním identity uživatele jako klíče oddílu vznikne dělená kolekce, která bude ukládat jenom dokumenty pro daného uživatele. Tím se také zajistí, že se databáze dokumentů Azure Cosmos DB bude škálovat s rostoucím počtem uživatelů a položek.

Přístup musí být udělen pro libovolnou kolekci a model řízení přístupu Azure Cosmos DB for NoSQL definuje dva typy konstruktorů přístupu:

  • Hlavní klíče umožňují úplný přístup pro správu ke všem prostředkům v rámci účtu služby Azure Cosmos DB a vytvoří se při vytvoření účtu služby Azure Cosmos DB.
  • Tokeny prostředků zachycují vztah mezi uživatelem databáze a oprávněním, které má uživatel pro konkrétní prostředek Služby Azure Cosmos DB, například kolekci nebo dokument.

Vystavení hlavního klíče otevře účet služby Azure Cosmos DB pro možnost škodlivého nebo negligentního použití. Tokeny prostředků Azure Cosmos DB ale poskytují bezpečný mechanismus, který umožňuje klientům číst, zapisovat a odstraňovat konkrétní prostředky v účtu služby Azure Cosmos DB podle udělených oprávnění.

Typickým přístupem k vyžádání, generování a doručování tokenů prostředků do mobilní aplikace je použití zprostředkovatele tokenů prostředků. Následující diagram znázorňuje základní přehled o tom, jak ukázková aplikace používá zprostředkovatele tokenů prostředků ke správě přístupu k datům databáze dokumentů:

Proces ověřování databáze dokumentů

Zprostředkovatel tokenů prostředků je služba webového rozhraní API střední vrstvy hostovaná ve službě Aplikace Azure Service, která má hlavní klíč účtu služby Azure Cosmos DB. Ukázková aplikace používá zprostředkovatele tokenů prostředků ke správě přístupu k datům databáze dokumentů následujícím způsobem:

  1. Při přihlášení Xamarin.Forms aplikace kontaktuje službu Aplikace Azure Service, aby iniciovala tok ověřování.
  2. Aplikace Azure Služba provádí tok ověřování OAuth s Facebookem. Po dokončení Xamarin.Forms ověřovacího toku obdrží aplikace přístupový token.
  3. Aplikace Xamarin.Forms použije přístupový token k vyžádání tokenu prostředku zprostředkovatele tokenu prostředku.
  4. Zprostředkovatel tokenu prostředku používá přístupový token k vyžádání identity uživatele z Facebooku. Identita uživatele se pak použije k vyžádání tokenu prostředku ze služby Azure Cosmos DB, který slouží k udělení přístupu pro čtení a zápis k dělené kolekci ověřeného uživatele.
  5. Aplikace Xamarin.Forms používá token prostředku k přímému přístupu k prostředkům Azure Cosmos DB s oprávněními definovanými tokenem prostředku.

Poznámka:

Po vypršení platnosti tokenu prostředku obdrží následné žádosti o databázi dokumentů neautorizované výjimky 401. V tuto chvíli Xamarin.Forms by aplikace měly identitu znovu navázat a požádat o nový token prostředku.

Další informace o dělení služby Azure Cosmos DB najdete v tématu Postup dělení a škálování ve službě Azure Cosmos DB. Další informace o řízení přístupu ke službě Azure Cosmos DB najdete v tématu Zabezpečení přístupu k datům Azure Cosmos DB a řízení přístupu ve službě Azure Cosmos DB for NoSQL.

Nastavení

Proces integrace zprostředkovatele tokenů prostředků do Xamarin.Forms aplikace je následující:

  1. Vytvořte účet služby Azure Cosmos DB, který bude používat řízení přístupu. Další informace najdete v tématu Konfigurace služby Azure Cosmos DB.
  2. Vytvořte službu Aplikace Azure pro hostování zprostředkovatele tokenů prostředků. Další informace najdete v tématu Aplikace Azure Konfigurace služby.
  3. Vytvořte aplikaci pro Facebook, která bude provádět ověřování. Další informace najdete v tématu Konfigurace aplikace pro Facebook.
  4. Nakonfigurujte službu Aplikace Azure tak, aby prováděla snadné ověřování pomocí Facebooku. Další informace najdete v tématu Aplikace Azure Konfigurace ověřování služby.
  5. Nakonfigurujte ukázkovou Xamarin.Forms aplikaci pro komunikaci se službou Aplikace Azure Service a službou Azure Cosmos DB. Další informace naleznete v tématu Xamarin.Forms Konfigurace aplikace.

Poznámka:

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

Konfigurace služby Azure Cosmos DB

Proces vytvoření účtu služby Azure Cosmos DB, který bude používat řízení přístupu, je následující:

  1. Vytvořit účet služby Azure Cosmos DB. Další informace najdete v tématu Vytvoření účtu služby Azure Cosmos DB.
  2. V účtu služby Azure Cosmos DB vytvořte novou kolekci s názvem UserItems, která určuje klíč oddílu /userid.

Konfigurace služby Aplikace Azure

Proces hostování zprostředkovatele tokenů prostředků ve službě Aplikace Azure Service je následující:

  1. Na webu Azure Portal vytvořte novou webovou aplikaci App Service. Další informace najdete v tématu Vytvoření webové aplikace ve službě App Service Environment.

  2. Na webu Azure Portal otevřete okno Nastavení aplikace pro webovou aplikaci a přidejte následující nastavení:

    • accountUrl – hodnota by měla být adresa URL účtu služby Azure Cosmos DB z okna Klíče účtu služby Azure Cosmos DB.
    • accountKey – hodnota by měla být hlavní klíč služby Azure Cosmos DB (primární nebo sekundární) v okně Klíče účtu služby Azure Cosmos DB.
    • databaseId – hodnota by měla být název databáze Azure Cosmos DB.
    • collectionId – hodnota by měla být název kolekce Azure Cosmos DB (v tomto případě UserItems).
    • hostUrl – hodnota by měla být adresa URL webové aplikace v okně Přehled účtu služby App Service.

    Následující snímek obrazovky ukazuje tuto konfiguraci:

    Nastavení webové aplikace App Service

  3. Publikujte řešení zprostředkovatele tokenů prostředků do webové aplikace Aplikace Azure Service.

Konfigurace aplikace pro Facebook

Proces vytvoření facebookové aplikace pro ověření je následující:

  1. Vytvořte aplikaci pro Facebook. Další informace najdete v tématu Registrace a konfigurace aplikace v Centru pro vývojáře na Facebooku.
  2. Přidejte do aplikace produkt Přihlášení k Facebooku. Další informace najdete v tématu Přidání přihlášení k Facebooku do vaší aplikace nebo webu v Centru pro vývojáře Na Facebooku.
  3. Přihlášení k Facebooku nakonfigurujte následujícím způsobem:
    • Povolte přihlášení klienta OAuth.
    • Povolte přihlášení webového OAuth.
    • Nastavte platný identifikátor URI přesměrování OAuth na identifikátor URI webové aplikace služby App Service s připojeným kódem /.auth/login/facebook/callback .

Následující snímek obrazovky ukazuje tuto konfiguraci:

Přihlášení k Facebooku Nastavení OAuth

Další informace najdete v tématu Registrace aplikace na Facebooku.

Konfigurace ověřování služby Aplikace Azure

Proces konfigurace snadného ověřování služby App Service je následující:

  1. Na webu Azure Portal přejděte do webové aplikace App Service.

  2. Na webu Azure Portal otevřete okno Ověřování a autorizace a proveďte následující konfiguraci:

    • Ověřování pomocí služby App Service by mělo být zapnuté.
    • Akce, která se má provést, když není žádost ověřená, by měla být nastavená na Přihlásit se přes Facebook.

    Následující snímek obrazovky ukazuje tuto konfiguraci:

    Nastavení ověřování webové aplikace App Service

Webová aplikace App Service by měla být také nakonfigurovaná tak, aby komunikovala s aplikací Facebook, aby povolovala tok ověřování. Toho můžete dosáhnout tak, že vyberete zprostředkovatele identity facebooku a zadáte hodnoty ID aplikace a tajného kódu aplikace z nastavení aplikace Facebook v Centru pro vývojáře Na Facebooku. Další informace najdete v tématu Přidání informací o Facebooku do aplikace.

Xamarin.Forms Konfigurace aplikace

Proces konfigurace Xamarin.Forms ukázkové aplikace je následující:

  1. Xamarin.Forms Otevřete řešení.
  2. Otevřete Constants.cs a aktualizujte hodnoty následujících konstant:
    • EndpointUri – hodnota by měla být adresa URL účtu služby Azure Cosmos DB z okna Klíče účtu služby Azure Cosmos DB.
    • DatabaseName – hodnota by měla být název databáze dokumentů.
    • CollectionName – hodnota by měla být název kolekce databáze dokumentů (v tomto případě UserItems).
    • ResourceTokenBrokerUrl – hodnota by měla být adresa URL webové aplikace zprostředkovatele tokenu prostředku z okna Přehled účtu služby App Service.

Inicializování přihlášení

Ukázková aplikace zahájí proces přihlášení přesměrováním prohlížeče na adresu URL zprostředkovatele identity, jak je znázorněno v následujícím ukázkovém kódu:

var auth = new Xamarin.Auth.WebRedirectAuthenticator(
  new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/facebook"),
  new Uri(Constants.ResourceTokenBrokerUrl + "/.auth/login/done"));

To způsobí, že se mezi službou Aplikace Azure Service a Facebookem zahájí tok ověřování OAuth, který zobrazí přihlašovací stránku Facebooku:

Přihlášení k Facebooku

Přihlášení můžete zrušit stisknutím tlačítka Storno v iOSu nebo stisknutím tlačítka Zpět v Androidu, v takovém případě zůstane uživatel neověřený a uživatelské rozhraní zprostředkovatele identity se z obrazovky odebere.

Získání tokenu prostředku

Po úspěšném ověření se WebRedirectAuthenticator.Completed událost aktivuje. Následující příklad kódu ukazuje zpracování této události:

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);
        ...
      }
      ...
    }
  }
};

Výsledkem úspěšného ověření je přístupový token, který je k dispozici AuthenticatorCompletedEventArgs.Account vlastnost. Přístupový token se extrahuje a použije se v požadavku GET na rozhraní API zprostředkovatele tokenů resourcetoken prostředků.

Rozhraní resourcetoken API používá přístupový token k vyžádání identity uživatele z Facebooku, který se zase používá k vyžádání tokenu prostředku ze služby Azure Cosmos DB. Pokud pro uživatele v databázi dokumentů již existuje platný dokument oprávnění, načte se a do aplikace se vrátí Xamarin.Forms dokument JSON obsahující token prostředku. Pokud pro uživatele neexistuje platný dokument oprávnění, uživatel a oprávnění se vytvoří v databázi dokumentů a token prostředku se extrahuje z dokumentu oprávnění a vrátí se do Xamarin.Forms aplikace v dokumentu JSON.

Poznámka:

Uživatel databáze dokumentů je prostředek přidružený k databázi dokumentů a každá databáze může obsahovat nula nebo více uživatelů. Oprávnění k databázi dokumentů je prostředek přidružený k uživateli databáze dokumentů a každý uživatel může obsahovat nulová nebo více oprávnění. Prostředek oprávnění poskytuje přístup k tokenu zabezpečení, který uživatel vyžaduje při pokusu o přístup k prostředku, jako je dokument.

Pokud se resourcetoken rozhraní API úspěšně dokončí, odešle v odpovědi stavový kód HTTP 200 (OK) spolu s dokumentem JSON obsahujícím token prostředku. Následující data JSON ukazují typickou úspěšnou zprávu o odpovědi:

{
  "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"
}

Obslužná rutina WebRedirectAuthenticator.Completed události přečte odpověď z resourcetoken rozhraní API a extrahuje token prostředku a ID uživatele. Token prostředku se pak předá jako argument DocumentClient konstruktoru, který zapouzdřuje koncový bod, přihlašovací údaje a zásady připojení používané pro přístup ke službě Azure Cosmos DB a slouží ke konfiguraci a spouštění požadavků na službu Azure Cosmos DB. Token prostředku se odešle s každou žádostí o přímý přístup k prostředku a indikuje, že je udělen přístup pro čtení a zápis k dělené kolekci ověřených uživatelů.

Načítání dokumentů

Načtení dokumentů, které patří pouze ověřenému uživateli, lze dosáhnout vytvořením dotazu na dokument, který obsahuje ID uživatele jako klíč oddílu, a je demonstrován v následujícím příkladu kódu:

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>());
}

Dotaz asynchronně načte všechny dokumenty patřící ověřenému uživateli ze zadané kolekce a umístí je do List<TodoItem> kolekce pro zobrazení.

Metoda CreateDocumentQuery<T> určuje Uri argument, který představuje kolekci, která by se měla dotazovat na dokumenty a FeedOptions objekt. Objekt FeedOptions určuje, že dotaz může vrátit neomezený počet položek a ID uživatele jako klíč oddílu. Tím se zajistí, že se ve výsledku vrátí jenom dokumenty v dělené kolekci uživatele.

Poznámka:

Všimněte si, že dokumenty oprávnění vytvořené zprostředkovatelem tokenů prostředků jsou uloženy ve stejné kolekci dokumentů jako dokumenty vytvořené Xamarin.Forms aplikací. Dotaz na dokument proto obsahuje Where klauzuli, která na dotaz použije predikát filtrování pro kolekci dokumentů. Tato klauzule zajišťuje, že dokumenty oprávnění nebudou vráceny z kolekce dokumentů.

Další informace o načítání dokumentů z kolekce dokumentů naleznete v tématu Načítání dokumentů kolekce dokumentů.

Vkládání dokumentů

Před vložením dokumentu do kolekce TodoItem.UserId dokumentů by se vlastnost měla aktualizovat hodnotou použitou jako klíč oddílu, jak je znázorněno v následujícím příkladu kódu:

item.UserId = UserId;
await client.CreateDocumentAsync(collectionLink, item);

Tím zajistíte, že dokument se vloží do dělené kolekce uživatele.

Další informace o vložení dokumentu do kolekce dokumentů naleznete v tématu Vložení dokumentu do kolekce dokumentů.

Odstraňování dokumentů

Při odstraňování dokumentu z dělené kolekce musí být zadána hodnota klíče oddílu, jak je znázorněno v následujícím příkladu kódu:

await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(Constants.DatabaseName, Constants.CollectionName, id),
                 new RequestOptions
                 {
                   PartitionKey = new PartitionKey(UserId)
                 });

Tím se zajistí, že Azure Cosmos DB ví, ze které dělené kolekce se má dokument odstranit.

Další informace o odstranění dokumentu z kolekce dokumentů naleznete v tématu Odstranění dokumentu z kolekce dokumentů.

Shrnutí

Tento článek vysvětluje, jak kombinovat řízení přístupu s dělenými kolekcemi, aby uživatel mohl přistupovat pouze k vlastním dokumentům databáze dokumentů v Xamarin.Forms aplikaci. Zadáním identity uživatele jako klíče oddílu zajistíte, že dělená kolekce může ukládat jenom dokumenty pro daného uživatele.