En API-nøgle er en streng, du sender med i hvert kald, så modtageren kan se, hvem der kalder. Google formulerer forskellen kort: API keys identify the calling project, authentication tokens identify a user. Nøglen fortæller altså, hvilket system der ringer på. Den fortæller intet om, hvilket menneske der sidder bag.
Hvad en nøgle ikke kan
API-nøgler kan ikke identificere individuelle brugere, og de betragtes generelt ikke som sikre, fordi de typisk er tilgængelige for klienten. Ligger nøglen i JavaScript i browseren eller i en mobilapp, kan den findes. Så er den ikke længere en hemmelighed, men et offentligt tal.
Det værste ved en stjålet nøgle er ikke tyveriet. Det er varigheden. En API-nøgle har ingen udløbstid. Den virker, indtil ejeren opdager problemet og tilbagekalder den. Sker det ikke, virker den om et år.
Derfor er der to ting, der betaler sig, længe før noget går galt. Hold nøglen på serveren og læg den i en miljøvariabel i stedet for i kildekoden, så den ikke følger med, når koden bliver delt. Og sørg for, at der findes mere end én nøgle, så en udskiftning kan ske uden nedetid.
Client credentials i stedet
RFC 6749 § 4.4 beskriver alternativet. Klienten autentificerer sig med client_id og client_secret hos authorization serveren og får et kortlivet access token tilbage. Det er tokenet, der bliver sendt med de efterfølgende kald.
Forskellen i praksis:
- API-nøgle. Én langlivet, statisk hemmelighed, som sendes med hvert eneste kald og dermed eksponeres hele tiden.
- Client credentials. Den langlivede hemmelighed veksles til et kortlivet token. Det er tokenet, der bliver eksponeret, der følger scopes med, og det udløber af sig selv.
Læs mere om rammen i OAuth 2.0.
Nøglen er ikke et bevis på en person
Det er her, det går galt i integrationer omkring identitet. En korrekt API-nøgle betyder, at kaldet kommer fra et system, der kender nøglen. Den betyder ikke, at brugeren er den, systemet påstår.
Har du et endpoint, der siger "denne kunde er over 18", og det eneste, der beskytter det, er en API-nøgle, så flytter du hele tilliden over på den ene streng. Ved aldersverifikation og KYC skal svaret kunne føres tilbage til et faktisk tjek af personen, ikke til en hemmelighed i en konfigurationsfil. Nøglen afgør, hvem der må spørge. Den afgør ikke, hvad svaret er.