Gå til hovedinnhold

Autentisering

All bruk av FS GraphQL API krever autentisering, selv om man bare skal hente offentlige data.

Vi støtter tre hovedtyper av autentisering:

TypeBeskrivelseBruksområde
Basic authEnkel system-til-system autentiseringKlassiske integrasjoner hvor en applikasjon henter data på vegne av institusjonen
Feide (OIDC)Moderne brukerautentiseringApplikasjoner hvor en sluttbruker logger inn og handler på egne vegne
Feide (OAuth2)Moderne system-til-system-autentiseringAutomatiserte prosesser og integrasjoner uten sluttbruker som ønsker sikker, moderne autentisering

Anbefalinger

Vi anbefaler at så mange som mulig benytter seg av moderne autentisering med Feide hvor sluttbrukeren blir en del av autentiseringsflyten. Dette gjør det mulig for APIene våre å opprettholde høy datasikkerhet, siden vi kan kontrollere tilgang basert på hvem brukeren er.

Basic auth egner seg best for:

  • Batch-jobber og automatiserte prosesser
  • Integrasjoner som ikke har en sluttbruker involvert
  • Enkel testing og utvikling

Hvordan får jeg tilgang?

Før du kan autentisere deg mot API-et, må du ha fått tildelt tilgang. Prosessen er forskjellig avhengig av om du skal bruke basic auth eller Feide.

Oversikt over tilgangsprosessen

AutentiseringsmetodeHvem kan gi tilgangSelvbetjent?
Basic authFS-institusjonen (din lokale FS-administrator) eller SiktNei - må bestilles
Feide (OIDC)Feide Kundeportal + godkjenning fra SiktDelvis - se under

For basic auth

  1. Kontakt din FS-institusjon - Alle data i FS eies av institusjonene. Du må derfor først få godkjenning fra institusjonen du ønsker å hente data fra.

  2. Institusjonen bestiller tilgang - Institusjonens FS-kontakt kan:

  3. Motta brukernavn og passord - Når tilgangen er opprettet, får du tildelt brukernavn og passord.

Databehandleravtale

Vi forutsetter at nødvendige databehandleravtaler er inngått mellom deg og institusjonen før tilgang blir bestilt.

For Feide (OIDC)

  1. Registrer din tjeneste i Feide Kundeportal (selvbetjent)

  2. Be om tilgang til datakilden "Felles studentsystem" (krever godkjenning)

    • I Feide Kundeportal, søk om tilgang til datakilden
    • Velg enten "Data for student" eller "Data for ansatt" avhengig av ditt behov
    • Send en epost til kontakt@sikt.no og be om at forespørselen blir godkjent
  3. Vent på godkjenning fra Sikt

    • Vi vurderer søknaden og gir tilbakemelding
    • Ved godkjenning får din tjeneste tilgang til de aktuelle scopene
Trenger du hjelp?

Kontakt kontakt@sikt.no dersom du trenger veiledning om tilgangsprosessen eller har spørsmål om hvilken autentiseringsmetode som passer for ditt behov.


Basic auth

Basic auth er den enkleste måten å autentisere seg mot FS GraphQL API. Du sender brukernavn og passord som en Base64-kodet streng i Authorization-headeren.

Slik bruker du basic auth

  1. Få tildelt brukernavn og passord fra din FS-administrator eller via tilgangsbestilling

  2. Kod brukernavnet og passordet til Base64:

    Base64(<brukernavn>:<passord>)
  3. Send med Authorization-headeren i alle forespørsler:

    POST https://api.fellesstudentsystem.no/graphql/
    Authorization: Basic <Base64-kodet brukernavn:passord>
    Content-Type: application/json

    {"query":"{ __typename }","variables":{}}

Eksempel med curl

curl -X POST https://api.fellesstudentsystem.no/graphql/ \
-H "Authorization: Basic $(echo -n 'brukernavn:passord' | base64)" \
-H "Content-Type: application/json" \
-d '{"query":"{ __typename }"}'

Begrensninger

  • Basic auth gir tilgang basert på hva som er konfigurert for brukeren/integrasjonen
  • Det er ikke mulig å begrense tilgang basert på sluttbruker
  • Passordet må holdes hemmelig og bør ikke eksponeres i klientside-kode

Feide (OIDC)

For applikasjoner hvor en sluttbruker logger inn, anbefaler vi å bruke Feide. Dette gir bedre sikkerhet og gjør det mulig å tilpasse datatilgang basert på hvem brukeren er.

Forutsetninger

