6.2 Desenvolvimento do Parse Dashboard
6.2.3 Envio de notificações
Para o envio de notificações, à semelhança das funcionalidades apresentadas anteriormente, foi necessário alterar o ficheiro DashboardView.react.js, como demonstra a Figura 25, de maneira a que fosse possível ter acesso à opção Push a partir da Dashboard. Com esta opção disponível, torna-se possível ter acesso a três subopções: o envio de notificações, a visualização das notificações enviadas e a gestão de audiências.
Figura 25 – Funcionalidade push no ficheiro DashboardView
Por omissão, o adapter utilizado para o envio de notificações é o ParsePushAdapter do módulo parse-server-push-adapter que, como foi referido anteriormente, abstrai a forma como as notificações são enviadas e pode ser facilmente conectado a qualquer serviço que exponha uma API para o envio de notificações. Este adapter utiliza o Apple Push Notifications Service para o envio de notificações para iOS e o Google Cloud Messaging para o envio de notificações para Android, no entanto, como o GCM foi descontinuado pela Google em Abril de 2018, as aplicações que utilizavam GCM tiverem de migrar para o Firebase Cloud Messaging, que herda a infraestrutura do GCM e lhe acrescenta novas funcionalidades [63].
A comunidade responsável pelo projeto open-source do Parse teve em conta a descontinuação do GCM e os pedidos de vários utilizadores para o desenvolvimento de um
adapter para o FCM e decidiu acrescentar suporte para o FCM no Parse Server e no SDK do
Parse para Android, passando este último a conter ambas as configurações dos serviços GCM e FCM [64]. Esta mudança implica que a configuração do lado do Parse Server passe a incluir uma chave FCM que corresponda ao sender id e API key para Android já existentes, o que irá garantir compatibilidade total com o FCM.
49
Para além disso, foi criado o ficheiro CustomPushSettings.react.js, baseado no ficheiro PushSettings.react.js e que abrange toda a estrutura necessária para que seja possível visualizar as credenciais relacionadas com o envio de notificações, definidas nos ficheiros de configuração. Como tal, na página definida por este ficheiro, são apresentados os parâmetros sender id, API key e um Toggle que indica se o envio de notificações do lado do cliente é permitido.
O envio de notificações do lado do cliente era uma funcionalidade que estava presente no Parse, no entanto deixou de fazer parte do projeto quando este se tornou open source, sobretudo por ser considerada uma funcionalidade pouco segura [65][66]. Para introduzir esta funcionalidade novamente na solução foi necessário, em primeiro lugar, defini-la no ficheiro de configuração do Parse Server. Consequentemente, o objeto push definido no ficheiro de configuração passou a conter o boolean enableClientPush, ilustrado na Figura 26, que indica se o envio de notificações do lado do cliente se encontra ativado.
Figura 26 – Parâmetro enableClientPush no ficheiro de configuração
Esta funcionalidade é considerada insegura dado que, para enviar notificações do lado do cliente, não é utilizada a master key da aplicação, mas sim a cliente key, uma chave pública. Tendo isso em conta, esta funcionalidade não iria funcionar sem que fossem alteradas determinadas verificações e validações aplicadas. Dado que não vai ser utilizada a
master key e que são sempre feitas verificações de autorização para o envio de notificações
– é sempre verificado que está a ser utilizada uma master key para a realização dessa tarefa – foi criado o prototype canPush no contexto do objeto Auth, que devolve true caso esteja a ser utilizada uma master key ou caso o envio de notificações do lado do cliente se encontre ativado.
Tendo em conta que o envio de notificações é efetuado para cada registo da tabela
Installations, é necessário ter acesso à informação desta tabela para poder proceder ao envio
das notificações. O acesso à tabela Installations encontrava-se restrito, visto que podia apenas ser acedido com a utilização de uma master key, no entanto, com a criação do método
canPush, tornou-se possível garantir o acesso a esta tabela, exclusivamente para consultas,
caso a opção do envio de notificações do lado do cliente se encontre ativada. Como pode ser observado pela Figura 27, o acesso à tabela Installations apenas é negado caso não esteja a ser utilizada uma master key para o método delete ou caso não esteja a ser utilizada uma
master key para o método find com a opção do envio de notificações do lado do cliente
50 Figura 27 – Acesso à tabela Installations no ficheiro rest.js
Para além do acesso à informação da tabela Installations, é também necessário ter em consideração o acesso ao serviço /push, que também se encontra condicionado pela utilização de uma master key. Tendo em conta que para as aplicações cliente é utilizada a client key e não a master key, para ter acesso a este serviço do lado do cliente foi alterada a função
promiseEnforceMasterKey, que verifica a autenticação com master key, para que fosse
possível autenticar com client key no caso de se tratar de um pedido de envio de notificações vindo do lado do cliente (Figura 28).
Figura 28 – Diagrama de sequência para o envio de notificações a partir da Dashboard
Administrador
Push New
<<UI>>
Escolher o tipo de mensagem
PushRouter middlewares
Selecionar o botão Send Push Pedido para o envio da notificação Preencher o texto da mensagem
Envio da notificação
PushController
enforceMasterKeyAccess()
Se for utilizada uma master key ou client key a notificação é enviada
Verificação de autorização
Se não for utilizada uma master key ou client key há um erro de autorização
51