Knytte eID-påstander til Auth0: Bruk av handlinger og regler

Av Natalia Moskaleva den 26. april 2023

7 min lesetid

<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >Knytte eID-påstander til Auth0: Bruk av handlinger og regler</span>

Gjennom vårt partnerskap med Auth0 tilbyr Idura en rekke eID-tjenester som hjelper Auth0-kunder med å effektivisere identitetsverifisering og forbedre brukeropplevelsen ved å la brukerne logge inn med sin nasjonale eID.

I et tidligere blogginnlegg viste vi hvor enkelt det er å koble en Auth0-applikasjon til norsk BankID via Idura. Men det er like enkelt å legge til alle andre eID-er vi støtter i en eksisterende Auth0-applikasjon. Alt som trengs er å legge til en ny Enterprise Connection med litt varierende konfigurasjoner.

La oss se nærmere på hvordan vi tilordner Idura-krav til Auth0. Dette kan gjøres ved hjelp av to forskjellige metoder: Auth0-regler eller Auth0-handlinger.

Den første, enklere tilnærmingen innebærer å legge til et egendefinert krav ved hjelp av en regel.

Å bruke Actions krever derimot noen flere konfigurasjoner og bruk av Auth0 Management API.

Når denne veiledningen er ferdig, vil du ha en bedre forståelse av hvordan du konfigurerer integrasjonen mellom Idura og Auth0 slik at den oppfyller dine behov og gir tilgang til alle nødvendige brukerdata.

For å kunne følge med, trenger du en Auth0-applikasjon med en OpenID Connect Enterprise-tilkobling for den eID-en du ønsker.(Denne veiledningen kan hjelpe deg med å komme i gang).

 

1. Legge til et egendefinert krav med Auth0 Rules

Legge til en ny regel

Denne metoden innebærer at du legger til en regel i innloggingsflyten i Auth0-applikasjonen.

I regelen definerer vi logikken som legger til et egendefinert krav til ID-tokenet som genereres av Auth0 etter en vellykket brukerinnlogging. Når en bruker logger på med eID-en sin, vil informasjonen fra identitetsleverandøren bli inkludert i Auth0-brukerprofilen.

Vi viser kodeeksempler for å inkludere personnummer fra ulike europeiske eID-er, samt CVR-numre for det danske MitID Erhverv (MitID Business), i et tilpasset krav. Du kan legge til andre egendefinerte krav fra eksterne Identity Providers på samme måte.


I Idura-implementeringen har hver nasjonale eID en unik JWT-nøkkel for et personnummer, oppsummert i tabellen nedenfor:

eID

SSN

Dansk MitID &
MitID Erhverv
(MitID Business)

cprNumberIdentifier

Svensk BankID

ssn

Norsk BankID

socialno

Finsk tillitsnettverk

hetu

For mer informasjon om hver eID, inkludert fullstendig JWT-innhold, se dokumentasjonen vår.

Legge til en ny Auth0-regel

  1. I Auth0 velger du Auth Pipeline og deretter Regler i hovedmenyen.
  2. Opprett en ny regel ved hjelp av regelmalen Empty.
  3. Velg et navn på regelen (f.eks. "Legg til SSN til ID-token"), og legg deretter til et skript for den eID-en du ønsker. Se kodeutdragene nedenfor ("https://example.com" er en plassholder for ditt eget navneområde).
  4. Når du har lagt til skriptet, klikker du på Lagre endringer.
  5. Sørg for at regelen er aktivert for påloggingsflyten. Du kan sjekke dette i Handlinger > Flyter > Innlogging, eller ved å sjekke at regelbryteren er aktivert.


Kodesnutter

Dansk MitID

Dette eksemplet kartlegger bare brukerens SSN. Du kan se hele listen overdanske MitID-krav her.

function (user, context, callback) {
  context.idToken['https://example.com/cprNumberIdentifier'] = user.cprNumberIdentifier;
  return callback(null, user, context);
 }


Dansk MitID Erhverv (MitID Business)

Dette eksemplet kartlegger brukerens SSN og CVR-nummeret til selskapet brukeren er tilknyttet. Du kan se hele listen overdanske MitID Erhverv-krav her.

function (user, context, callback) {
 context.idToken['https://example.com/cprNumberIdentifier'] = user.cprNumberIdentifier;
 context.idToken['https://example.com/cvrNumberIdentifier'] = user.cvrNumberIdentifier;
 return callback(null, user, context);
}


Svensk BankID

Dette eksemplet kartlegger bare brukerens SSN. Du kan se hele listen over svenske BankID-krav her.

function (user, context, callback) {
 context.idToken['https://example.com/ssn'] = user.ssn;
 return callback(null, user, context);
}

 