For å følge denne oppskriften må du ha fullført tilgangsprosessen for Feide beskrevet over. Du trenger:

  • Client ID og Client Secret fra din tjeneste i Feide Kundeportal
  • Redirect URI after login satt til din callback-URL (f.eks. http://localhost:3000/auth/callback)
  • Godkjent tilgang til datakilden Felles studentsystem

Overordnet flyt

Autentiseringsflyten består av fire steg:

┌─────────────────────────────────────────────────────────────────────────┐
│ 1. Start autentisering → Bruker sendes til Feide │
│ 2. Hent Feide-token → Bytt autorisasjonskode til Feide-token │
│ 3. Hent JWT access token → Bytt Feide-token til JWT for API-bruk │
│ 4. Kall API → Bruk JWT som Bearer-token │
└─────────────────────────────────────────────────────────────────────────┘
Bruk et bibliotek

Vi anbefaler å bruke et etablert OIDC-bibliotek for ditt programmeringsspråk. Det du implementerer er authorization code grant. For frontend-klienter (SPA, mobilapper o.l.) bør du bruke PKCE i tillegg. Backend-klienter som kan holde på en client secret trenger ikke PKCE. De fleste biblioteker håndterer steg 1 og 2 automatisk.

Steg 1: Start autentiseringsflyten

Send brukeren til Feides autentiseringsendepunkt. Dette gjøres typisk ved å returnere en HTTP 302-redirect fra din backend.

https://auth.dataporten.no/oauth/authorization?
client_id=<Client ID>&
redirect_uri=<Redirect URI after login>&
scope=openid&
response_type=code&
state=<Tilfeldig verdi>

Parametere:

ParameterBeskrivelse
client_idDin Client ID fra Feide Kundeportal
redirect_uriURL-encoded callback-URL
scopeopenid for OpenID Connect. Kan inkludere flere scopes separert med mellomrom
response_typecode for authorization code-flyten
stateEn tilfeldig verdi du genererer for å beskytte mot CSRF-angrep

Scopes for FS GraphQL API:

For å få tilgang til FS-data via token exchange, inkluder relevante scopes:

  • gk_07d5b019-57c4-4e9b-89c7-3c63baea0f99_student - for studentdata
  • gk_07d5b019-57c4-4e9b-89c7-3c63baea0f99_ansatt - for ansattdata

07d5b019-57c4-4e9b-89c7-3c63baea0f99 er identifikatoren for datakilden FS GraphQL API.

Se Feide-dokumentasjonen for mer informasjon.

Steg 2: Bytt autorisasjonskode til Feide-token

Etter vellykket pålogging blir brukeren sendt tilbake til din redirect_uri:

http://localhost:3000/auth/callback?
code=29e9cbb4-1c76-4323-bd72-15ba6cb4120a&
state=<din state-verdi>

Viktig: Verifiser at state stemmer med verdien du sendte i steg 1.

Bytt code til et Feide-token:

POST https://auth.dataporten.no/oauth/token
Authorization: Basic <Base64 av Client ID:Client Secret>
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&
code=29e9cbb4-1c76-4323-bd72-15ba6cb4120a&
client_id=<Client ID>&
redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Fcallback

Respons:

{
"access_token": "c1219f4f-788f-47d6-aa57-c1516074ebef",
"token_type": "Bearer",
"expires_in": 28799,
"scope": "openid userid ...",
"id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSU..."
}
Feide-tokenet er ikke for API-bruk

access_token fra dette steget skal kun brukes mot Feide. Du må utføre en token exchange (steg 3) for å få et token som kan brukes mot FS GraphQL API.

Steg 3: Bytt Feide-token til JWT access token

Utfør en token exchange for å få et JWT som kan brukes mot FS GraphQL API:

POST https://auth.dataporten.no/oauth/token
Content-Type: application/x-www-form-urlencoded

audience=https://n.feide.no/datasources/<datakilde-UUID>&
client_id=<Client ID>&
client_secret=<Client Secret>&
grant_type=urn:ietf:params:oauth:grant-type:token-exchange&
scope=&
subject_token=<Feide access_token fra steg 2>&
subject_token_type=urn:ietf:params:oauth:token-type:access_token

Parametere:

ParameterBeskrivelse
audienceURL til datakilden du vil ha tilgang til
grant_typeurn:ietf:params:oauth:grant-type:token-exchange
subject_tokenFeide access_token fra steg 2
scopeLa være tom for å få alle scopes, eller spesifiser ønskede scopes

Respons:

{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsI...",
"token_type": "Bearer",
"issued_token_type": "urn:ietf:params:oauth:token-type:jwt",
"expires_in": 299,
"scope": "open student"
}
Kort levetid på JWT

JWT-tokenet har kun 5 minutters levetid (expires_in: 299). Dette er en sikkerhetsmekanisme siden JWT-tokens ikke kan tilbakekalles. Din applikasjon må hente nye tokens ved behov.

Se Feide-dokumentasjonen om token exchange for mer informasjon.

Steg 4: Kall FS GraphQL API

Nå kan du sende forespørsler til FS GraphQL API med JWT-tokenet:

POST https://api.fellesstudentsystem.no/graphql/
Authorization: Bearer <JWT access_token fra steg 3>
Content-Type: application/json

{"query":"{ __typename }","variables":{}}

Feilhåndtering

HTTP-statusBetydning
401 UnauthorizedTokenet er ugyldig (utgått, feil format, ugyldig signatur)
403 ForbiddenTokenet har ikke riktige tilganger (feil audience eller manglende scopes)

Når tokenet utløper

Siden JWT-tokenet har kort levetid, må du håndtere fornyelse:

  1. Hvis Feide-tokenet fortsatt er gyldig: Gjenta steg 3
  2. Hvis Feide-tokenet er utgått: Gjenta fra steg 1
Refresh tokens

Feide støtter ikke refresh tokens direkte. Du må i stedet bruke token exchange-mekanismen beskrevet over for å hente nye JWT-tokens.

Oppsummering av flyten

┌──────────────────────────────────────────────────────────────────────────┐
│ Din applikasjon │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. Redirect bruker til Feide ──────────────────► Feide │
│ │ │
│ 2. Motta callback med code ◄──────────────────────┘ │
│ │
│ 3. POST /oauth/token ──────────────────► Feide │
│ (authorization_code) │ │
│ Motta Feide access_token ◄──────────────────────┘ │
│ │
│ 4. POST /oauth/token ──────────────────► Feide │
│ (token-exchange) │ │
│ Motta JWT access_token ◄──────────────────────┘ │
│ │
│ 5. POST /graphql ──────────────────► FS GraphQL API │
│ Authorization: Bearer JWT │ │
│ Motta GraphQL-respons ◄──────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────┘

Nyttige lenker