Enviar notificações por push com segurança dos Hubs de Notificação do Azure
Visão geral
O suporte à notificação por push no Microsoft Azure permite que você acesse uma infraestrutura de envio por push fácil de usar, multiplataforma e expansível que simplifica em muito a implementação de notificações por push para aplicativos de consumidor e empresariais para plataformas móveis.
Devido a restrições regulatórias ou de segurança, às vezes, um aplicativo pode querer incluir algo na notificação que não pode ser transmitido por meio da infraestrutura de notificação por push padrão. Este tutorial descreve como obter a mesma experiência ao enviar informações confidenciais por meio de uma conexão segura e autenticada entre o dispositivo cliente e o back-end do aplicativo.
Em um nível superior, o fluxo é o seguinte:
- O back-end do aplicativo:
- Armazena uma carga segura no banco de dados de back-end.
- Envia a ID dessa notificação ao dispositivo (nenhuma informação segura é enviada).
- O dispositivo no aplicativo, ao receber a notificação:
- O dispositivo entra em contato com o back-end solicitando a carga segura.
- O aplicativo pode mostrar a carga como uma notificação no dispositivo.
É importante observar que no fluxo anterior (e neste tutorial), pressupomos que o dispositivo armazena um token de autenticação no armazenamento local depois que o usuário faz logon. Isso garante uma experiência perfeita já que o dispositivo pode recuperar a carga de segurança da notificação usando este token. Se o seu aplicativo não armazenar tokens de autenticação no dispositivo, ou se esses tokens puderem expirar, o aplicativo do dispositivo, após receber a notificação, deve exibir uma notificação genérica solicitando que o usuário inicie o aplicativo. Dessa forma, o aplicativo autentica o usuário e mostra a carga de notificação.
Este tutorial mostra como enviar uma notificação por push de maneira segura. O tutorial se baseia no tutorial Notificação de usuários, por isso, você deve concluir as etapas nesse tutorial primeiro.
Observação
Este tutorial presume que você criou e configurou seu hub de notificações conforme descrito em Enviar notificações para os aplicativos da Plataforma Universal do Windows. Além disso, observe que o Windows Phone 8.1 requer credenciais do Windows (não Windows Phone) e tarefas em segundo plano não funcionam no Windows Phone 8.0 ou Silverlight 8.1. Para aplicativos da Windows Store, você pode receber notificações por meio de uma tarefa de segundo plano somente se o aplicativo estiver com o bloqueio de tela habilitado (clique na caixa de seleção em Appmanifest).
Projeto WebAPI
No Visual Studio, abra o projeto AppBackend que você criou no tutorial Notificar Usuários .
Em Notifications.cs, substitua toda a classe Notificações pelo código a seguir. Certifique-se de substituir os espaços reservados por sua cadeia de conexão (com acesso completo) para seu hub de notificação e pelo nome do hub. Você pode obter esses valores do Portal do Azure. Esse módulo agora representa as diferentes notificações seguras que serão enviadas. Em uma implementação completa, as notificações são armazenadas em um banco de dados; por questão de simplicidade, neste caso as armazenaremos na memória.
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); } }
Em NotificationsController.cs, substitua o código dentro da definição de classe NotificationsController pelo código a seguir. Este componente implementa um modo para o dispositivo obter a notificação com segurança, além de também fornecer um modo (para os fins deste tutorial) para disparar uma notificação por push segura para seus dispositivos. Observe que, ao enviar a notificação ao Hub de Notificação, enviamos somente uma notificação bruta com a ID da notificação (sem a mensagem em si):
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); }
Observe que agora o método Post
não envia uma notificação de sistema. Ele envia uma notificação bruta, que contém somente a ID de notificação, sem conteúdo sensível. Além disso, certifique-se de comentar a operação de envio para as plataformas para as quais você não tem credenciais configuradas em seu hub de notificação, já que elas resultarão em erros.
- Agora, reimplantaremos esse aplicativo em um Site do Azure para torná-lo acessível a partir de todos os dispositivos. Clique com o botão direito do mouse no projeto AppBackend e selecione Publicar.
- Selecione o Site do Azure como seu destino de publicação. Entre com a conta do Azure, selecione um site novo ou existente e anote a propriedade URL de destino na guia Conexão. Essa URL será referida como ponto de extremidade de back-end posteriormente neste tutorial. Clique em Publicar.
Modificar o projeto do Windows Phone
No projeto NotifyUserWindowsPhone , adicione o código a seguir em App.xaml.cs para registrar a tarefa de segundo plano de push. Adicione a seguinte linha de código ao final do método
OnLaunched()
:RegisterBackgroundTask();
Ainda no App.xaml.cs, adicione o código a abaixo imediatamente após o método
OnLaunched()
:private async void RegisterBackgroundTask() { if (!Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name == "PushBackgroundTask")) { var result = await BackgroundExecutionManager.RequestAccessAsync(); var builder = new BackgroundTaskBuilder(); builder.Name = "PushBackgroundTask"; builder.TaskEntryPoint = typeof(PushBackgroundComponent.PushBackgroundTask).FullName; builder.SetTrigger(new Windows.ApplicationModel.Background.PushNotificationTrigger()); BackgroundTaskRegistration task = builder.Register(); } }
Adicione as seguintes instruções
using
na parte superior do arquivo App.xaml.cs:using Windows.Networking.PushNotifications; using Windows.ApplicationModel.Background;
No menu Arquivo no Visual Studio, clique em Salvar Tudo.
Criar o componente de segundo plano de push
A próxima etapa é criar o componente de segundo plano de push.
No Gerenciador de Soluções, clique com o botão direito do mouse no nó do nível superior da solução (Solução SecurePush nesse caso) e clique em Adicionar e em Novo Projeto.
Expanda Aplicativos da Loja e clique em Aplicativos do Windows Phone e em componente do Windows Runtime (Windows Phone). Nomeie o projeto PushBackgroundComponent e clique em OK para criar o projeto.
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto PushBackgroundComponent (Windows Phone 8.1) e clique em Adicionar e em Classe. Nomeie a nova classe
PushBackgroundTask.cs
. Clique em Adicionar para gerar a classe.Substitua todo o conteúdo da definição do namespace
PushBackgroundComponent
pelo código a seguir, substituindo o espaço reservado{back-end endpoint}
pelo ponto de extremidade do back-end obtido ao implantar o back-end:public sealed class Notification { public int Id { get; set; } public string Payload { get; set; } public bool Read { get; set; } } public sealed class PushBackgroundTask : IBackgroundTask { private string GET_URL = "{back-end endpoint}/api/notifications/"; async void IBackgroundTask.Run(IBackgroundTaskInstance taskInstance) { // Store the content received from the notification so it can be retrieved from the UI. RawNotification raw = (RawNotification)taskInstance.TriggerDetails; var notificationId = raw.Content; // retrieve content BackgroundTaskDeferral deferral = taskInstance.GetDeferral(); var httpClient = new HttpClient(); var settings = ApplicationData.Current.LocalSettings.Values; httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", (string)settings["AuthenticationToken"]); var notificationString = await httpClient.GetStringAsync(GET_URL + notificationId); var notification = JsonConvert.DeserializeObject<Notification>(notificationString); ShowToast(notification); deferral.Complete(); } private void ShowToast(Notification notification) { ToastTemplateType toastTemplate = ToastTemplateType.ToastText01; XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate); XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text"); toastTextElements[0].AppendChild(toastXml.CreateTextNode(notification.Payload)); ToastNotification toast = new ToastNotification(toastXml); ToastNotificationManager.CreateToastNotifier().Show(toast); } }
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto PushBackgroundComponent (Windows Phone 8.1) e em Gerenciar Pacotes NuGet.
No lado esquerdo, clique em Online.
Na caixa Pesquisar, digite Http Client.
Na lista de resultados, clique em Bibliotecas de Cliente HTTP da Microsoft e em Instalar. Conclua a instalação.
De volta à caixa Pesquisar do NuGet, digite Json.net. Instale o pacote Json.NET e feche a janela do Gerenciador de Pacotes NuGet.
Adicione as seguintes instruções
using
na parte superior do arquivoPushBackgroundTask.cs
:using Windows.ApplicationModel.Background; using Windows.Networking.PushNotifications; using System.Net.Http; using Windows.Storage; using System.Net.Http.Headers; using Newtonsoft.Json; using Windows.UI.Notifications; using Windows.Data.Xml.Dom;
No Gerenciador de Soluções, no projeto NotifyUserWindowsPhone (Windows Phone 8.1) , clique com o botão direito do mouse em Referências e em Adicionar Referência... . Na caixa de diálogo Gerenciador de Referências, marque a caixa ao lado de PushBackgroundComponent e clique em OK.
No Gerenciador de Soluções, clique duas vezes em Package.appxmanifest no projeto NotifyUserWindowsPhone (Windows Phone 8.1). Em Notificações, defina Compatível com Toast como Sim.
Ainda em Package.appxmanifest, clique no menu Declarações próximo à parte superior. Na lista suspensa Declarações Disponíveis, clique em Tarefas de Segundo Plano e em Adicionar.
Em Package.appxmanifest, em Propriedades, marque Notificação por push.
Em Package.appxmanifest, em Configurações do Aplicativo, digite PushBackgroundComponent.PushBackgroundTask no campo Ponto de Entrada.
No menu Arquivo, clique em Salvar Tudo.
Executar o aplicativo
Para executar o aplicativo, faça o seguinte:
- No Visual Studio, execute o aplicativo da API Web AppBackend . Uma página da Web do ASP.NET é exibida.
- No Visual Studio, execute o aplicativo do Windows Phone NotifyUserWindowsPhone (Windows Phone 8.1) . O emulador do Windows Phone executa e carrega o aplicativo automaticamente.
- Na interface do usuário do aplicativo NotifyUserWindowsPhone , insira um nome de usuário e senha. Pode ser qualquer cadeia de caracteres, mas elas devem ter o mesmo valor.
- Na interface do usuário do aplicativo NotifyUserWindowsPhone, clique em Fazer logon e registrar-se. Em seguida, clique em Enviar push.