Fiks IO er en kanal for sikker maskin-til-maskin integrasjon. Denne kanalen kan benyttes for å bygge prosesser på tvers av systemer og organisasjoner, for eksempel når et fagsystem skal arkivere et dokument i et arkivsystem eller spørre om informasjon som er lagret i et annet system.
Fiks IO bruker RabbitMQ som kø-system og forenkler meldingsutvekslingen via køene i RabbitMQ. Les gjerne mer om RabbitMQ og kø-systemer.
Meldingstyper defineres i Fiks Protokoll
Grensesnitt | Støtte |
---|---|
Web portal | Nei |
Maskin til maskin | Ja |
Fiks IO tilbyr:
Merk at Fiks IO har ikke leveringsgaranti. Det betyr ikke at meldingene kan bli borte i Fiks IO køene, men vi kan ikke garantere 100% at meldingen går vellykket fra avsender til mottaker da noe f.eks. kan gå galt i håndtering av meldingene. For eksempel kan en melding bli markert som lest (ack) av en mottaker før den har blitt håndtert helt ferdig og dermed kan ikke meldingen hentes på nytt. Derfor må mottaker- og avsendersystem lages slik at de håndterer at en melding kan forsvinne underveis.
Når man oppretter en Fiks Protokoll konto vil det blir opprettet en Fiks IO konto, samt at man kan administrere meldingstyper som skal benyttes. Vi anbefaler å bruke Fiks Protokoll oppsettet for å få opprettet Fiks IO konto da en Fiks Protokoll konto vil ikke kunne kommunisere med en Fiks IO konto som ikke er opprettet via Fiks Protokoll. Fiks Protokoll konto er en utvidelse av Fiks IO konto, og dermed får man det man trenger for å f.eks. sette opp en Fiks IO klient.
Fiks IO baserer seg på at organisasjoner benytter Fiks Konfigurasjon for å opprette en eller flere kontoer. Andre organisasjoner kan så sende meldinger til disse kontoene, som mottaker kan lese ved å koble seg til io.fiks.ks.no.
For å gjøre det lettere å finne en konto, og vite hvilke meldingstyper systemet som benytter kontoen kan håndtere kan man konfigurere adresser. Adresser består av en eller flere organisasjonsnummer, meldingsprotokoller og sikkerhetsnivåer. Avsendere kan så slå opp i Fiks IOs katalogtjeneste for å finne f.eks. hvilken konto som skal motta digisos meldinger med sikkerhetsnivå fire for Bergen kommune.
Funksjonalitet for å sende og lese meldinger vil typisk bli tilbudt av fagsystemleverandører eller offentlig virksomheter, som når Fiks Digisos formidler sosialsøknader fra Nav til kommunens sosialsystem, men kommuner og andre organisasjoner må fortsatt ha et forhold til hvilke kontoer de har, hvilke meldingstyper disse håndterer, og ikke minst hvem som har tilgang til å lese inkommende meldinger.
I eksempelet over ser man en konto opprettet for å formidle Digisos meldinger til en kommunes fagsystem for behandlig av sosialsøknader. Det er opprettet en adresse på kontoen, “Digisos”, man har konfigurert støtte for meldingsprotokollen “no.nav.digisos.fagsystem.v1”, og sagt at dette systemet kan håndtere meldinger for både sikkerhetsnivå tre og fire.
Man må ha et virksomhetssertifikat fra Commfides eller Buypass for å identifisere seg med maskinporten, et for test og et for produksjon. Se avsnitt om sikkerhet lenger nede. Det er viktig at virksomhetssertifikatet er registrert med samme organisasjonsnummer som man registrerer hos maskinporten og hos KS gjennom Fiks protokoller/Fiks IO oppsettet.
Fiks IO bruker maskinporten til autentisering. Da må man ha laget en klient hos maskinporten. Se her for hvordan det gjøres. Det er viktig at det gjøres med samme organisasjonsnummer som man har i virksomhetssertifikatet og i Fiks protokoller/Fiks IO oppsettet hos KS.
Stort sett vil man bruke Fiks Protokoll da man skal kommunisere over Fiks IO med en av protokollene. Se guiden for oppsett av Fiks Protokoll for hvordan dette gjøres.
Vi anbefaler å bruke enten java eller .NET klienten som KS tilbyr hvis man er på java eller .NET. Se github prosjektet for java eller .NET for hvordan man bruker klienten.
Fiks IO er en selvstendig kanal, og er ikke bygget for å være en erstatning for SvarUt/SvarInn, som begge vil bli videreført i sin nåværende form. Bruksområdene til tjenestene kan overlappe, og dette gjør at det noen ganger kan være tvil om SvarUt/SvarInn eller Fiks IO er riktig verktøy for et problem.
Hovedsakelig bør man benytte svarut/svarinn for “post”: meldinger hvor payload er menneske-lesbar (f.eks. en pdf), hvor automatisk håndtering begrenses til f.eks. opprettelse av sak i et arkivsystem, og hvor sending til Altinn eller som brevpost er gode alternativer hvis den automatiske håndteringen feiler. Andre faktorer kan være:
Benytt Fiks IO, denne leverer utelukkende til spesifisert mottakerkonto og benytter ingen alternative kanaler, som for eksempel printet post.
Benytt Fiks IO, SvarUt/SvarInn meldinger kan bare krypteres med Fiks-plattformens nøkkel, ikke mottakers. Se “Sikkerhet” for deltajer om hvordan man oppnår trygg ende-til-ende kryptering gjennom Fiks IO
Benytt Fiks IO for å få leveranse på sekunder, ved bruk av SvarUt/SvarInn kan levering ta lang tid, siden SvarUt prøver flere kanaler etter tur og defaulter til print ved leveranseproblemer.
Benytt SvarUt, ved Fiks IO forsendelser risikerer man at meldingen ikke blir håndtert eller avvist av mottaker. Man vil få melding om dette, men man må håndtere evt. retry eller sending via alternative kanaler selv.
Økonomiske aspekter kan også spille inn her, Fiks IO meldinger koster vesentlig mindre pr. stykk enn SvarUt forsendelser.
En Fiks organisasjon oppretter en Fiks IO konto. Andre kontoer kan nå sende til denne kontoen gjennom Fiks IOs REST api ved å spesifisere kontoens KontoId som mottaker. Organisasjonen får meldingene ved å etablere en AMQP kobling til io.fiks.ks.no.
Fiks IO tar i utgangspunktet ikke stilling til hva payloaden i meldingen består i. Metadataformat, filformat, kryptering og lignende er opp til brukeren, men Fiks plattformen tilbyr tjenester og verktøy for å etablere format for integrasjoner:
Autentisering av klienter mot REST service for sending av meldinger og AMQP service for leveranse av meldinger skjer gjennom virksomhetssertifikat-basert maskinporten autentisering.
I utgangspunktet legger ikke Fiks IO føringer på hvordan (eller om) en melding sendt over plattformen sikres, men alle klienter som utvikles av KS, og alle protokoller som Fiks spesifiserer, vil benytte signerte og krypterte meldinger gjennom ASIC-E containere. Denne standarden benyttes også av DIFI i forbindelse med integrasjonspunktet. I klientene skjer signering med samme sertifikat som blir benyttet for autentisering mot maskinporten, kryptering skjer med sertifikatet som mottaker har publisert i Fiks IO Kontokatalog.
Merk at man for å oppnå reell ende-til-ende kryptering, i betydningen at KS ikke har noen mulighet til å lese den overførte meldingen, bør innhente mottakers sertifikater gjennom egne kanaler og selv verifisere disse. Fiks IO tilbyr automatisk oppslag i katalogen som en tjeneste for å lette dette arbeidet, men man bør være klar over at det å benytte denne gir noe svekket sikkerhet.
For å sende en melding i Fiks IO må man kjenne konto-id’en til mottakeren, men for å støtte mer dynamisk bruk tilbys Fiks IO Kontokatalog. Dette er et register over Fiks IO kontoer og tilknyttede adresser. En adresse består av:
Adresser opprettes og forvaltes gjennom Fiks Konfigrasjon. Katalogen gir også mulighet for å laste opp en offentlig nøkkel i form av et X509 sertifikat. Dette sertifikatet blir benyttet for å kryptere meldinger sendt til kontoen, slik at de kan dekrypteres med den private delen av nøkkelen ved mottak.
Fiks Organisasjoner kan gjøre oppslag i registrerte adresser gjennom katalog-api’et.
Merk at bruk av dette api’et i stede for manuell innhenting av sertifikater kan gi noe redusert sikkerhet. Se “Sikkerhet” for detaljer.
Som nevnt over har Fiks IO i utgangspunktet ingen formening om hva innholdet i en melding er, men det er i mange integrasjon-scenarioer nyttig å ha et felles repository med kontrakter for hvordan meldinger skal bygges opp. Protokollkatalogen tilbyr en slik oversikt, og man kan her referere til spesifikasjoner for meldingstypene som inngår i protokollen, og hvordan disse skal benyttes.
Digisos bruker som nevnt over meldingsprotokollen “no.nav.digisos.fagsystem.v1”, som er beskrevet i mer detalj under Fiks Digisos.
Ta kontakt med fiks@ks.no om du ønsker å etablere eller gjøre endringer i en protokoll.
Når man sender en melding via Fiks IO klienten kan man velge å sette en levetid (TTL) selv på meldingen, men med minimum 1 sekund. Hvis man ikke setter levetid selv blir TTL satt til 7 dager i Fiks IO tjenesten.
TTL fungerer slik at den blir trigget når meldingen kommer fremst i køen til mottaker. Dette fører til en svakhet hvis man har meldinger på samme kø med forskjellig TTL.
La oss ta følgende eksempel:
Hvis det er flere meldinger på køen, nr 1 i køen har en TTL på 7 dager, nr 2 har en TTL på 10 sekunder. Mottaker systemet er nede i 1 time. Da vil ikke det bli trigget en TTL og sendt en “tidsavbrudd” melding tilbake til avsender (se avsnitt om standardmeldingstyper) før den første meldingen blir konsumert (eller går ut på tid). Altså får man ikke “tidsavbrudd” meldingen tilbake innen forventet tid. Dette betyr at første melding i køen avgjør når man får tidsavbrudd melding tilbake.
Dette er meldingstyper som sendes fra Fiks IO som vil bli sendt ved diverse hendelser for meldingen.
Merk at hvis mottaker avviser en melding (nack) så regnes dette ikke som en feil og Fiks IO sender ikke en feilmelding tilbake til avsender.
Meldingstype: no.ks.fiks.kvittering.tidsavbrudd
Denne meldingen forteller at din meldings TTL har utløpt. Denne meldingen blir sendt til avsender når originalmeldingen kommer fremst i køen til mottaker og TTL er utgått. Som beskrevet tidligere betyr dette at man ikke kan si med sikkerhet at man vil få en tidsavbrudd melding når avsendt meldings TTL går ut, da meldingen foran i køen kan ha lenger TTL.
Disse tidsavbrudd-meldingene inneholder ingen body, men kun headere.
Meldingstype: no.ks.fiks.kvittering.serverfeil.v1
Hvis man får denne Fiks IO serverfeil meldingen tilbake så betyr det at noe har gått galt i levering til mottaker. Akkurat nå sendes denne meldingen kun når det har vært forsøkt levert 3 ganger. F.eks. mottaker har hentet ned meldingen uten å “acke” meldingen 3 ganger, eller at mottaker har nacket med requeue (nackWithReque) 3 ganger.
Merk at de fleste protokollene har også en serverfeil meldingstype som kan sendes fra mottaker av din melding.
Hvis man får protokollens serverfeil melding tilbake, f.eks. for Fiks-Arkiv med meldingstypen no.ks.fiks.arkiv.v1.feilmelding.serverfeil
, så vil det bety at mottaker feilet og sendte denne meldingen kontrollert tilbake med en mulighet for å beskrive hva som gikk galt (forhåpentligvis acket meldingen og sendte denne serverfeil meldingen tilbake).
Fiks IO støtter sending av store filer ved at alle meldinger større enn 5 megabyte mellomlagres i Fiks Dokumentlager, i en dedikert konto som opprettes sammen med Fiks IO kontoen. En referanse til denne lagrede filen blir så sendt over AMQP. Filer sendt på slik måte får en time-to-live i dokumentlager lik time-to-live for meldingen + 24 timer. Etter dette vil de automatisk slettes.
For øyeblikket støttes filer opp til 5 gigabyte.
Hvis man benytter java eller .net klienten utviklet av KS vil denne mellomlagringen oppleves sømløst - klienten streamer automatisk filer fra dokumentlageret om dette er benyttet.
For å gjøre integrasjon lettere vil KS utvikle klienter som benyttes for både sending og mottak av meldinger fra Fiks IO. Det er to klienter, en Fiks IO klient som håndterer muligheten for både å motta og sende meldinger og en Fiks IO send-klient som man kan bruke hvis man bare skal sende meldinger. Fiks IO send-klienten vil da ikke behøve amqp-kobling da den kun sender meldinger via Fiks IO API.
Klient | Pakkenavn | Beskrivelse | Github |
---|---|---|---|
Fiks IO klient Java | fiks-io-klient-java | Klient for å motta og sende meldinger | https://github.com/ks-no/fiks-io-klient-java |
Fiks IO klient .net | KS.Fiks.IO.Client | Klient for å motta og sende meldinger | https://github.com/ks-no/fiks-io-client-dotnet |
Fiks IO send klient Java | fiks-io-send-klient | Klient kun for å sende meldinger | https://github.com/ks-no/fiks-io-send-klient |
Fiks IO send klient .net | KS.Fiks.IO.Send.Client | Klient kun for å sende meldinger | https://github.com/ks-no/fiks-io-send-client-dotnet |
Andre språk vil vurderes, og vi vil gjerne høre fra deg om du skriver klienter for andre språk.
For at meldingene skal kunne sendes til korrekt mottaker og svares på er det en del faste headers eller properties man må sette.
Headerene er slik de ser ut i amqp mens properties er hvordan klienter og API har navngitt tilsvarende attributter. Klienter og API oversetter altså til egne property navn fra og til slik de ser ut som amqp headere.
Merk at man har også en map med navnet “headere” som man kan sende eller man mottar med en melding. Dette er ekstra headere man kan sende ved meldingene.
Hvis man bruker Fiks IO klientene for java eller .net som KS har laget vil man stort sett ikke trenge å forholde seg til headerene (altså amqp-navnene) da man bruker ferdig funksjonalitet og kodet modeller med properties for å sende og svare på meldinger.
Noen navn vil avvike litt mellom header og modell, som f.eks. headeren svar-til
tilsvarer SvarPaMelding
i koden for modellen for en melding for både java og .net. Se tabellen under for mapping mellom header og tilsvarende property navn man finner i klientkoden.
Header i amqp | Property navn | Beskrivelse |
---|---|---|
avsender-id | AvsenderKontoId | Avsenders Fiks IO-konto eller Protokoll konto |
melding-id | MeldingId | Meldingens ID. Denne skal ikke settes selv, men vil bli gitt av Fiks IO når man sender en melding |
type | MeldingType | Meldingstype |
dokumentlager-id | - | ID til eventuell fil lagret i Dokumentlager. Relevant ved mottatt melding. |
svar-til | SvarPaMelding | Hvis meldingen er svar på en tidligere Fiks IO-melding, vil svar-til referere til den meldingens melding-id |
svar-til-type | - | På no.ks.fiks.kvittering.tidsavbrudd meldinger legges typen til den opprinnelige meldingen i svar-til-type |
klientmelding-id | KlientMeldingId | En id som avsender gjenbruker ved resending av en melding |
- | Resendt | Denne settes hvis melding har blitt resendt pga mottaker har gjort ‘NackWithRequeue’ |
Headere (map) | Man kan sende ved egne properties |
Headere (map)
Her kan man sende inn i en map egendefinerte navn-verdi properties i en map som man ønsker å sende med meldingen. Hvis man bruker Fiks IO klientene vil det legges på en “egendefinert-header.” prefix for hver egendefinert header.
Resendt
Resendt betyr at en melding er resendt pga mottaker har gjort en ‘NackWithRequeue’. Dette er ikke en header men en status vi får fra rabbitmq.
dokumentlager-id
Denne får man kun hvis meldingens payload har overskredet grensen for filstørrelse og dermed blitt lagret i dokumentlageret. Hvis man bruker Fiks IO klienten i .net eller java vil man ikke trenge å forholde seg til dette da klienten forenkler dette og henter eventuelt filen fra dokumentlageret for deg.
klientmelding-id (KlientMeldingID)
Denne id er ikke påbudt men kan benyttes for å identifisere en melding som sendes på nytt fra avsender. Den skal være ny og unik for hver melding men brukes på nytt når man resender en melding.
Dette er i motsetning til melding-id
som blir unik og ny for hver eneste melding, også hvis man sender en melding på nytt. Hvis man bruker Fiks IO klienten i java eller .net vil man sette denne som en vanlig property.
Dette vil man altså ikke trenge å forholde seg til hvis man bruker de tilgjengelige Fiks IO klientene da de tolker dette atributtet for deg.
Når man sender en melding til Fiks IO API vil den se slik ut:
{
"MeldingId":"00000000-0000-0000-0000-000000000000",
"KlientMeldingId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"MeldingType":"no.ks.fiks.arkiv.v1.arkivering.arkivmelding",
"AvsenderKontoId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"MottakerKontoId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Ttl":"2.00:00:00",
"Headere":{},
"SvarPaMelding":null,
"Resendt":false
}
MeldingId vil være en tom guid da man ikke setter den men får den som en ny og unik generert guid tilbake fra API. Headere skal her kun inneholde eventuelt egendefinerte properties man ønsker å sende i meldingen. MottakerKontoId blir ikke til en amqp header men identifiserer hvilken kø meldingen skal til.
Svaret man får tilbake fra API ved send vil da se helt lik ut til det man sendte samt en ny generert MeldingId:
{
"MeldingId": "ca544416-267a-40d4-8e4c-86d14cd0a51f",
"KlientMeldingId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"MeldingType": "no.ks.fiks.arkiv.v1.arkivering.arkivmelding",
"AvsenderKontoId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"MottakerKontoId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Ttl": "2.00:00:00",
"Headere": {},
"SvarPaMelding": null,
"Resendt": false
}
Når man mottar en melding i Fiks IO klienten så vil man få ferdig mappet fra amqp headere til properties i modellen MottattMeldingMetadata
i java og .net.
Property SvarPaMelding (amqp headeren svar-til
) vil da eventuelt inneholde den MeldingId den er et svar på, altså den id du fikk tildelt da du sendte opprinnelig melding.
Er det en melding man ønsker å svare på selv kan man bruke den innebyggede Svar( … ) funksjonaliteten i Fiks IO klienten som vil da sørge for at SvarPaMelding blir korrekt.
Alternativt hvis man ikke kan bruke Svar-funksjonaliteten ut av boksen, må man sørge for å sette korrekt MeldingId i SvarPaMelding property når man sender meldingen tilbake.
Hvis man ikke bruker Fiks IO klienten fra KS vil man måtte gjøre tolkning av amqp headerene selv.
Her ser man hvordan Fiks IO klienten, Fiks IO API og køene henger sammen i en meldingsutveksling mellom to system.
I dette eksempelet sender System A en melding fra Fiks IO klienten til Fiks IO API. Fiks IO API putter det på køen til System B. System B bruker Fiks IO klienten for å lytte på køen i Fiks IO og mottar meldingen. System B gjør som System A og sender svar på meldingen til Fiks IO API via Fiks IO klienten. Fiks IO API putter svarmeldingen på køen til System A. System A lytter og mottar svar på meldingen på sin egen kø via Fiks IO klienten.
Merk at det er egentlig bare ett Fiks IO API som begge systemene bruker, men det er tegnet inn som 2 forskjellige bokser for å tydeligere vise flyten.
Når man har mottatt en melding og vellykket håndtert den så skal man sørge for å bekrefte meldingen som mottatt (Ack). Dette tar bort meldingen fra køen.
Meldinger støtter dette men vi anbefaler det ikke da det betyr at man totalt avviser meldingen. Meldinger som avvises vil ikke føre til feilmelding tilbake til avsender fra Fiks IO. Hvis man bruker dette må man være sikker på at avsender håndterer manglende respons på avsendt melding.
Meldinger støtter dette men vi anbefaler stort sett ikke å bruke dette da det betyr at meldingen bare kommer på nytt fra Fiks IO og dette teller som forsøk på å hente meldingen. Dette betyr at man fort “bruker opp” antall forsøk på å lese meldingen og den havner i DLQ (dead-letter-queue) og deretter blir til en feilmelding tilbake til avsender. Det vil være tilfeller hvor man allikevel ønsker å gjøre dette, f.eks. hvis man får en uventet feil og ikke har noen annen måte å gi tilbakemelding til avsender at mottak feilet.