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​

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​

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​