Kesän jälkeen Suomessa käytiin keskustelua koronapassista ja sen tarpeellisuudesta. Paatuneen low-code tekijän korvaan särähti hankkeen aikataulu. Miten tässä voi kestää näin pitkään?

Kansallista hanketta on tietenkin epäreilua verrata yhden organisaation sisäiseen hankkeeseen. Joita Power Platform -hankkeet tyypillisesti ovat. Ja kun kyseessä on henkilöiden terveystiedot, kasvaa kulmakerroin entisestään. En siltikään malta olla kokeilematta, miten Power Platformilla voisi toteuttaa koronapassi-ratkaisun.

Katsotaan mitä tulee.

Ratkaisun idea on yksinkertainen. Jokainen voi ladata omakanta-palvelusta EU:n koronatodistuksen. Niitä on kolmenlaisia.

  • Todistus koronarokotuksesta
  • Todistus koronatestituloksesta
  • Todistus sairastetusta koronavirustaudista

Alla kuvat kahdesta ensimmäisestä.

Toteutuksessamme koronapassina toimii mikä tahansa näistä kolmesta todistuksesta. Todistusta voi pitää mukanaan paperisena, sen voi ladata dokumenttina / kuvana puhelimeen tai lisätä Apple Walletiin covidpass.eu-sivustolla.

Todistuksissa on QR-koodi, joka sisältää todistuksessa esitettävät tiedot.

Tarvitaan ainoastaan mobiilisovellus, jolla luetaan tämä QR-koodi. Sisällön perusteella kerrotaan käyttäjälle, onko henkilön todistus validi (tartunnasta tulee olla vähintään x päivää, toisesta rokotuksesta vähintään n päivää ja negatiivisesta testituloksesta max y päivää).

QR-koodin lukeminen Power Appsilla

Tämähän sujuu kuin tanssi! Power Appsissa on nykyään erinomainen viivakoodinlukija jolla voi lukea myös QR-koodeja.

Tehdään nopeasti Power Apps, joka aluksi vain näyttää luetun QR-koodin sisällön (BarcodeScanner1.Value)

Ja kokeillaan lukea oma koronatodistus sillä.

Viivakoodin lukeminen on niin nopeaa, että siitä on vaikea ottaa edes kuvaa…

Yllätykseksemme lopputulos on jotain aivan muuta kuin luettavaa JSON:ia.

Ja tämä on syy, miksi suosin aina mahdollisimman aikaista tekemisen aloittamista. Eli määrittelyjen rinnalla tehtävää toteutusideoiden kokeilua (Proof of Concept).

Olen ollut mukana myös projekteissa, joissa ensin vain määritellään viikkoja. Lopuksi aloitetaan työt ja 30 minuuttia tekemisen aloittamisen jälkeen löydetään jo jonkin sortin umpikuja. Ja määrittelyt menevät osin uusiksi.

Liikaa oletuksia, liian vähän kokeiluja.

No. Tovin googletettuamme meille selviää että QR-koodin sisältö on ensinnäkin base45-koodattu. Sen purettua löytää pakatun (zlib) tekstin. Tämä taas on koodattu CBOR:lla, joka käyttää digitaalista allekirjoitusta (COSE). Tutummin CBOR Web Token (CWT).

Mitäs nyt tehdään?

Power Appsista loppuu tässä kohtaa tehot. Muttei se tarkoita sitä, että tarvitsee luovuttaa. Seuraavat vaihtoehdot tulevat välittömästi mieleen.

Power Automate Desktop (PAD)

