Test av Sbankens APIer

For noen uker siden tok jeg meg endelig tid til å skaffe datteren (14) min et ungdomskort fra Sbanken. Kortet kom med posten veldig raskt men vi oppdaget fort at det var noe hun savnet. Hun manglet oversikt over hvor mye penger hun hadde på kortet.

Etter litt søk på nett fant jeg ut at Sbanken har Minibank appen som løser nettopp dette problemet – men tjenesten er kun tilgjengelig på Android. Sbanken har satt opp en venteliste hvor man kan melde sin interesse for iOS – som jeg har fylt ut. Vanligvis så er det her det stopper opp – vi smører oss med tålmodighet og venter på at tjenesten lanseres.

Men i disse «Open Banking»-tider så er det kanskje ikke slutten på historien likevel. Sbanken har nemlig lansert en utviklerportal som man får tilgang til hvis man melder seg som bruker av Beta-banken. Slik kan man som kunde i Sbanken bygge og skreddersy egne banktjenester. Formålet? I følge Sbanken selv:

«Vi ønsker å stimulere til mer innovasjon gjennom å gi kunder muligheten til å bygge egne applikasjoner som benytter tilgang til utvalgte av APIene våre for å hente ut informasjon om sitt eget engasjement»

I dette innlegget vil jeg gå gjennom prosessen fra et teknisk ståsted hvor jeg tok i bruk Sbankens APIer for å utvikle en ny tjeneste som letter hverdagen til datteren min.

App-registrering
Først så trenger man tilgang til Sbanken Beta – noe man får man via «Mine innstillinger» i nettbanken. Når man har gjort det så får man opp en lenke til utviklerportalen.

Her må man registrere en app for å få tilgang til APIer fra klienten. Det er en enkel prosess hvor man velger et navn og en beskrivelse og huker av hvilke API tilganger man vil ha. Det viktige er at når dette er registrert så får man en applikasjonsnøkkel (client ID).

Når det er gjort så kan man registrere et passord (client secret). Merk at man bør ta en kopi av dette – man får ikke hentet det ut igjen senere (men man kan alltid lage et nytt).

Så nå har vi de to tingene vi trenger til å snakke til banken via Sbanken sitt API.

Tilgang
Alle kall mot et API må ha en tilgangsnøkkel (access token). Dette er derfor første steg.

I skrivende stund så får man det ved å sende en POST til https://auth.sbanken.no/identityserver/connect/token

Her må man ha med følgende http headers:
Content-type: application/x-www-form-urlencoded; charset=utf-8
Accept: application/json
Authorization: Basic AUTHSTRING
Og innhold:
grant_type=client_credentials
Men hva er AUTHSTRING? Det er base64 versjon av “client ID:client secret”
Svar til POST skal være en JSON melding som ser nogenlunde slik ut:
{
    "access_token":"ACCESS_TOKEN",
    "expires_in":3600,
    "token_type":"Bearer"
}

Dette access_token er da det man trenger for alle kall videre, og er gyldig fra nå og expires_in sekunder framover. Etter det må man sende et ny kall for et nytt token.

API

Dokumentasjon
Sbanken har dokumenterte API med bruk av swagger:

«Kunde API» forteller deg litt om deg selv – mens «Bank API» er inndelt i fire kategorier – konto, eFaktura, transaksjoner og overføringer.

I tillegg så har de et sett med eksempler på github.

For datteren min så skal jeg bruke et par av APIene fra «Bank API» for å hente informasjonen hun trenger – kontoinformasjon og siste 10 transaksjoner.

For alle kallene nedenfor så må man ha følgende http headers:

customerId: CUSTOMER_ID
Authorization: Bearer ACCESS_TOKEN
Accept: application/json

Hvor ACCESS_TOKEN er det vi fikk fra identityserver og CUSTOMER_ID er fødselsnummeret ditt (11 siffer).

Konto
Først så trenger jeg å vite hva den interne ID til kontoen hennes er.

Man kan hente ned oversikt over alle konti ved å sende en GET til https://api.sbanken.no/bank/api/v1/accounts/

Gitt at man har med riktig http headers så skal man få en JSON melding med bl.a. en liste over konti (under items key)

En konto ser slik ut:

{
    "accountId":"INTERNAL_ACCOUNT_ID",
    "accountNumber":"BANK_ACCOUNT_NUMBER",
    "ownerCustomerId":"YOUR_SSN",
    "name":"ACCOUNT_NAME",
    "accountType":"Standard account",
    "available":999.999,
    "balance":999.999,
    "creditLimit":0.000
}
  • BANK_ACCOUNT_NUMBER er det vanlige 11 siffer kontonummeret man er vant til fra banken
  • INTERNAL_ACCOUNT_ID er den interne ID man trenger videre
  • ACCOUNT_NAME er navnet du har gitt kontoen i nettbanken

Bare en konto
For et barn  som skal ha informasjon om sin egen konto så trenger man ikke hente ned hele listen hver gang. Man kan be om en enkel konto.

Det er nesten det samme som å be om hele listen – det er egentlig bare to forskjeller man må tenke på

  • Man endrer GET kallet ved å legge på INTERNAL_ACCOUNT_ID slik: https://api.sbanken.no/bank/api/v1/accounts/INTERNAL_ACCOUNT_ID
  • JSON meldingen man får tilbake har nå kun den ene konto under item key istedenfor alle under items key.

Siste 10 transaksjoner
I tillegg til saldo og disponibelt så hadde jeg lyst å vise de siste 10 transaksjoner.

Disse kan hentes ved å sende en GET til https://api.sbanken.no/bank/api/v1/transactions/INTERNAL_ACCOUNT_ID?length=10

Da skal man få en JSON melding med bl.a. en liste over transaksjoner (under items key)

En transaksjon har mye informasjon – men det jeg har brukt er accountingDate, amount and text.

Oppsummering
Som vanlig med de fleste APIer – når man har fått på plass oppsettet med tilgang og så videre – så er det veldig lett å bruke resten.

Man kan lett få oversikt over alle parametere man må sende med og hvordan svaret ser ut via swagger lenkene (Bank/Kunde).

I dette innlegget så har jeg brukt det som gjelder i dag – v1 av hvert endepunkt.

Applikasjonen
Sbanken har laget et iOS bibliotek for å snakke til APIet. Det finnes på github. Det er nok et bra utgangspunkt hvis man skal lage noe ordentlig med APIet, men dette er bare et lite hobbyprosjekt og å bruke noe ferdiglaget – vel – hva er gøy med det?

Det var faktisk veldig enkelt å lage direkte – jeg brukte bare to ting:

  • Jeg har valgt å lagre IDene man bruker og får lastet ned i keychain istedenfor bare vanlig user defaults. Til dette så leste jeg denne posten om keychain og swift og har brukt SwiftKeychainWrapper.
  • Nettverkskall er bare implementert med vanlig bruk av URLRequest og URLSession samt den innebygd JSONSerialization klasse

Resten er bare vanlig iOS app utvikling for å vise data på skjermen.

Konklusjon
Det var overraskende lett å lage en app som dekket hullet i app-tilbudet som banken har. Det tok meg kanskje 4-5 timer å snekre det sammen – og feedbacken fra hele brukebasen (dvs datteren min) er utelukkende positiv (pappa er flink!).

Av Chris Searle, Chief Consultant i Itera chris.searle@itera.no