Norsk BankID

Dette eksempelet kartlegger kun brukerens SSN. Du kan se hele listen over norske BankID-krav her. (Vær oppmerksom på at for norsk BankID krever ytterligere brukerdata eksplisitt samtykke fra brukeren).

function (user, context, callback) {
 context.idToken['https://example.com/socialno'] = user.socialno;
 return callback(null, user, context);
}

 

Finsk tillitsnettverk

Dette eksemplet kartlegger bare brukerens SSN. Du kan se hele listen over finske Trust Network-krav her.

function (user, context, callback) {
 context.idToken['https://example.com/hetu'] = user.hetu;
 return callback(null, user, context);
}

Det er alt som trengs. Når personnummeret (til et CVR-nummer) er tilgjengelig gjennom en nasjonal eID via Idura, vil det bli lagt til i Auth0 ID-tokenet (så lenge regelen er aktivert).

image3

 

2. Legge til et egendefinert krav med Auth0-handlinger

Handlinger gir mer fleksibilitet enn regler, og er den anbefalte måten å legge til egendefinerte krav til tilgangs- og ID-tokens på.

Men for øyeblikket har Auth0 Actions den begrensningen at de ikke eksponerer brukerdata fra eksterne Identity Providers. Du kan for øyeblikket ikke få tilgang til krav som er lagt til av Identity Providers i handlingskoden, så du må omgå denne begrensningen.

Den eneste løsningen vi har funnet, er å integrere en egendefinert handling med Management API for å slå opp brukerprofilen. Vi forklarer trinnene nedenfor, slik at du kan velge den implementeringen som fungerer best for deg. Vær oppmerksom på at Auth0 Management API har hastighetsbegrensninger ved høy bruk (se lenken ovenfor til Handlingsbegrensninger).

Konfigurere Management API og opprette en egendefinert handling

Vi bruker denne gjennomgangen til å legge til Management API i handlingskoden vår. Vi vil bruke Management API-klienten til å få tilgang til brukerprofilen og hente de nødvendige dataene. (I vårt tilfelle brukerens personnummer, som er tilgjengelig i JWT-krav levert av Idura).

1. For å konfigurere Management API, opprett og autoriser en maskin-til-maskin-applikasjon for handlingen.

2. Autoriser den til å bruke Management API med de nødvendige scopes. Vi trenger Read:users og update:users.


image4

3. Opprett en ny egendefinert handling med utløseren Login / Post Login under fanen Actions.


image2

4. Lagre applikasjonens legitimasjon i handlingens event.secrets-objekt. Du finner domenet, klient-ID-en og klienthemmeligheten i Innstillinger-fanen i Maskin til maskin-applikasjonen som ble opprettet i trinn 1.

image5

5. Legg til npm-modulen auth0.

image1

6. Legg til handlingskoden din. Initialiser og bruk Management API-klienten i handlingen for å få tilgang til brukerprofilen. Legg deretter til et egendefinert krav.

Som med Rules, kan Action-koden variere noe avhengig av hvilken eID du henter data fra. Kodesnuttene nedenfor viser hvordan du legger til et egendefinert krav om personnummer som er tilgjengelig via en nasjonal eID gjennom Idura. For dansk MitID og norsk BankID legger vi også til et egendefinert krav som inneholder brukerens adresse.

 

Dansk MitID

const ManagementClient = require('auth0').ManagementClient;

exports.onExecutePostLogin = async (event, api) =&gt; {
  const namespace = 'https://example.com';
  const management = new ManagementClient({
    domain: event.secrets.AUTH0_DOMAIN,
    clientId: event.secrets.AUTH0_MANAGEMENT_CLIENT_ID,
    clientSecret: event.secrets.AUTH0_MANAGEMENT_CLIENT_SECRET,
    scope: 'read:users update:users',
  });
  const user = await management.getUser({ id: event.user.user_id });

  api.idToken.setCustomClaim(`${namespace}/address`, user.address);
  api.idToken.setCustomClaim(`${namespace}/cprNumberIdentifier`, user.cprNumberIdentifier);
};

* For dansk MitID er det mulig å kjøpe et tillegg for å søke opp lovlige, verifiserte adresser for danske statsborgere.

 

Dansk MitID Erhverv (MitID Business)

const ManagementClient = require('auth0').ManagementClient;

exports.onExecutePostLogin = async (event, api) =&gt; {
  const namespace = 'https://example.com';
  const management = new ManagementClient({
    domain: event.secrets.AUTH0_DOMAIN,
    clientId: event.secrets.AUTH0_MANAGEMENT_CLIENT_ID,
    clientSecret: event.secrets.AUTH0_MANAGEMENT_CLIENT_SECRET,
    scope: 'read:users update:users',
  });
  const user = await management.getUser({ id: event.user.user_id });

  api.idToken.setCustomClaim(`${namespace}/cprNumberIdentifier`, user.cprNumberIdentifier);
  // Danish Business Registry Number (CVR Nummer)
  api.idToken.setCustomClaim(`${namespace}/cvrNumberIdentifier`, user.cvrNumberIdentifier);
};

