Sessiohallinta ja kirjautumismekanismit - espoon-voltti/evaka GitHub Wiki
Sessiohallinta
eVaka käyttää perinteisiä tilallisia sessioita api-gatewayssa, jossa session sisältö tallennetaan Redis-tietokantaan ja session ID tallennetaan selainkeksiin (secure+httpOnly). Sessioilla on oletuksena lyhyt pituus (32 min), mutta API-kutsut järjestelmään nollaavat pituuslaskurin ja aktiivisesti järjestelmää käyttävä käyttäjä ei lennä ulos. Sessioiden vanhentuminen on toteutettu kahdella päällekkäisellä mekanismilla: keksin Expires/Max-Age -arvolla, ja Rediksen sessiotiedon EX-arvolla.
Työntekijöiden mobiililaitteiden puolella tavallisen session lisäksi on ns. long term token -tunniste, jota käytetään automaattisesti session luontiin jos sellaista ei tällä hetkellä ole. Tämä tunniste tallentuu eVakan tietokantaan laitteen parituksen yhteydessä, ja sen avulla laitetta ei tarvitse parittaa uudelleen niin kauan kuin laitteen oma selain säilyttää keksin johon se on tallennettu. Jos eVakaa ei käytetä laitteella pitkään aikaan, käyttöjärjestelmästä riippuen keksi saattaa tyhjentyä ja silloin uusi paritus täytyy tehdä.
eVakassa on myös muutama järjestelmäintegraatioon tarkoitettu REST-endpoint, joissa käytetään tavallista HTTP Basic-tunnistautumista. Nämä on rajattu omaan lokeroonsa API-polkujen avulla, eikä Basic-tunnistautumisen kautta voi kutsua muita kuin tiettyjä integraatioendpointteja tai tavallisen tunnistautumisen kautta kutsua niitä. Integraatioendpointit ovat tilattomia, eikä niitä varten ole erillistä sessiohallintaa.
eVaka käyttää mm. näitä avoimen lähdekoodin kirjastoja sessiohallintaan:
express-session
: yleinen sessiomekanismiconnect-redis
: Redis-tallennusmekanismi sessioille
Alla olevassa taulukossa on listattu eri käyttäjätyypit ja niiden sessiokeksit. Tällä hetkellä kunnan mobiililaitteet käyttävät samaa sessiokeksiä kuin työntekijät, joten yhdessä selaimessa ei voi olla samaan aikaan näissä kahdessa käyttöliittymässä kirjautuneena.
Käyttäjätyyppi | Julkinen polku, jossa sovellus on | Sessiokeksi | Julkinen polku, jossa API:t ovat |
---|---|---|---|
Kuntalaiset | / |
evaka.eugw.session |
/api/application/ |
Työntekijät | /employee/ |
evaka.employee.session |
/api/internal/ |
Kunnan mobiililaitteet | /employee/mobile/ |
evaka.employee.session |
/api/internal/ |
Kirjautumismekanismit
eVaka käyttää vahvan tunnistautumisen kirjautumiseen ydinjärjestelmän ulkopuolisia palveluita SAML-integraatioiden kautta. Kuntalaisen kevytkirjautuminen on toteutettu eVakaan sisäisesti. Koko eVaka voidaan jakaa kahteen osaan ja osissa on seuraavat kirjautumistavat:
Kuntalaisen puoli (koodin puolella ns. "citizen", "enduser", tai "customer"):
- Suomi.fi SAML
- Käyttäjätunnus/salasana -kevytkirjautuminen
Työntekijöiden puoli (koodin puolella ns. "internal" tai "employee"):
- AD SAML
- Suomi.fi SAML
Näiden lisäksi internal-puolella on mobiililaitteille oma paritusmekanismi, jolla perustetaan pitkäkestoinen token laitteen automaattikirjautumiselle. Mobiililaitteet ovat API-poluissa omassa lokerossaan, eikä niillä ole pääsyä tavallisten käyttäjien endpointteihin tai toisinpäin.
eVaka käyttää mm. näitä avoimen lähdekoodin kirjastoja SAML-kirjautumiseen:
node-saml
: SAML-viestien luku ja kirjoituszod
: SAML-kirjautumisviestien käyttäjätietojen tarkempi luku ja validaatio.node-saml
lukee käyttäjä-"profiilin" kentät XML:stä tavalliseen JS-objektiin, joka sitten syötetään tälle kirjastolle
Jokaiselle SAML-integraatiolle luodaan oma node-saml
konfiguraatio-objekti, joka sisältää enimmäkseen kaikille integraatioille yhteisiä kenttiä, mutta myös integraatiokohtaisia kenttiä (esim. IDP:n osoite, sertifikaatit, joskus tarkempia SAML-protokollan konfiguraatioita) joista iso osa luetaan ympäristömuuttujista.
Kuntalaisten Suomi.fi SAML
eVaka tukee vahvaa Suomi.fi-kirjautumista kuntalaisen puolella, ja tunnistaa käyttäjät henkilötunnuksen perusteella. Kirjautuminen ilman henkilötunnusta ei ole mahdollista, eikä eVaka tue Suomi.fi:n tunnistautumistapoja joissa henkilötunnusta ei palauteta sovellukselle.
Suomi.fi-käyttäjä syntyy eVakan tietokantaan ensimmäisen kirjautumisen yhteydessä, jos järjestelmän tekemä VTJ-haku löytää henkilötiedot Suomi.fi:n palauttamalla henkilötunnuksella. Jos henkilötietoja ei löydy tai haun aikana tapahtuu virhe, kirjautuminen keskeytyy eikä uutta käyttäjää synny.
Kuntalaisen käyttäjätunnus/salasana -kevytkirjautuminen
Kuntalaiset voivat kirjautua pelkällä käyttäjätunnuksella ja salasanalla. Tällä tavalla kirjautuneet käyttäjäsessiot merkitään kevytkirjautuneiksi (CitizenAuthLevel.WEAK
), ja pääsevät käsiksi vain osaan järjestelmän toimintoja.
Työntekijöiden AD SAML
eVaka tukee AD:n kautta tapahtuvaa kirjautumista työntekijöiden puolella, ja tunnistaa käyttäjät joko AD:n sisäisen pysyvän tunnisteen tai henkilönumeron perusteella. eVaka ei itse tarkista tai vaadi mitään tiettyjä AD-rooleja vaan hyväksyy minkä tahansa käyttäjän joka pääsee AD SAML -kirjautumisesta läpi. Jos kaikkia mahdollisia AD-käyttäjiä ei haluta päästää sisään järjestelmään, AD:ssa tulee olla oma roolitarkistus jolla rajataan pääsyä sovellukseen.
AD-käyttäjiä ei tavallisesti provisioida etukäteen, vaan käyttäjä syntyy eVakan tietokantaan ilman rooleja ensimmäisen kirjautumisen yhteydessä, ja pääkäyttäjä tai esimies voi sen jälkeen luvittaa sopivat roolit sovelluksen omasta käyttöliittymästä.
Työntekijöiden Suomi.fi SAML
Työntekijä voi kirjautua vahvasti eVakaan Suomi.fi:n kautta esim. pankkitunnuksilla tai mobiilivarmenteella, jos hänelle on asetettu henkilötunnus järjestelmässä. Kuka tahansa voi käynnistää Suomi.fi-kirjautumisen painamalla nappia eVakan työntekijäpuolen kirjautumissivulla, mutta kirjautuminen onnistuu vain jos järjestelmästä löytyy aktiivinen työntekijäkäyttäjä jolla on sama henkilötunnus. Tämä toiminnallisuus on tarkoitettu pääsääntöisesti palveluntuottajille, joilla ei ole AD-tunnuksia.
Teknisesti käytetään samaa Suomi.fi SAML-integraatiota kuin kuntalaisille, mutta kirjautumisessa välitetään RelayState
-parametri, jonka perusteella päätellään tehdäänkö kirjautuminen kuntalaisten vai työntekijöiden puolelle. RelayState
on eVakassa polku johon käyttäjä on tarkoitus ohjata kirjautumisen jälkeen, ja /employee
-prefix ohjaa aina työntekijöiden puolelle ja perustaa työntekijäpuolen session jos kirjautuminen onnistuu.
SAML-endpointit eVakan api-gatewayssa
eVakan api-gateway sisältää muutaman standardimuotoisen SAML-endpointin jotka löytyvät jokaiselle SAML-integraatiolle, mutta endpointtien polkujen alkuosa on jokaiselle eri. Endpointtien toteutus on 90% yhteistä koodia, mutta käyttäjätietojen lukeminen SAML-kirjautumisviestistä on erilainen eri toteutuksissa (esim. Suomi.fi SAMLissa luetaan henkilötunnus, AD-SAMLissa luetaan henkilönumero, jne...).
/prefix/login
GET:
- node-saml luo SAML-viestin (
AuthnRequest
) ja käyttäjän selain ohjataan IDP:n puolelle. eVakan redikseen tallentuu tieto käynnistetystä SAML-pyynnöstä, jota käytetään myöhemmin paluuendpointissa ns. InResponseTo-validaatioon
/prefix/login/callback
POST (ns. SAML "POST binding"):
- node-saml lukee SAML-viestin (
AuthnResponse
), validoi sen, ja palauttaa SAML "profilen", joka pitää sisällään SAML-viestin assertiosta luetut käyttäjätiedot - yksittäisen kirjautumistavan authenticate-funktio lukee SAML profilesta halutut kentät, sekä validoi ja/tai luo käyttäjän kutsumalla evaka-serviceä
- käyttäjän selain ohjataan sovellukseen joko virhesivulle tai alunperin pyydetylle sivulle, riippuen kirjautumisen onnistumisesta
/prefix/logout
GET:
- node-saml luo SAML-viestin (
LogoutRequest
) ja käyttäjän selain ohjataan IDP:n puolelle. eVakan redikseen tallentuu tieto käynnistetystä SAML-pyynnöstä, jota käytetään myöhemmin paluuendpointissa ns. InResponseTo-validaatioon
/prefix/logout/callback
GET/POST (ns. SAML "redirect binding" ja "POST binding"):
- node-saml lukee SAML-viestin (
LogoutResponse
taiLogoutRequest
), validoi sen, ja palauttaa IDP-lähtöisessä uloskirjautumisessa (LogoutRequest
) SAML "profilen", joka pitää sisällään SAML-viestistä luetut SAML-session tunnistetiedot - Jos kyse oli IDP-lähtöisestä uloskirjautumisesta (
LogoutRequest
), session tunnistetietojen perusteella poistetaan rediksestä käyttäjän sessio, ja käyttäjän selain ohjataan takaisin IDP:n puolelle. Jos kyse oli SP-lähtöisestä uloskirjautumisesta (LogoutResponse
), käyttäjäsessio poistetaan, ja käyttäjän selain ohjataan takaisin sovelluksen alkusivulle
Kehityskäyttöön tarkoitetut "mock"-kirjautumismekanismit
Paikallisessa kehitysympäristössä ja automaattitesteissä on käytössä "mock"-kirjautumismekanismit oikeiden Suomi.fi- ja AD-kirjautumismekanismien sijaan. Mock-toteutukset eivät toimi SAML-tekniikalla, vaan toteutus on yksinkertaisin mahdollinen toteutus jossa voi valita käyttäjän, ja josta syntyy oikeankaltainen käyttäjäsessio.
Suomi.fi mock listaa valittavaksi kehitysympäristön mock VTJ:ssä olevat kuntalaiset. Jos valitaan käyttäjä joka löytyy mock VTJ:stä mutta ei tietokannasta, tilanne vastaa uuden Suomi.fi-käyttäjän ensimmäistä kirjautumista. Jos valitaan jo tietokannassa oleva käyttäjä, tilanne vastaa jo tunnetun käyttäjän kirjautumista.
AD mock listaa valittavaksi tietokannasta löytyvät työntekijät ja mahdollistaa myös täysin uuden käyttäjän luonnin, jolla voidaan simuloida uuden AD-käyttäjän ensimmäistä kirjautumista. Jos valitaan jo tietokannassa oleva käyttäjä, tilanne vastaa jo tunnetun käyttäjän kirjautumista.