Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Push notifikácie #6

Open
celuchmarek opened this issue Jun 13, 2024 · 2 comments
Open

Push notifikácie #6

celuchmarek opened this issue Jun 13, 2024 · 2 comments
Assignees
Labels
enhancement New feature or request

Comments

@celuchmarek
Copy link
Member

celuchmarek commented Jun 13, 2024

Chceme pridať podpisovanie cez push notifikácie. Treba na to 3 veci:

Device (inštalácia aplikácie) sa zaregistruje na serveri

Aplikácia sa iba raz za svoj život zaregistruje na serveri - buď pri prvom spustení alebo pri prvom párovaní (čiže v ten istý moment ako sme vymysleli, že user povolí push notifikácie).

  1. Device si vygeneruje ES256 kľúč a ten si bude pamätať po celý život.
  2. Device zistí svoje registrationId - id pre notifikácie na danej platforme.
  3. Device zavolá na server POST /devices s body napr:
{
  "platform": "android" / "ios",
  "registrationId": "idk32b83ef7-21fe-4120-b8fa-d9f6aba05731",
  "displayName": "John's phone (alebo si vymslí hocičo, zatiaľ to nie je podstatné)",
  "publicKey": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1iPVm0v/ZNM04587g10F54JVIrMZqWnlOXuGjOvcYsuweTYxuXafP8aJ6kIXe+jQhjeldm2mQZzSZ4ceLRq0yA==\n-----END PUBLIC KEY-----"
}
  1. Server vráti v odpovedi guid, ktoré si Device zapamätá do konca života.
  2. Device je úspešne zaregistrovaný.

Device sa spáruje s integráciou

Pri podpisovaní cez extension user naskenuje QR kód / otvorí link. V ňom sa nachádza integration a pushKey.

  1. Device dostal okrem guid a key k dokumentu aj integration a pushKey. Tie 2 si odloží.
  2. Device pripraví header: Authorization: Bearer <api-token>, pričom api-token je JWT token popdísaný ES256 kľúčom, ktorý si vygeneroval pred registráciou, s obsahom:
{
  "sub": <device-guid z registrácie>,
  "exp": <timestamp now + 5 min>,
  "jti": <random UUID 4>
}
  1. Device pošle na server POST /device-integrations s body: { integrationPairingToken : <integration> }.
  2. Server vráti 204 OK.
  3. Device je spárovaný s integráciou.

Device počúva na notifikácie

Ak spárovaná integrácia inicijuje podpisovanie, zároveň so zobrazením QR kódu sa pošlú PUSH notifikácie na spárované zariadenia. Device teda počúva na notifikácie (cez Google / APNS).

  1. Device dostane notifikáciu s payloadom:
{
  "encryptedMessage": "..."
}

V encryptedMessage bude raz zašifrovaný string. Nateraz je tam v stringu rovno uložený takýto JSON:

{
  "documentGuid": "bfde97b4-ee27-47bc-97e2-5164ed96a92a",
  "key": "EeESAfZQh9OTf5qZhHZtgaDJpYtxZD6TIOQJzRgRFgQ="
}
  1. Device podľa týchto parametrov podpisuje dokument rovnako ako keby otvoril link.
@celuchmarek
Copy link
Member Author

celuchmarek commented Jun 13, 2024

@Matej-Hlatky Neskôr budeme chcieť, aby ten payload prišiel ako:

{
  "encryptedMessage": "ZhHZtgaDJpYtxZD6TIOQJzRgRFgQ..."
}

A až keď toto dešifruješ pomocou pushKey, dostaneš ten pôvodný payload. (Na serveri to teraz zapnem bez šifrovania, ale nezdá sa mi to potom v appke byť veľmi zložité rozšifrovať)

Tie JWT tokeny sú potom úpne bežná vec, takže na to určite nájdeš enejakú libku a do funkcie pošleš typ kľúč: ES256, sub: tvoje guid, jti: random uuid, exp: now + 5 min a kľúč na podpísanie: tvoj ES256 kľúč.

@Matej-Hlatky
Copy link
Contributor

FYI, API upravy a generovanie keypair su rozpracovane v https://github.com/slovensko-digital/avm-client-dart/tree/feature/AVM-26_device_pairing_update
Najskor je nutne dokoncit upravy tam.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
Status: Todo
Development

No branches or pull requests

2 participants