Az Azure Notification Hubs biztonságos leküldése
Áttekintés
A Leküldéses értesítések támogatása a Microsoft Azure-ban lehetővé teszi egy könnyen használható, többplatformos, felskálázott leküldéses infrastruktúra elérését, amely jelentősen leegyszerűsíti a leküldéses értesítések mobilplatformokra szánt fogyasztói és nagyvállalati alkalmazások számára történő megvalósítását.
Szabályozási vagy biztonsági korlátozások miatt előfordulhat, hogy egy alkalmazás bele szeretne foglalni valamit az értesítésbe, amely nem továbbítható a szabványos leküldéses értesítési infrastruktúrán keresztül. Ez az oktatóanyag bemutatja, hogyan érheti el ugyanazt a felületet úgy, hogy bizalmas adatokat küld egy biztonságos, hitelesített kapcsolaton keresztül az ügyféleszköz és az alkalmazás háttérrendszere között.
Magas szinten a folyamat a következő:
- Az alkalmazás háttérrendszere:
- Biztonságos hasznos adatokat tárol a háttéradatbázisban.
- Elküldi az értesítés azonosítóját az eszköznek (a rendszer nem küld biztonságos adatokat).
- Az alkalmazás az eszközön az értesítés fogadásakor:
- Az eszköz kapcsolatba lép a háttérrendszerrel, és kéri a biztonságos hasznos adatokat.
- Az alkalmazás értesítésként megjelenítheti a hasznos adatokat az eszközön.
Fontos megjegyezni, hogy az előző folyamatban (és ebben az oktatóanyagban) feltételezzük, hogy az eszköz egy hitelesítési jogkivonatot tárol a helyi tárolóban, miután a felhasználó bejelentkezett. Ez garantálja a zökkenőmentes felhasználói élményt, mivel az eszköz ezzel a jogkivonattal lekérheti az értesítés biztonságos hasznos adatait. Ha az alkalmazás nem tárolja a hitelesítési jogkivonatokat az eszközön, vagy ha ezek a jogkivonatok lejártak, az eszközalkalmazásnak az értesítés beérkezésekor egy általános értesítést kell megjelenítenie, amely az alkalmazás elindítására kéri a felhasználót. Az alkalmazás ezután hitelesíti a felhasználót, és megjeleníti az értesítés hasznos adatait.
Ez a biztonságos leküldéses oktatóanyag bemutatja, hogyan küldhet leküldéses értesítéseket biztonságosan. Az oktatóanyag a Felhasználók értesítése oktatóanyagra épül, ezért először az oktatóanyag lépéseit kell elvégeznie.
Megjegyzés
Ez az oktatóanyag feltételezi, hogy létrehozta és konfigurálta az értesítési központot az Leküldéses értesítések küldése iOS-alkalmazásokba az Azure Notification Hubs használatával című cikkben leírtak szerint.
WebAPI-projekt
A Visual Studióban nyissa meg a Felhasználók értesítése oktatóanyagban létrehozott AppBackend projektet.
A Notifications.cs fájlban cserélje le a teljes Notifications osztályt a következő kódra. Mindenképpen cserélje le a helyőrzőket az értesítési központ kapcsolati sztring (teljes hozzáféréssel) és a központ nevére. Ezeket az értékeket a Azure Portal szerezheti be. Ez a modul most a különböző biztonságos értesítéseket jelöli, amelyeket a rendszer elküld. A teljes megvalósítás során az értesítések egy adatbázisban lesznek tárolva; az egyszerűség kedvéért ebben az esetben a memóriában tároljuk őket.
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); } }
A NotificationsController.cs fájlban cserélje le a NotificationsController osztálydefinícióban található kódot a következő kódra. Ez az összetevő lehetővé teszi, hogy az eszköz biztonságosan lekérje az értesítést, és lehetővé teszi (az oktatóanyag alkalmazásában) a biztonságos leküldés aktiválását az eszközökre. Vegye figyelembe, hogy amikor az értesítési központba küldi az értesítést, csak nyers értesítést küldünk az értesítés azonosítójával (és nincs tényleges üzenet):
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); }
Vegye figyelembe, hogy a Post
metódus most nem küld bejelentési értesítést. Nyers értesítést küld, amely csak az értesítés azonosítóját tartalmazza, bizalmas tartalmat nem. Emellett mindenképpen tegye megjegyzésbe azoknak a platformoknak a küldési műveletét, amelyekhez nincs konfigurálva hitelesítő adatok az értesítési központban, mivel ezek hibákat eredményeznek.
- Most újra üzembe fogjuk helyezni ezt az alkalmazást egy Azure-webhelyen, hogy minden eszközről elérhető legyen. Kattintson jobb gombbal az AppBackend projektre, és válassza a Publish (Közzététel) lehetőséget.
- Közzétételi célként válassza az Azure-webhely lehetőséget. Jelentkezzen be azure-fiókjával, válasszon ki egy meglévő vagy új webhelyet, és jegyezze fel a cél URL-cím tulajdonságát a Kapcsolat lapon. Az oktatóanyag későbbi részében erre az URL-címre fogunk hivatkozni háttérbeli végpontként . Kattintson a Közzététel gombra.
Az iOS-projekt módosítása
Most, hogy módosította az alkalmazás háttérrendszerét, hogy csak egy értesítés azonosítóját küldje el, módosítania kell az iOS-alkalmazást az értesítés kezeléséhez, és vissza kell hívnia a háttérrendszert a megjelenítendő biztonságos üzenet lekéréséhez.
A cél eléréséhez meg kell írnunk a logikát, hogy lekérjük a biztonságos tartalmat az alkalmazás háttérrendszeréből.
Győződjön
AppDelegate.m
meg arról, hogy az alkalmazás regisztrál a csendes értesítésekre, hogy feldolgozza a háttérrendszerből küldött értesítési azonosítót. Adja hozzá a lehetőséget aUIRemoteNotificationTypeNewsstandContentAvailability
didFinishLaunchingWithOptions elemhez:[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeNewsstandContentAvailability];
AppDelegate.m
A felül található Implementáció hozzáadása szakaszban a következő deklarációval:@interface AppDelegate () - (void) retrieveSecurePayloadWithId:(int)payloadId completion: (void(^)(NSString*, NSError*)) completion; @end
Ezután adja hozzá az implementálási szakaszhoz a következő kódot, és helyettesítse a helyőrzőt
{back-end endpoint}
a korábban beszerzett háttérrendszer végpontjával: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]; }
Ez a metódus meghívja az alkalmazás háttérrendszerét, hogy lekérje az értesítés tartalmát a megosztott beállításokban tárolt hitelesítő adatokkal.
Most kezelje a bejövő értesítést, és a fenti módszerrel kérje le a megjelenítendő tartalmat. Először engedélyezze az iOS-alkalmazás futtatását a háttérben leküldéses értesítés fogadásakor. Az XCode-ban válassza ki az alkalmazásprojektet a bal oldali panelen, majd kattintson a fő alkalmazáscélra a központi panel Célok szakaszában.
Ezután kattintson a képességek fülre a központi panel tetején, és jelölje be a Távoli értesítések jelölőnégyzetet .
A fájlban
AppDelegate.m
adja hozzá a következő metódust a leküldéses értesítések kezeléséhez:-(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); } }]; }
Vegye figyelembe, hogy a hiányzó hitelesítési fejléctulajdonságok vagy a háttérrendszer általi elutasítás eseteit célszerű kezelni. Ezeknek az eseteknek a konkrét kezelése többnyire a célfelhasználói élménytől függ. Az egyik lehetőség egy értesítés megjelenítése egy általános kéréssel, amely arra kéri a felhasználót, hogy hitelesítse magát a tényleges értesítés lekéréséhez.
Az alkalmazás futtatása
Az alkalmazás futtatásához tegye a következőket:
- Az XCode-ban futtassa az alkalmazást egy fizikai iOS-eszközön (a leküldéses értesítések nem fognak működni a szimulátorban).
- Az iOS-alkalmazás felhasználói felületén adjon meg egy felhasználónevet és jelszót. Ezek bármilyen sztring lehetnek, de azonos értéknek kell lenniük.
- Az iOS-alkalmazás felhasználói felületén kattintson a Bejelentkezés gombra. Ezután kattintson a Leküldés küldése elemre. Ekkor megjelenik a biztonságos értesítés az értesítési központban.