Innledning

For å få utlevert informasjon om resepter i nettutleverers portal må kunden autentisere seg. Autentiseringen utføres gjennom pålogging i ID-porten på høyeste sikkerhetsnivå (nivå 4).

Historisk sett har ID-porten benyttet SAML2-standarden. Denne skal fases ut og erstattes av OAuth2.0/OIDC.

Autentiseringsinformasjon utveksles mellom nettutleverer og ID-porten og når kunden har autentisert seg gjennom ID-porten, kan nettutleverer sende forespørsler til Reseptformidleren.

Reseptformidleren vil verifisere kundens autentisering. Forespørsler fra nettkunde til Reseptformidleren (M9NA1 Forespørsel om reseptliste fra nettkunde og M9NA3 Forespørsel om utvidet informasjon på resept fra nettkunde) skal inneholde et teknisk bevis slik at Reseptformidleren kan verifisere autentiseringen.

Det tekniske beviset som nettutleverer mottar fra ID-porten legges ved som vedlegg til hodemeldingen i M9NA1 og M9NA3.

Datautveksling ved bestilling av reseptbelagte varer på internett

For å tilby bestilling av reseptbelagte varer på Internett vil nettutleverers løsning bestå av en portal i tillegg til utleverersystemet. Portalen er tilgjengelig på Internett (ekstern sone), mens utleverersystemet (som er i sikker sone) kommuniserer med Reseptformidleren over helsenettet. Kommunikasjon med Reseptformidleren som initieres fra portal i nettutleverer skal gå gjennom utleverersystemet. Portalen kan ikke kommunisere direkte med Reseptformidleren, og skal ikke benytte meldinger på e-resept format. Dette er illustrert i figuren under.

Verifisering av teknisk bevis på kundens autentisering i portal nettutleverer

OAuth2.0/OIDC basert verifisering

Reseptformidlerens nettutleverertjeneste støtter også OAuth2 eller OIDC basert autentisering av bruker. OAuth2 flyten baserer seg på ID-porten sin støtte for brukerstyrt datadeling. Selve tokenet reseptformidleren forventer er en signert jwt "self-container/by value", hvilke felter som er forventet med hva følger.

Validering av token

Reseptformidleren vil verifisere kundens autentisering ved å validere følgende om OIDC tokenet, terminologien OIDC token og access token brukes om en annen her.

Et eksempel på base 64 de-enkodet access token fra ID-porten er gitt under:

// Header (merk denne linjen er kun hjelpetekst)
{
  "kid" : "digitaliseringsdirektoratet--cert0",
  "alg" : "RS256"
}
// Payload (merk denne linjen er kun hjelpetekst)
{
  "sub" : "19108209340",
  "iss" : "https://test.idporten.no",
  "client_amr" : "private_key_jwt",
  "pid" : "19108209340",
  "client_id" : "57308738-56fa-4676-b422-83269165b00e",
  "aud" : [ "http://nhn.test2-na.reseptformidleren.net/NA/NAWebServiceSoapHttpPort", "57308738-56fa-4676-b422-83269165b00e" ],
  "acr" : "idporten-loa-high",
  "scope" : "eresept:nettutleverer openid",
  "supplier" : {
    "authority" : "iso6523-actorid-upis",
    "ID" : "0192:994598759"
  },
  "exp" : 1698852734,
  "iat" : 1698852434,
  "jti" : "-DmVMB32Cmo",
  "consumer" : {
    "authority" : "iso6523-actorid-upis",
    "ID" : "0192:983044778"
  }
}
// Signatur (merk denne linjen er kun hjelpetekst)
mm2PqEEdKW-f-OjdpGlsDJcHjv6WzWLaObbqcZ40XPQ8YorS2EPq_588Pz0QJ-kEQpdTNfDm5OQadIgSeGWn8LXh7ePE5Q9B4blf9rtXlJ_Uhn43XyZ7793kaKer41VTXgKi68Ltt8lny_X9aOk2J409WOLBWp17mrIbt4M2sU8M04_jx931X_z6n5U3Jse2wkzoXL9f4bp_nlbC-_tzho8dH-b6EIBgV3lFJCe7XuAabtYl9cGL11TQ4FmEyhF2GyM7UqAzWiDhKiM0gPjl92dflb-9PThq0Z7ljnB4Q8dKC92zeny0mTC_vQ50-ElvH4NSJekeM4SWzXCK9OlkiPni4ci8tICpz0Ove9mK3xo2J9N-V3gAv7p3a37DETtYjSsomVcMKCdNCdlaunYejyO9edKCXz8NAKPNzs8BXE89hffep3YJJbfuB3joDUhmUtf9Z0j_Ce7oo9TKOGJ9ePOkUIIoDOH9JdyG3_x8OSuu2tMLnrl-vnUIPd5FyBb3

