Skip to main content

Draft: Voorstel EmployeeIdentity middel

In dit document doen we een inventarisatie naar de impact van het doorvoeren van een nieuw authenticatiemiddel EmployeeIdentity.

Zie voor de technische specificatie het Pull request op RFC002.

Uitgangspunten

Uitgangspunten bij de voorgestelde oplossing zijn als volgt:

  1. Minimale impact op de ontwikkelcapaciteit van leveranciers. We weten dat er nog veel moet gebeuren voor de eOverdracht en dat de deadline snel nadert. We stellen een oplossing voor die idealiter in één dag is in te bouwen bij de leveranciers.

  2. Faciliteren van een groeipad. We weten dat het gebruik van persoonlijke authenticatiemiddelen binnenkort verplicht gaat worden via wetten als de WDO en de Wegiz icm diverse NEN normen. De oplossing maakt het mogelijk voor zorginstellingen en leveranciers om eenvoudig het niveau op te hogen.

  3. Voldoen aan de NEN7513. Om te kunnen voldoen aan deze norm is het belangrijk te weten welke gebruiker welke gegevens heeft ingezien. De voorgestelde oplossing voldoet aan deze eis.

Oplossingsrichting

Assurance Level eis

De zorginstelling moet zelf kunnen bepalen welke eisen ze stellen aan het vertrouwensniveua van het gebruikte middel. Daarom stellen we een nieuw veld authenticatorAssuranceLevel voor in het AuthorizationCredential waarin een betrouwbaarheidsniveau van het gebruikte middel wordt opgegeven.

Het Nuts afspraken stelsel schrijft vervolgens een lijst van levels en middelen voor, bijvoorbeeld:

middel level
EmployeeIdentity low
Yivi(IRMA) middle
Uzi high

Dit level moet worden gezet per resource door de bronhouder. De opvragende partij vraagt de gebruikersidentiteit uit op het gevraagde niveau.

Voorbeeld gebruik

Onderstaand object is een voorbeeld van een credentialSubject van een AuthorizationCredential waar het authenticatorAssuranceLevel veld wordt gebruikt:

{
  "id": "did:nuts:SjkuVHVqZndMVVJwcnUzbjhuZklhODB1M1M0LW9LcWY0WUs5S2",
  "legalBase": {
    "consentType": "explicit",
    "evidence": {
      "path": "pdf/f2aeec97-fc0d-42bf-8ca7-0548192d4231",
      "type": "application/pdf"
    }
  },
  "localParameters": {...},
  "resources": [
    {
      "path": "/DocumentReference/f2aeec97-fc0d-42bf-8ca7-0548192d4231",
      "operations": ["read"],
      "userContext": true,
      "authenticatorAssuranceLevel": "low"
    }
  ],
  "purposeOfUse": "test-service",
  "subject": "urn:oid:2.16.840.1.113883.2.4.6.3:123456780"
}

Introductie van een nieuw EmployeeIdentity middel

Het probleem wat we op proberen te lossen is de problematiek bij implementatie, acceptatie en uitrol van persoonlijke authenticatiemiddelen. We verwachten dat zorginstellingen meer tijd nodig hebben intern beleid, ondersteuning en uitrol van deze middelen in te richten en op te tuigen. Ook is de keuze uit middelen nog beperkt waardoor deze nog niet aansluiten bij de werkprocessen van zorginstellingen. Zorginstellingen geven aan terug te willen vallen op bestaande afspraken onderling en elkaar daarin te vertrouwen met het identificeren van medewerkers. Daarom introduceren we het EmployeeIdentity middel. Dit middel is van niveau low en gebruikt de identiteit van de ingelogde gebruiker.

Dit middel is een drop-in replacement voor het Yivi(IRMA) middel.

Sessie aanmaken

Huidige aanroep met IRMA:

