Skydda en funktion med en token
Kräv en åtkomsttoken från OpenID Connect på en funktions HTTP-anrop, vad plattformen kontrollerar, och hur du anropar och testar en skyddad funktion.
Kräver: functions/write
En funktion med autentisering påslagen tar bara emot ett HTTP-anrop när det har en giltig
åtkomsttoken från den identitetsleverantör du anger. För att ändra inställningen behöver du
functions/write. Timerfunktioner påverkas inte: de har ingen publik rutt.
Slå på den
- Öppna funktionen och dess flik Konfiguration, avsnittet Autentisering.
- Slå på Enable JWT Authentication.
- Issuer URL — utfärdaren exakt som den står i tokenernas anspråk
iss. För plattformens egen identitetsleverantör är dethttps://auth.example.com/realms/stackship, utan snedstreck på slutet. - Audience — valfri. När du anger den måste en tokens anspråk
audinnehålla den. Tokener från plattformens identitetsleverantör bärstackship-kubernetes-client. - Välj Save. Funktionen driftsätts om med den nya inställningen.
Varning
Med autentisering påslagen och Issuer URL tom avvisas varje anrop med
401: funktionen stänger hellre än betjänar vem som helst.
Vad som kontrolleras
Namnutrymmets proxy kontrollerar varje anrop innan det når funktionen, och funktionens körmiljö kontrollerar det igen. En token godtas när:
- den skickas i huvudet
Authorization: Bearer <token>; - dess signatur verifieras med en av utfärdarens nycklar, som plattformen hittar via
<issuer>/.well-known/openid-configuration— så utfärdaren måste gå att nå från klustret; - den är signerad med en asymmetrisk algoritm (RSA, RSA-PSS eller ECDSA med SHA-256, SHA-384 eller SHA-512); osignerade och HMAC-signerade tokener avvisas;
- dess
issär lika med Issuer URL och den har enexpsom inte har passerat, med 60 sekunders marginal; ennbf, om den finns, måste också ha passerat; - dess
audinnehåller Audience, när en sådan är angiven.
Alla andra anrop besvaras med 401. Token bevisar bara vem som anropar; vad anroparen får göra
avgör din kod.
Viktigt
Proxyn kontrollerar inte tokener på sökvägar som börjar med
/_api,/healthzeller/readyz. En funktion vars rutt börjar med någon av dem, till exempel/healthzone, kontrolleras bara av sin körmiljö, och en egen avbild bara om den själv kontrollerar token. Arbetslaster i boundaryn kan också anropa en funktion direkt inuti klustret, utan att passera proxyn. Funktioner som byggs från portalen kontrollerar token på båda ställena; en egen avbild måste kontrollera den själv — se Vad avbilden måste göra.
Anropa en skyddad funktion
Ett skript eller en pipeline kan logga in som ett tjänstekonto — se Autentisera — och skicka sin token till funktionen:
TOKEN=$(curl -s https://auth.example.com/realms/stackship/protocol/openid-connect/token \
-d grant_type=client_credentials \
-d client_id="$CLIENT_ID" \
-d client_secret="$CLIENT_SECRET" | jq -r .access_token)
curl -H "Authorization: Bearer $TOKEN" "https://my-namespace.fn.apps.example.com/hello"Samma anrop utan huvudet svarar 401, vilket är ett snabbt sätt att kontrollera att funktionen är
skyddad.
Vem som anropar
När ett anrop godtas skickar proxyn vidare anroparen till funktionen i förfrågans huvuden:
| Huvud | Från anspråket |
|---|---|
X-Stackship-User-Id |
sub |
X-Stackship-User-Email |
email |
X-Stackship-User-Groups |
groups, separerade med kommatecken |
Ett huvud utelämnas när token saknar anspråket. Proxyn tar först bort de här huvudena från varje
inkommande förfrågan, på alla funktioner, så att en anropare inte kan sätta dem själv i ett anrop
genom proxyn. Ett anrop som görs direkt inuti klustret passerar inte proxyn — se
Vad som kontrolleras. I en Node.js-hanterare innehåller ctx.user anspråken i
den token som körmiljön själv har verifierat.
Namnutrymmets standardvärden
Namnutrymmets Konfiguration → Autentisering har Tvinga autentisering, Standard autentisering aktiverad, Utfärdare-URL och Publik. Ingen av dem påverkar namnutrymmets funktioner i dag:
- Tvinga autentisering sparas inte.
- De andra inställningarna sparas, men varje funktion har sin egen autentiseringsinställning, och den är avslagen när funktionen skapas.
Slå på autentisering för varje funktion som behöver det.