Merk at "supplier" feltet eksisterer kun fordi vi er en leverandør som

Det tilsvarende rå access tokenet er en jwt (json web token) som sett under

Rå access token jwt
eyJraWQiOiJkaWdpdGFsaXNlcmluZ3NkaXJla3RvcmF0ZXQtLWNlcnQwIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiIxOTEwODIwOTM0MCIsImlzcyI6Imh0dHBzOi8vdGVzdC5pZHBvcnRlbi5ubyIsImNsaWVudF9hbXIiOiJwcml2YXRlX2tleV9qd3QiLCJwaWQiOiIxOTEwODIwOTM0MCIsImNsaWVudF9pZCI6IjU3MzA4NzM4LTU2ZmEtNDY3Ni1iNDIyLTgzMjY5MTY1YjAwZSIsImF1ZCI6WyJodHRwOi8vbmhuLnRlc3QyLW5hLnJlc2VwdGZvcm1pZGxlcmVuLm5ldC9OQS9OQVdlYlNlcnZpY2VTb2FwSHR0cFBvcnQiLCI1NzMwODczOC01NmZhLTQ2NzYtYjQyMi04MzI2OTE2NWIwMGUiXSwiYWNyIjoiaWRwb3J0ZW4tbG9hLWhpZ2giLCJzY29wZSI6ImVyZXNlcHQ6bmV0dHV0bGV2ZXJlciBvcGVuaWQiLCJzdXBwbGllciI6eyJhdXRob3JpdHkiOiJpc282NTIzLWFjdG9yaWQtdXBpcyIsIklEIjoiMDE5Mjo5OTQ1OTg3NTkifSwiZXhwIjoxNjk4ODUyNzM0LCJpYXQiOjE2OTg4NTI0MzQsImp0aSI6Ii1EbVZNQjMyQ21vIiwiY29uc3VtZXIiOnsiYXV0aG9yaXR5IjoiaXNvNjUyMy1hY3RvcmlkLXVwaXMiLCJJRCI6IjAxOTI6OTgzMDQ0Nzc4In19.mm2PqEEdKW-f-OjdpGlsDJcHjv6WzWLaObbqcZ40XPQ8YorS2EPq_588Pz0QJ-kEQpdTNfDm5OQadIgSeGWn8LXh7ePE5Q9B4blf9rtXlJ_Uhn43XyZ7793kaKer41VTXgKi68Ltt8lny_X9aOk2J409WOLBWp17mrIbt4M2sU8M04_jx931X_z6n5U3Jse2wkzoXL9f4bp_nlbC-_tzho8dH-b6EIBgV3lFJCe7XuAabtYl9cGL11TQ4FmEyhF2GyM7UqAzWiDhKiM0gPjl92dflb-9PThq0Z7ljnB4Q8dKC92zeny0mTC_vQ50-ElvH4NSJekeM4SWzXCK9OlkiPni4ci8tICpz0Ove9mK3xo2J9N-V3gAv7p3a37DETtYjSsomVcMKCdNCdlaunYejyO9edKCXz8NAKPNzs8BXE89hffep3YJJbfuB3joDUhmUtf9Z0j_Ce7oo9TKOGJ9ePOkUIIoDOH9JdyG3_x8OSuu2tMLnrl-vnUIPd5FyBb3

For å være tydelige forventer reseptformidleren at det rå access token jwt’en er base64 enkodet. Altså:

