Zabezpečené nabízení nabízených oznámení ve službě Azure Notification Hubs
Přehled
Podpora nabízených oznámení v Microsoft Azure umožňuje přístup k snadno použitelné, více platformové škálované infrastruktuře nabízených oznámení, což výrazně zjednodušuje implementaci nabízených oznámení pro spotřebitelské i podnikové aplikace pro mobilní platformy.
Kvůli zákonným nebo bezpečnostním omezením může aplikace někdy chtít do oznámení zahrnout něco, co se nedá přenést přes standardní infrastrukturu nabízených oznámení. Tento kurz popisuje, jak stejného prostředí dosáhnout odesíláním citlivých informací prostřednictvím zabezpečeného a ověřeného připojení mezi klientským zařízením a back-endem aplikace.
Na vysoké úrovni je tok následující:
- Back-end aplikace:
- Ukládá zabezpečenou datovou část v back-endové databázi.
- Odešle ID tohoto oznámení do zařízení (neodesílají se žádné zabezpečené informace).
- Aplikace v zařízení při příjmu oznámení:
- Zařízení kontaktuje back-end a požádá o zabezpečenou datovou část.
- Aplikace může datovou část na zařízení zobrazit jako oznámení.
Je důležité si uvědomit, že v předchozím toku (a v tomto kurzu) předpokládáme, že zařízení po přihlášení uživatele ukládá ověřovací token v místním úložišti. To zaručuje bezproblémové prostředí, protože zařízení může pomocí tohoto tokenu načíst zabezpečenou datovou část oznámení. Pokud vaše aplikace neukládá ověřovací tokeny na zařízení nebo pokud je možné tyto tokeny vyprstit, měla by aplikace zařízení po přijetí oznámení zobrazit obecné oznámení s výzvou uživatele ke spuštění aplikace. Aplikace pak uživatele ověří a zobrazí datovou část oznámení.
Tento kurz zabezpečeného nabízení ukazuje, jak bezpečně odeslat nabízené oznámení. Kurz vychází z kurzu Upozorňovat uživatele , takže byste měli nejprve dokončit kroky v tomto kurzu.
Poznámka
V tomto kurzu se předpokládá, že jste vytvořili a nakonfigurovali centrum oznámení, jak je popsáno v tématu Odesílání nabízených oznámení do aplikací pro iOS pomocí služby Azure Notification Hubs.
Projekt WebAPI
V sadě Visual Studio otevřete projekt AppBackend , který jste vytvořili v kurzu Upozornit uživatele .
V souboru Notifications.cs nahraďte celou třídu Notifications následujícím kódem. Zástupné symboly nahraďte připojovacím řetězcem (s úplným přístupem) pro centrum oznámení a názvem centra. Tyto hodnoty můžete získat z Azure Portal. Tento modul teď představuje různá zabezpečená oznámení, která se budou odesílat. V úplné implementaci budou oznámení uložena v databázi; Pro zjednodušení je v tomto případě ukládáme do paměti.
public class Notification { public int Id { get; set; } public string Payload { get; set; } public bool Read { get; set; } } public class Notifications { public static Notifications Instance = new Notifications(); private List<Notification> notifications = new List<Notification>(); public NotificationHubClient Hub { get; set; } private Notifications() { Hub = NotificationHubClient.CreateClientFromConnectionString("{conn string with full access}", "{hub name}"); } public Notification CreateNotification(string payload) { var notification = new Notification() { Id = notifications.Count, Payload = payload, Read = false }; notifications.Add(notification); return notification; } public Notification ReadNotification(int id) { return notifications.ElementAt(id); } }
V NotificationsController.cs nahraďte kód uvnitř NotificationsController definice třídy následujícím kódem. Tato komponenta implementuje způsob, jak zařízení bezpečně načíst oznámení, a také poskytuje způsob (pro účely tohoto kurzu) k aktivaci zabezpečeného nabízeného oznámení do vašich zařízení. Upozorňujeme, že při odesílání oznámení do centra oznámení odesíláme pouze nezpracované oznámení s ID oznámení (a žádnou skutečnou zprávou):
public NotificationsController() { Notifications.Instance.CreateNotification("This is a secure notification!"); } // GET api/notifications/id public Notification Get(int id) { return Notifications.Instance.ReadNotification(id); } public async Task<HttpResponseMessage> Post() { var secureNotificationInTheBackend = Notifications.Instance.CreateNotification("Secure confirmation."); var usernameTag = "username:" + HttpContext.Current.User.Identity.Name; // windows var rawNotificationToBeSent = new Microsoft.Azure.NotificationHubs.WindowsNotification(secureNotificationInTheBackend.Id.ToString(), new Dictionary<string, string> { {"X-WNS-Type", "wns/raw"} }); await Notifications.Instance.Hub.SendNotificationAsync(rawNotificationToBeSent, usernameTag); // apns await Notifications.Instance.Hub.SendAppleNativeNotificationAsync("{\"aps\": {\"content-available\": 1}, \"secureId\": \"" + secureNotificationInTheBackend.Id.ToString() + "\"}", usernameTag); // gcm await Notifications.Instance.Hub.SendGcmNativeNotificationAsync("{\"data\": {\"secureId\": \"" + secureNotificationInTheBackend.Id.ToString() + "\"}}", usernameTag); return Request.CreateResponse(HttpStatusCode.OK); }
Všimněte si Post
, že metoda teď neodesílá informační zprávu. Odesílá nezpracované oznámení, které obsahuje pouze ID oznámení, a ne jakýkoli citlivý obsah. Nezapomeňte také okomentovat operaci odeslání pro platformy, pro které nemáte v centru oznámení nakonfigurované přihlašovací údaje, protože výsledkem budou chyby.
- Teď tuto aplikaci znovu nasadíme na web Azure, aby byla přístupná ze všech zařízení. Klikněte pravým tlačítkem na projekt AppBackend a vyberte Publikovat.
- Jako cíl publikování vyberte Web Azure. Přihlaste se pomocí účtu Azure, vyberte existující nebo nový web a poznamenejte si vlastnost cílové adresy URL na kartě Připojení . Tuto adresu URL budeme dále v tomto kurzu označovat jako váš back-endový koncový bod . Klikněte na Publikovat.
Úprava projektu iOS
Teď, když jste upravili back-end aplikace tak, aby odesílal jenom ID oznámení, musíte změnit aplikaci pro iOS, aby toto oznámení zpracovávala, a volat zpět back-end, aby načetl zabezpečenou zprávu, která se má zobrazit.
K dosažení tohoto cíle musíme napsat logiku pro načtení zabezpečeného obsahu z back-endu aplikace.
V
AppDelegate.m
nástroji se ujistěte, že aplikace registruje bezobslužná oznámení, aby zpracuje ID oznámení odeslané z back-endu. Přidejte možnost vUIRemoteNotificationTypeNewsstandContentAvailability
části didFinishLaunchingWithOptions:[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeNewsstandContentAvailability];
AppDelegate.m
V horní části přidejte oddíl implementace s následující deklarací:@interface AppDelegate () - (void) retrieveSecurePayloadWithId:(int)payloadId completion: (void(^)(NSString*, NSError*)) completion; @end
Pak do části implementace přidejte následující kód a nahraďte zástupný symbol
{back-end endpoint}
koncovým bodem pro váš back-end získaný dříve:NSString *const GetNotificationEndpoint = @"{back-end endpoint}/api/notifications"; - (void) retrieveSecurePayloadWithId:(int)payloadId completion: (void(^)(NSString*, NSError*)) completion; { // check if authenticated ANHViewController* rvc = (ANHViewController*) self.window.rootViewController; NSString* authenticationHeader = rvc.registerClient.authenticationHeader; if (!authenticationHeader) return; NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:nil delegateQueue:nil]; NSURL* requestURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%d", GetNotificationEndpoint, payloadId]]; NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:requestURL]; [request setHTTPMethod:@"GET"]; NSString* authorizationHeaderValue = [NSString stringWithFormat:@"Basic %@", authenticationHeader]; [request setValue:authorizationHeaderValue forHTTPHeaderField:@"Authorization"]; NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response; if (!error && httpResponse.statusCode == 200) { NSLog(@"Received secure payload: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error: &error]; completion([json objectForKey:@"Payload"], nil); } else { NSLog(@"Error status: %ld, request: %@", (long)httpResponse.statusCode, error); if (error) completion(nil, error); else { completion(nil, [NSError errorWithDomain:@"APICall" code:httpResponse.statusCode userInfo:nil]); } } }]; [dataTask resume]; }
Tato metoda volá back-end aplikace, aby načetl obsah oznámení pomocí přihlašovacích údajů uložených ve sdílených předvolbách.
Teď zpracujte příchozí oznámení a pomocí výše uvedené metody načtěte obsah, který se má zobrazit. Nejprve povolte spuštění aplikace pro iOS na pozadí při přijímání nabízených oznámení. V XCode vyberte projekt aplikace na levém panelu a pak klikněte na hlavní cíl aplikace v části Cíle v centrálním podokně.
Potom klikněte na kartu Schopnosti v horní části centrálního podokna a zaškrtněte políčko Vzdálená oznámení .
Přidejte
AppDelegate.m
následující metodu pro zpracování nabízených oznámení:-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"%@", userInfo); [self retrieveSecurePayloadWithId:[[userInfo objectForKey:@"secureId"] intValue] completion:^(NSString * payload, NSError *error) { if (!error) { // show local notification UILocalNotification* localNotification = [[UILocalNotification alloc] init]; localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:0]; localNotification.alertBody = payload; localNotification.timeZone = [NSTimeZone defaultTimeZone]; [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; completionHandler(UIBackgroundFetchResultNewData); } else { completionHandler(UIBackgroundFetchResultFailed); } }]; }
Všimněte si, že je vhodnější řešit případy chybějící vlastnosti hlavičky ověřování nebo odmítnutí back-endem. Konkrétní zpracování těchto případů závisí hlavně na vašem cílovém uživatelském prostředí. Jednou z možností je zobrazit oznámení s obecnou výzvou, aby se uživatel ověřil a načetl skutečné oznámení.
Spuštění aplikace
Pokud chcete aplikaci spustit, postupujte takto:
- V XCode spusťte aplikaci na fyzickém zařízení s iOSem (nabízená oznámení nebudou v simulátoru fungovat).
- V uživatelském rozhraní aplikace pro iOS zadejte uživatelské jméno a heslo. Může to být libovolný řetězec, ale musí to být stejná hodnota.
- V uživatelském rozhraní aplikace pro iOS klikněte na Přihlásit se. Pak klikněte na Odeslat nabízené oznámení. V centru oznámení by se mělo zobrazovat zabezpečené oznámení.