Teknisk integrasjon
Siste steg er å utvikle selve klient-integrasjonen. Dette gjøres typisk av systemleverandøren. For å kalle Toll-API-ene må man
- Hente access-token fra Maskinporten
- Veksle Maskinporten-token til et Toll-token
- Kalle Toll-API med Toll-token
Dette forutsetter at man har et gyldig sertifikat (fra steg 1) og har gjennomført nødvendig onboarding i steg 2.
Scopes
Hvilke(t) scope du skal bruke avhenger av hvilke tjenester du skal ta i bruk, og krever
tildelt tilgang til dette scopet fra Tolletaten. Norske aktører bruker
toll:…-scopene, utenlandske aktører de tilsvarende
toll:eu/…-scopene.
| API / tjeneste | Scope (norsk) | Scope (utenlandsk) |
|---|---|---|
| movement-road-api-v2, movement-road-query-api-v2 | toll:movement/road/v2 | toll:eu/movement/road/v2 |
| movement-air-api, movement-air-query-api | toll:movement/air | toll:eu/movement/air |
| movement-rail-api, movement-rail-query-api | toll:movement/rail | toll:eu/movement/rail |
| movement-maritime-api, movement-maritime-query-api | toll:movement/maritime | toll:eu/movement/maritime |
| movement/presentation, movement/routing | toll:movement/entry | toll:eu/movement/entry |
| Dokumentopplasting | toll:goodsdeclaration/document.write | toll:eu/goodsdeclaration/document.write |
| API for deklarasjonsdata (ikke klart ennå) | toll:declaration.feed | – |
Les mer som scopes i Maskinporten her.
1. Hent access token fra Maskinporten
Norske aktører: se Maskinportens dokumentasjon på hvordan hente ut et access token.
Utenlandske aktører: se Maskinportens dokumentasjon under European eSeals, og følg guiden for europeiske virksomheter.
Den tekniske forskjellen mellom norske og utenlandske aktører
ligger i hvordan klienten identifiseres: en
norsk aktør oppgir en registrert client_id i iss, mens en
utenlandsk aktør identifiseres via eSeal-sertifikatet i x5c
(og iss ignoreres). Resten av JWT-grant-en er lik, bortsett fra at
utenlandske aktører bruker toll:eu/…-scopene.
TIPS:
I tillegg til dokumentasjonen lenket til over har Digdir også publisert et repository på github
(jwt-grant-generator),
som demonstrerer hvordan en kan hente ut
access token fra Digdirs tjenester, deriblant Maskinporten.
Eksempelet gjelder norske virksomheter, men kan tilpasses for utenlandske virksomheter.
Merk at x5c da må utvides til hele sertifikatkjeden.
Oppsett av JWT-grant (oppsummert)
Klienten lager en JWT-grant, signerer den med nøkkelen sin og POST-er den til
/token-endepunktet i Maskinporten. Tabellen viser noen av de viktigste feltene grant-en skal
inneholde, og hva forskjellene er for norske og utenlandske aktører.
| Felt | Norsk | Utenlandsk (eSeal) |
|---|---|---|
Header: x5c |
Sertifikat brukt for å signere JWT-grant (base64-encoded) | Sertifikatet (eSeal) som signerer JWT-grant-en, og hele sertifikatkjeden (base64-encoded) |
aud |
https://maskinporten.no/(test: https://test.maskinporten.no/) |
Samme |
iss |
Registrert client_id (se Samarbeidsportalen) |
Navn på virksomhet og/eller system (Påkrevd, men verdien ignoreres.) |
scope |
toll:… (f.eks. toll:movement/road/v2) |
toll:eu/… (f.eks. toll:eu/movement/road/v2) |
iat / exp |
Påkrevd. exp maks 120 sekunder etter iat |
Samme |
jti |
Anbefalt, unik verdi | Samme |
Den signerte JWT-grant-en sendes som assertion i en form-encoded POST
til Maskinportens /token-endepunkt:
HTTP Request
POST /token Host: maskinporten.no (test: test.maskinporten.no) Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer& assertion=<SIGNERT JWT-GRANT>
-
x5cmå være en array med hele sertifikatkjeden, ikke bare eSeal-et alene. Se Maskinportens egen signeringsnøkkel (x5c-claim) som eksempel. -
Bare scopes som er aktivert for europeiske virksomheter kan brukes. Du kan
teste med
digdir:verksemd.eui alle miljøer, men det gir ikke tilgang til noe (og kan ikke veksles til et Toll-token i steg 2).
Får du feil når du henter token, se Maskinportens feilsøkingsside.
2. Veksle til et Toll-signert access token
Veksle Maskinportens access token til et Toll-signert access token.
HTTP Request
POST /api/access/external/oauth/token Host: api.toll.no (test: api-test.toll.no) Content-Type: application/x-www-form-urlencoded grant_type=token-exchange& subject_token_type=access_token& subject_token=<MASKINPORTEN ACCESS TOKEN>
Eksempel: HTTP Response
{
"issued_token_type": "access_token",
"access_token": "<TOLL ACCESS TOKEN HER>",
"token_type": "Bearer",
"expires_in": 970
}
Tips:
Et Toll-signert access token kan brukes i hele dets levetid, derfor anbefales det å
mellomlagre disse når en kommuniserer med Tolletatens API-er. For en mer sømløs
opplevelse anbefaler vi videre å veksle til et nytt Toll-token før det foregående
utgår (for eksempel ett minutt før).
Feilsøking: en feilmelding som «Not authorized to request scope toll:…» betyr vanligvis at scopet ikke er gitt til deg. Sjekk at:
- du bruker riktig scope (norske virksomheter bruker
toll:…, utenlandsketoll:eu/…); - virksomheten er registrert på Digitoll (se Onboarding);
- integrasjonen i Samarbeidsportalen er komplett og har scopet (gjelder norske virksomheter);
- er du fortsatt usikker, dobbeltsjekk med Tolletaten hvilke scopes du har fått tilgang til.
3. Test tilgang til API-et
Dette eksempelet gjelder for API-et for kjøretøy på vei.
HTTP Request
GET /api/movement/road/v2/test-auth Host: api.toll.no (test: api-test.toll.no) Authorization: Bearer <TOLL ACCESS TOKEN>
Forventet resultat er 200 OK.