* For dansk MitID Erhverv vil selskapets CVR-nummer være tilgjengelig i JWT-kravene.



Svensk BankID

const ManagementClient = require('auth0').ManagementClient;

exports.onExecutePostLogin = async (event, api) =&gt; {
  const namespace = 'https://example.com';
  const management = new ManagementClient({
    domain: event.secrets.AUTH0_DOMAIN,
    clientId: event.secrets.AUTH0_MANAGEMENT_CLIENT_ID,
    clientSecret: event.secrets.AUTH0_MANAGEMENT_CLIENT_SECRET,
    scope: 'read:users update:users',
  });
  const user = await management.getUser({ id: event.user.user_id });

  api.idToken.setCustomClaim(`${namespace}/ssn`, user.ssn);
};

 

Norsk BankID

const ManagementClient = require('auth0').ManagementClient;

exports.onExecutePostLogin = async (event, api) =&gt; {
  const namespace = 'https://example.com/';
  const management = new ManagementClient({
    domain: event.secrets.AUTH0_DOMAIN,
    clientId: event.secrets.AUTH0_MANAGEMENT_CLIENT_ID,
    clientSecret: event.secrets.AUTH0_MANAGEMENT_CLIENT_SECRET,
    scope: 'read:users update:users',
  });
  const user = await management.getUser({ id: event.user.user_id });

  api.idToken.setCustomClaim(`${namespace}/address`, user.address);
  api.idToken.setCustomClaim(`${namespace}/socialno`, user.socialno);
};

* For norsk BankID er ubekreftet adresseinformasjon tilgjengelig på forespørsel så lenge brukeren har gitt eksplisitt samtykke.

 

Finsk tillitsnettverk

const ManagementClient = require('auth0').ManagementClient;

exports.onExecutePostLogin = async (event, api) =&gt; {
  const namespace = 'https://example.com/';
  const management = new ManagementClient({
    domain: event.secrets.AUTH0_DOMAIN,
    clientId: event.secrets.AUTH0_MANAGEMENT_CLIENT_ID,
    clientSecret: event.secrets.AUTH0_MANAGEMENT_CLIENT_SECRET,
    scope: 'read:users update:users',
  });
  const user = await management.getUser({ id: event.user.user_id });

  api.idToken.setCustomClaim(`${namespace}/hetu`, user.hetu);
};

 

Flere eID-er i én handling

const ManagementClient = require('auth0').ManagementClient;

exports.onExecutePostLogin = async (event, api) =&gt; {
  const namespace = 'https://example.com/';
  const management = new ManagementClient({
    domain: event.secrets.AUTH0_DOMAIN,
    clientId: event.secrets.AUTH0_MANAGEMENT_CLIENT_ID,
    clientSecret: event.secrets.AUTH0_MANAGEMENT_CLIENT_SECRET,
    scope: 'read:users update:users',
  });
  const user = await management.getUser({ id: event.user.user_id });

  // Danish MitID
  api.idToken.setCustomClaim(`${namespace}/cprNumberIdentifier`, user.cprNumberIdentifier);
  // Swedish BankID
  api.idToken.setCustomClaim(`${namespace}/ssn`, user.ssn);
  // Finnish Trust Network
  api.idToken.setCustomClaim(`${namespace}/hetu`, user.hetu);
};

Når du har lagret og distribuert handlingen, legger du den til i innloggingsflyten. Brukerens personnummer vil nå være tilgjengelig i ID-tokenet som genereres av Auth0 ved vellykket autentisering.

{
 "https://example.com/cprNumberIdentifier": "2511221865",
 "nickname": "Severin Poulsen",
 "name": "Severin Poulsen",
 "birthdate": "1922-11-25",
 "iat": 1682322427,
 "exp": 1682358427
}

Oppsummering

Vi har nå utforsket to tilnærminger for å legge til et eID-krav i Auth0.

Vi håper denne veiledningen er nyttig for utviklere som implementerer eksterne identitetsleverandørers kravtilordning i Auth0.

Har du spørsmål eller trenger mer veiledning om tilordning av Idura-krav til Auth0 og tilgang til brukerdata utover standard profilinformasjon? Ikke nøl med å ta kontakt med oss via vår tekniske supportkanal på Slack eller via e-post! Vi ser frem til å støtte deg på utviklingsreisen din.