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ő:

  1. 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).
  2. 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

  1. A Visual Studióban nyissa meg a Felhasználók értesítése oktatóanyagban létrehozott AppBackend projektet.

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

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

  1. Győződjön AppDelegate.mmeg 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 a UIRemoteNotificationTypeNewsstandContentAvailability didFinishLaunchingWithOptions elemhez:

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeNewsstandContentAvailability];
    
  2. 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
    
  3. 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.

  4. 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.

  5. 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 .

    Képernyőkép az XCode-ról, amelyen az alkalmazásprojekt ki van választva, és meg van nyitva a Képességek lap. A Távoli értesítések jelölőnégyzet be van jelölve.

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

  1. 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).
  2. 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.
  3. 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.