val accessTokenJwtString = "eyJraWQiOi..."
val forventetFormat = Base64.encode(accessTokenJwtString)

SAML basert verifisering

SAML basert verifisering i ID-porten fases ut og erstattes av OAuth2.0/OIDC.

SAML Assertion profilene til ID-porten er dokumentert på: http://begrep.difi.no/ID-porten

Reseptformidleren vil verifisere kundens autentisering ved å validere følgende i SAML Assertion:

Et eksempel på SAML Assertion fra ID-porten er gitt under:

SAML Assertion eksempel
<?xml version="1.0" encoding="UTF-8"?>
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="s25c697da635a0f389026ae58fda0bcc2eeb770ce9" IssueInstant="2016-01-25T08:41:38Z" Version="2.0">
    <saml:Issuer>idporten.difi.no-v3</saml:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
            <ds:Reference URI="#s25c697da635a0f389026ae58fda0bcc2eeb770ce9">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                <ds:DigestValue>Fij2EA4EVhl12emojeQ7pErReEw=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>
rf8tWPdOe5LonO9EdxIXg7iglCoHHRrFAb61VlU/8iuy5j0Q4AYlBgQOTAuHbv6aeup9+UV50d4k
GIZgh8G9XX2v8E9Q7isOcIifBOGiYqrXAw86M8LhQtXp4sLv0RygvJKO8T3xIUHwPKFSBNAyuktkBrwLnS4h4ENnKE59bpHYiucSAwtkUYwE5N8wN2z4ynZzHs8t3KEULrQa/3HZhwMbBafZn4
        </ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>
MIIFCTCCA/GgAwIBAgILCCtPHJR3OA6DBLQwDQYJKoZIhvcNAQELBQAwSzELMAkGA1UEBhMCTk8x7X0RlHChQ9HySh9TAqu4AW7wH1ZXhjbEkKDLuEoIMYRNISBtxMbsx7X0RlHChQ9HySh9TACtPHJR3OA6DBLQwDQYJKoZIhvcNAQEsOcIifBOGiYqrXAw86M8LhQtXp4sLv0dOe5LonO9EdxIXg7iglC8x7X0RlHChQ9CTk8x7X0RlHChQ9HySh9TAqu4AW7wH1ZXhjbEk
                </ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
    <saml:Subject>
        <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="idporten.difi.no-v3" SPNameQualifier="nettapotek1">Mf/ZfHDrpzphfhtebHDbTC60R7vO</saml:NameID>
        <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
            <saml:SubjectConfirmationData InResponseTo="_4570522e7dac091f1822e62c70a5eec5" NotOnOrAfter="2016-01-25T08:51:38Z" Recipient="http://nettapotek1.no/testsp/assertionconsumer"/>
        </saml:SubjectConfirmation>
    </saml:Subject>
    <saml:Conditions NotBefore="2016-01-25T08:31:38Z" NotOnOrAfter="2016-01-25T08:51:38Z">
        <saml:AudienceRestriction>
            <saml:Audience>nettapotek1</saml:Audience>
        </saml:AudienceRestriction>
    </saml:Conditions>
    <saml:AuthnStatement AuthnInstant="2016-01-25T08:41:38Z" SessionIndex="s20ffeef28cd3a3f3039b1c2ea436889a0c983c304">
        <saml:AuthnContext>
            <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
        </saml:AuthnContext>
    </saml:AuthnStatement>
    <saml:AttributeStatement>
        <saml:Attribute Name="uid">
            <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">010160XXXXX</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="Culture">
            <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">nb</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="postkasseleverandoerNavn">
            <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Digipost</saml:AttributeValue>
       </saml:Attribute>
        <saml:Attribute Name="epostadresse">
            <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">ola@nordmann.no</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="mobiltelefonnummer">
            <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">99999999</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="reservasjon">
            <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">NEI</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="status">
            <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">AKTIV</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="AuthMethod">
            <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Minid-OTC</saml:AttributeValue>
        </saml:Attribute>
        <saml:Attribute Name="SecurityLevel">
           <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">4</saml:AttributeValue>
        </saml:Attribute>
    </saml:AttributeStatement>
</saml:Assertion>