Base 45 -koodausta voi tehdä erilaisilla sivustoilla (esim http://www.base45-decode-encode.net/). Mitä jos jokaisesta vaiheista (zlib ja CBOR) löytyisi vastaavat? Power Appsimme käynnistäisi QR-koodin lukemisen jälkeen PAD:lla toteutetun RPA-prosessin, joka purkaisi eri online-palveluita käyttäen koodin luettavaan muotoon.

Ei. Ei. Ei. Ja vielä kerran Ei.

PAD:in käyttö tässä on aivan liian hidasta. QR-koodin skannaaja saisi todennäköisesti odotella minuutteja tuloksia. Lisäksi PAD:n käyttö edellyttäisi erillisiä lisenssejä, emmekä voi olettaa että parturit, ravintolat, teatterit, leffateatterit jne kaikki hankkisivat ylimääräisiä lisenssejä ratkaisuamme varten.

Seuraava idea.

Azure Functions

EU:n koronapassin QR-koodin purkuun löytyy valmiita koodeja toteutettuna ainakin Javascriptillä ja Pythonilla. Jos tekisikin Azure Functionsin, jota Power Apps kutsuisi. Functions purkaisi koodatun tekstin ja palauttaisi sen selkokielisenä Power Appsille.

Kuulostaa paremmalta. Tässä vaihtoehdossa Power Appsin käyttäjillä tulee olla Power Apps per user lisenssi (uusi hinta 5$/kk/käyttäjä), sillä Azure Functionsin kutsu on premium-ominaisuus.

Tai sitten Power Apps rakennetaan Dataverse for Teamsin sisään. Tällöin sovellus avataan aina Teamsin sisältä. Eikä sen käyttö edellytä loppukäyttäjältä uusia lisenssenjä. Mutta… Azure Functionsia pitää tällöin kutsua Azure API managementin kautta. Ja sellainen pitäisi pystyttää. Jokaiselle parturille, ravintolalle jne..

Kiperiä valintoja.

Koodia sisältävä oma yhdistin (Custom Connector)

Nykyään omiin yhdistimiin voi lisätä ajettavaksi omaa c#-koodia. Käytettävät kirjastot ovat kuitenkin varsin rajallisia, joten en usko että tämä vaihtoehto tulee kyseeseen.

Ja vaikka tulisikin, omien yhdistimien käyttö on premium-ominaisuus. Eli kaikilla loppukäyttäjillä tulisi olla vähintään Power Apps per App -lisenssi. Taas.

PCF (Power Apps component framework) -kontrollin toteuttaminen

Yksi mahdollinen ratkaisu on toteuttaa PCF-kontrolli (TypeScriptillä), joka hoitaa purun. Kontrollin voisi sijoittaa suoraan Power Appsiin, jolloin kaikki tehtäisiin käyttäjän päätelaitteessa. Nopeaa ja kustannustehokasta. Ei lisenssivaatimuksia.

Näiden tekeminen ei ole minulle tuttua. Eli ei mitään varmuutta onnistuuko. Skipataan.

Sovelluksen viimeistely

Yksinkertaiseksi kuvittelemamme sovellus muuttui yllättäen hankalaksi. Sivuutamme tällä kertaa koko inhottavan QR-koodin purun. Itse lähtisin ensimmäisenä seuraamaan Azure Functions polkua.

Kuvitellaan kuitenkin että onnistumme purkamaan QR-koodin sisällön. Se on JSON-muodossa (kuvaus löytyy täältä).

Oman (rokotus)todistukseni QR-koodin sisältö on tämännäköinen.

{
  "v": [
    {
      "ci": "URN:XXXXX",
      "co": "FI",
      "dn": 2,
      "dt": "2021-08-15",
      "is": "KELA/FPA",
      "ma": "ORG-100030215",
      "mp": "EU/1/20/1528",
      "sd": 2,
      "tg": "840539006",
      "vp": "1119349007"
    }
  ],
  "dob": "19XX-XX-XX",
  "nam": {
    "fn": "Pertilä",
    "gn": "Timo",
    "fnt": "PERTILAE",
    "gnt": "TIMO"
  },
  "ver": "1.3.0"
}

Power Apps ei itsessään osaa lukea sisäänsä JSON-muotoista sisältöä. Voimmekin

  • Palauttaa JSON-muotoisen vastauksen skeemoineen Power Appsille flow’n http response -toiminnolla. Joka on jälleen premiumia -> lisenssejä
  • Palauttaa jokainen JSON-viestin kenttä omana arvonaan Power Appsille. Tämä onnistu, sillä kukin tieto esiintyy vastauksessa ainoastaan kerran

Paluuarvojen perusteella Power Apps kertoo, onko luettu koronatodistus kelvollinen (rokotuksista kulunut tarpeeksi aikaa, testi riittävän tuore jne). Näytöllä voitaisiin esittää myös muuta tarpeellista tietoa, joka auttaa varmistamaan siitä että todistus kuulu esittäjälleen.

Yhteenveto

Tällä kertaa kaikki ei mennytkään aivan putkeen. Mutta ei se aina mene oikeassakaan elämässä. Tärkeintä on tunnistaa ongelmat (sekä tekniset että itse prosessiin liittyvät) mahdollisimman nopeasti. Usein niihin löytyy ratkaisu. Mitä aikaisemmin ongelmat tunnistaa, sitä enemmän jää aikaa niiden ratkaisemiseen.

Eri ratkaisuvaihtoehtoja punnitessamme huomasimme tarjolla olevan hyvin erilaisia lähestymisiä. Kullakin oli omat heikkoutensa ja vahvuutensa. Valinnat voivat johtaa perustavanlatuisiin muutoksiin itse ratkaisussa. Siirrytään esimerkiksi käyttämään Dataverse for Teamsia.

Esimerkissämme oli lisäksi muuttujana loppukäyttäjien lisenssit. Tavoittelimme Microsoft 365 -lisensseillä toimivaa ratkaisua. Tällöin kokonaisuudesta tulee nopeasti hyvin vaikeasti hahmotettava soppa. Yksittäinen valinta voi johtaa siihen, että kaikilta käyttäjiltä edellytetään Power Apps per App -lisenssiä. Tai vielä pahempaa tilanteeseen, jossa lisenssejä ei teknisesti tarvita, vaikka lisenssiehtojen mukaan ne tulee silti hankkia (ns. multiplexing).

Ja kyllä. EU:n koronatodistuksien lukemiseen löytyy jo kaikkien ilmaiseksi käyttöön ratkaisu: https://app.digitalcovidcertchecker.gov.ie/

Aina kaikkea ei tarvitse tehdä Power Platformilla. Eikä itse.