Notyfikacje typu Push – z czym to się je i jak je skonfigurować w Django?

Notyfikacje typu Push – z czym to się je i jak je skonfigurować w Django?

Notyfikacje push (ang. push notifications) – to powiadomienia, które otrzymujemy zaraz po tym jak ktoś, np. wyśle nam wiadomość przez komunikator, taki jak: Messenger, slack czy bitrix. Są one obsługiwane przez różne systemy operacyjne (tak, aktualne komputery z Windows 10 też obsługują taką technologię) oraz przez różne aplikacje, takie jak: przeglądarka, gra napisana w Unity czy aplikacja mobilna).

Ale jak to się dzieje, że nie musimy się martwić tym, czy mamy włączony komunikator? Opowiada za to tzw. Service Worker – usługa działająca w tle, która może także zostać wykorzystana do np. synchronizacji danych w tle. Oczywiście w tym przypadku rodzi się pytanie – co z bezpieczeństwem takiego rozwiązania? Przecież ktoś mógłby wykorzystać nasz sprzęt kiedy z niego nie korzystamy do niecnych celów!

Uspokajamy – zabezpieczenia tej technologii nie pozwalają niepowołanym osobom na dostęp do uprawnień i funkcji pozwalających na przejęcie kontroli nad naszym urządzeniem.
 

Bardziej technicznie – czyli Google Firebase

Technologia Google Firebase daje dostęp do wielu rozwiązań np. autentykacji, obsługi plików w chmurze, konfiguracji bez potrzeby deploymentu i wiele, wiele więcej w tym także do tego co nas interesuje, czyli obsługi wiadomości w aplikacji.

Od strony programistycznej sposób wygląda tak – wysyłamy z serwera zapytanie do serwerów Google, gdzie stoi Firebase, a gdy telefon jest dostępny w sieci, Firebase wysyła do niego wiadomość. Likwiduje to problem braku łączności z Internetem – po prostu wiadomości (zapytania) grupują się w chmurze Google, która nie wymaga od nas pisania dodatkowego kodu.

Postawienie usługi na serwerze Google

https://firebase.google.com/docs/cloud-messaging/js/client

Musimy przejść do konsoli Firebase i utworzyć projekt, z niego uzyskać klucz serwera, nazwę aplikacji oraz identyfikator nadawcy – jest to potrzebne do autentykacji z serwerem.

Tworzenie aplikacji w chmurze Google

https://console.developers.google.com/apis/dashboard

To co zrobiliśmy przed chwilą służy nam tylko do odbierania wiadomości ze strony klienta. Jeżeli chcemy wysyłać wiadomości, musimy wejsć do chmury google, utworzyć odpowiedni interfejs i odblokować API Firebase Messaging wraz z odpowiednim uprawnieniem (inaczej dostaniemy błąd niedostatecznych uprawnień). Przyznam się szczerze że nie zagłębiałem się w każdy typ uprawnień osobno i po prostu przydzieliłem konto właściciela.

Będziemy stąd potrzebowali plik json z danymi logowania takimi jak klucz prywatny, poprzez analogiczną zakładkę.

Problem implementacji Firebase w Django – co z plikiem firebase-messaging-sw.js?


path('firebase-messaging-sw.js', ServiceWorkerView.as_view(), name='service_worker'),

Firebase domyślnie ładuje plik firebase-messaging-sw.js z katalogu głównego. Wystarczy iż zdefiniujemy widok, który będzie zwracał ten plik pod urlem właśnie takim, jak nazwa pliku.

class ServiceWorkerView(TemplateView):
    def get(self, request, *args, **kwargs):
        service_url = os.path.join(BASE_DIR, 'templates/firebase-messaging-sw.js')
        return render(request, service_url, content_type="application/x-javascript")

Co dalej?

Gdy mamy wszystkie dane, potrzebujemy zakodzić naszą „usługę” która będzie wysyłała wiadomość do tokena naszego urządzenia, gdy zostanie wykryta zmiana np. dodany nowy artykuł na stronę – ja dla samych testów napisałem komendę która robi dokładnie to, tylko bez szczególnego wyzwalacza:

def send_to_token():
    message = messaging.Message(
        data={
            'score': '850',
            'time': '2:45',
        },
        token='f1TbiTptFfk:APA91bGEyE-aIXaX2A-aOXmgT8syfJJFTVHE0ZuZAzE9xsJYXVltNcKrHIPKkijODGrKXVlueEuIqTHwD1uSKU6kFc0hY-pKxAb_LFgk9_fUT6DhIeUrUhE4ONQ6qOmWMLIeEMgNApsa'
    )

    response = messaging.send(message)
    print('Successfully sent message:', response)


class Command(BaseCommand):
    help = 'Send example message to FireBase app'

    def add_arguments(self, parser):
        pass

    def handle(self, *args, **options):
        send_to_token()

Wcześniej musimy zainicjować naszą aplikację za pomocu odpowiedniego kodu:

import firebase_admin
from django.core.management.base import BaseCommand
from firebase_admin import credentials, messaging

from project.settings import BASE_DIR

creds = credentials.Certificate(os.path.join(BASE_DIR, 'webtechnika.json'))
default_app = firebase_admin.initialize_app(creds)

Teraz, będziemy musieli zaprogramować handler wiadomości w JavaScripcie lub naszej aplikacji – i to zadanie, zostawiam tobie czytelniku :) Mamy masę możliwości – musimy zaprogramować odbieranie tokena i przekazywanie np. poprzez Ajaxa do serwera, napisać odpowiedniego service workera który będzie odbierał nam wiadomości w tle i to by było wszystko. Całość odpowiednio opisane pod różne technologie znajdziemy tutaj:

https://firebase.google.com/docs/cloud-messaging/

Wszystko powinno nie zająć więcej niż 200 linii kodu i nie jest to nic skomplikowanego. Jeżeli chcemy pisać to w javascripcie trzeba pamiętać by odwoływać się do klasy firebase i firebase.messaging, wcześniej zainicjować aplikację i napisać odpowiedni handler eventów.

To wszystko jeżeli chodzi o Push Notyfikacje. Oczywiście Firebase pozwala na znacznie więcej, ale o tym będą kolejne artykuły na naszej stronie :) Mam nadzieję że ułatwiłem zrozumienie tej techologii oraz sposób jej wykorzystania.