POST /internal/auth/v1/signature/session
{
  "means": "irma",
  "payload": "EN:PractitionerLogin:v3 I hereby declare to act on behalf of CareBears located in CareTown. This declaration is valid from Monday, 2 January 2006 15:04:05 until Monday, 2 January 2006 17:04:05."
}

Voorgestelde aanroep voor EmployeeIdentity:

POST /internal/auth/v1/signature/session
{
  "means": "employeeIdentity",
  "params": {
    "@context":[
      "http://schema.org/",
      "https://nuts.nl/credentials/v1",
      "https://www.w3.org/2018/credentials/v1"
    ],
    "type": ["VerifiableCredential", "NutsEmployeeIdentityCredential"],
    "issuer":"did:nuts:123456789",
    "credentialSubject": {
      "@type": "EmployeeRole",
      "identifier": "481",
      "roleName": "Verpleegkundige niveau 2",
      "member": {
        "@type": "Person",
        "initials": "J",
        "familyName": "van Dijk",
        "email": "j.vandijk@example.com"
      }
    }
  },
  "payload": "EN:PractitionerLogin:v3 I hereby declare to act on behalf of CareBears located in CareTown. This declaration is valid from Monday, 2 January 2006 15:04:05 until Monday, 2 January 2006 17:04:05."
}

Response:

IRMA

{
  "sessionID": "123",
  "sessionPtr": {QRCode},
  "means": "irma"
}

De frontend moet dan de inhoud van het sessionPtr veld als QR code renderen.

EmployeeIdentity

{
  "sessionID": "123",
  "sessionPtr": { "url":"nuts.example.com/public/auth/employeeID/123" },
  "means": "irma"
}

De frontend moet nu de url uit het sessionPtr object gebruiken om een nieuw browser venster te openen of een in een iframe te renderen.

Pollen van de sessie status

IRMA en EmployeeIdentity:

GET /internal/auth/v1/signature/session/{sessionID}

Pending, zolang de gebruiker nog niet klaar is:

{
    "status": "pending"
}

Afgerond:

{
  "status": "completed",
  "verifiablePresentation": {
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://nuts.nl/credentials/v1",
      "http://schema.org/",
      "https://w3c-ccg.github.io/lds-jws2020/contexts/lds-jws2020-v1.json"
    ],
    "type": "VerifiablePresentation",
    "verifiableCredential": {
      "issuer": "did:nuts:123456789",
      "type": "VerifiableCredential",
      "expirationDate": "2023-04-03T20:34:17.687862+01:00",
      "credentialSubject": {
        "@type": "EmployeeRole",
        "identifier": "481",
        "roleName": "Verpleegkundige niveau 2",
        "member": {
          "@type": "Person",
          "initials": "J",
          "familyName": "van Dijk",
          "email": "j.vandijk@example.com"
        }
      },
      "proof": {
        "type": "JsonWebSignature2020",
        "verificationMethod": "did:nuts:123456789#key-1",
        "created": "2023-04-03T16:34:17.687862+01:00",
        "jws": "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..hKcboC8m6YnZPi6ReJAYs0J0Ztn5nxcx2EavoXdtrkWxmE1JZmImW89_8IIgjvfI8XtGeDlEnGywAuY2u7y9Bw"
      }
    },
    "evidence": {
      "type": "NutsBrowserSession",
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62",
      "ipAddress": "127.0.0.1"
    },
    "proof": {
      "challenge": "LOGIN CONTRACT",
      "type": "JsonWebSignature2020",
      "verificationMethod": "did:nuts:123456789#key-1",
      "created": "2023-04-03T16:34:17.687862+01:00",
      "jws": "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..hKcboC8m6YnZPi6ReJAYs0J0Ztn5nxcx2EavoXdtrkWxmE1JZmImW89_8IIgjvfI8XtGeDlEnGywAuY2u7y9Bw"
    }
  }
}

Gebruik van het identity token

Dit is het zelfde als met IRMA, de waarde van het verifiableCredential veld wordt gebruikt als input voor het "usi" token bij het aanvragen van een access_token.