Authenticatie: API-keys en OAuth
Bearer-tokens, headers met API-keys en OAuth2-flows voor API-toegang door agents.
Authenticatie: API-keys en OAuth is een gratis AI-agenten-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI-agenten. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI-agenten bevat in totaal 4 lessen.
Waarom authenticatie belangrijk is voor agents
Wanneer je agent een externe API aanroept, moet de server weten wie de aanvraag doet. Authenticatie bewijst je identiteit; autorisatie bepaalt wat je mag doen. Zonder juiste authenticatie retourneert elke aanvraag 401 Unauthorized en kan je agent niets doen.
Twee patronen overheersen bij de ontwikkeling van agents: API-sleutels en OAuth 2.0.
import requests
# Without auth — will get 401
response = requests.get('https://api.openai.com/v1/models')
print(response.status_code) # 401 Unauthorized
# With API key in header — works
headers = {'Authorization': 'Bearer sk-proj-abc123'}
response = requests.get(
'https://api.openai.com/v1/models',
headers=headers
)
print(response.status_code) # 200API-sleutel in Authorization-header
Het meest gebruikte patroon is je API-sleutel als Bearer-token mee te sturen in de header Authorization. Het woord "Bearer" geeft aan dat degene die deze token bezit, geautoriseerd is — de server vertrouwt op de houder van de sleutel.
OpenAI, Anthropic, GitHub en de meeste moderne API's gebruiken dit.
import requests
import os
api_key = os.environ['OPENAI_API_KEY']
response = requests.post(
'https://api.openai.com/v1/chat/completions',
headers={
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
},
json={
'model': 'gpt-4o-mini',
'messages': [{'role': 'user', 'content': 'Hello!'}]
}
)
print(response.json()['choices'][0]['message']['content'])API-sleutel in aangepaste header (X-API-Key)
Sommige API's — vooral oudere of interne — gebruiken een aangepaste header zoals X-API-Key in plaats van Authorization: Bearer. Het patroon is hetzelfde, alleen de naam van de header verschilt. Controleer altijd de API-documentatie voor de exacte headernaam die wordt verwacht.
import requests
import os
api_key = os.environ['SERVICE_API_KEY']
response = requests.get(
'https://api.someservice.com/v1/data',
headers={
'X-API-Key': api_key,
'Accept': 'application/json'
}
)
if response.status_code == 200:
data = response.json()
print('Got data:', data)
elif response.status_code == 401:
print('Invalid API key — check X-API-Key header')Inloggegevens opslaan in omgevingsvariabelen
Zet API-sleutels nooit rechtstreeks in je broncode. Als je een sleutel naar een openbare repository pusht, vinden bots deze binnen enkele seconden en maken ze er misbruik van. De juiste aanpak is om inloggegevens op te slaan in omgevingsvariabelen en ze tijdens runtime te lezen met os.environ.
Gebruik os.environ.get() met een duidelijke foutmelding als de sleutel ontbreekt.
import os
os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789' # simulate a set env var
api_key = os.environ.get('OPENAI_API_KEY')
if not api_key:
raise EnvironmentError(
'OPENAI_API_KEY environment variable not set. '
'Run: export OPENAI_API_KEY=your-key-here'
)
print('API key loaded from environment (never hard-code it in source)')python-dotenv gebruiken voor lokale ontwikkeling
Bewaar je sleutels tijdens de ontwikkeling in een .env-bestand in de hoofdmap van je project. Gebruik de library python-dotenv om ze automatisch te laden. Voeg .env toe aan je .gitignore, zodat het bestand nooit wordt vastgelegd.
# .env file (never commit this!)
# OPENAI_API_KEY=sk-proj-abc123
# ANTHROPIC_API_KEY=sk-ant-xyz456
# GITHUB_TOKEN=ghp_abc789
# In your Python code:
from dotenv import load_dotenv
import os
load_dotenv() # loads .env into os.environ
openai_key = os.environ['OPENAI_API_KEY']
anthropic_key = os.environ['ANTHROPIC_API_KEY']
github_token = os.environ['GITHUB_TOKEN']
print('Keys loaded successfully')Wat is OAuth 2.0?
OAuth 2.0 is een standaard voor gedelegeerde autorisatie. In plaats van het wachtwoord van een gebruiker aan je agent te geven, laat OAuth de gebruiker je agent toestemming geven om namens die gebruiker te handelen, met een beperkte reikwijdte en een beperkt tijdsvenster. Google, GitHub, Slack en Salesforce gebruiken dit.
Het belangrijkste concept: je agent krijgt na een autorisatiestroom een access token en gebruikt die token vervolgens voor API-aanroepen.
# OAuth flow overview:
#
# 1. Agent redirects user to:
# https://auth.provider.com/oauth/authorize
# ?client_id=YOUR_CLIENT_ID
# &redirect_uri=http://localhost:8080/callback
# &scope=read:repo%20write:issues
# &response_type=code
#
# 2. User logs in and grants permission
# 3. Provider redirects to your callback with ?code=AUTH_CODE
# 4. Agent exchanges code for access_token
# 5. Agent uses access_token for API calls
print('OAuth flow: authorize -> code -> token -> API calls')OAuth2-clientgegevensstroom
De clientgegevensstroom is de eenvoudigste OAuth-stroom voor agents — er is geen interactie met de gebruiker nodig. Je agent authenticeert zich met zijn eigen client-ID en geheim om een token te verkrijgen. Dit wordt gebruikt voor machine-tot-machinecommunicatie (M2M).
Je POST je gegevens naar het tokenendpoint en ontvangt een kortlevend toegangstoken.
import requests
import os
client_id = os.environ['OAUTH_CLIENT_ID']
client_secret = os.environ['OAUTH_CLIENT_SECRET']
token_url = 'https://auth.example.com/oauth/token'
# Request an access token
response = requests.post(token_url, data={
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
'scope': 'read:data write:tasks'
})
token_data = response.json()
access_token = token_data['access_token']
expires_in = token_data['expires_in'] # seconds
print(f'Token valid for {expires_in}s')OAuth-tokens gebruiken in API-aanroepen
Zodra je een OAuth-toegangstoken hebt, gebruik je het precies zoals een API-sleutel — in de Authorization: Bearer-header. Het verschil is dat OAuth-tokens verlopen, dus je agent moet het token vernieuwen voordat hij aanroepen doet.
import requests
import os
import time
class OAuthClient:
def __init__(self, client_id, client_secret, token_url):
self.client_id = client_id
self.client_secret = client_secret
self.token_url = token_url
self.access_token = None
self.token_expiry = 0
def get_token(self):
if time.time() < self.token_expiry - 60: # 60s buffer
return self.access_token
r = requests.post(self.token_url, data={
'grant_type': 'client_credentials',
'client_id': self.client_id,
'client_secret': self.client_secret
})
data = r.json()
self.access_token = data['access_token']
self.token_expiry = time.time() + data['expires_in']
return self.access_token
def get(self, url):
token = self.get_token()
return requests.get(url, headers={'Authorization': f'Bearer {token}'})OAuth 2.0 met de google-auth-bibliotheek
Voor Google-API's handelt de google-auth-bibliotheek alle OAuth-complexiteit voor je af. De bibliotheek vernieuwt tokens automatisch, leest gegevens uit een JSON-bestand en voegt tokens via een AuthorizedSession toe aan aanvragen.
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
# Load service account credentials from JSON file
credentials = service_account.Credentials.from_service_account_file(
'service-account.json',
scopes=[
'https://www.googleapis.com/auth/gmail.readonly',
'https://www.googleapis.com/auth/calendar.events'
]
)
# AuthorizedSession auto-refreshes tokens
session = AuthorizedSession(credentials)
response = session.get(
'https://www.googleapis.com/gmail/v1/users/me/messages'
)
print(response.json())Beste beveiligingspraktijken voor API-sleutels
Het beveiligen van API-sleutels is cruciaal voor de beveiliging van agents. Volg deze regels:
- Bewaar sleutels in omgevingsvariabelen of een geheimenbeheerder (AWS Secrets Manager, HashiCorp Vault)
- Log sleutels nooit — maskeer ze in de uitvoer
- Vernieuw sleutels regelmatig en trek gecompromitteerde sleutels onmiddellijk in
- Gebruik het principe van minimale bevoegdheden — vraag alleen de machtigingen aan die je agent nodig heeft
- Stel IP-toelatingslijsten in voor API-sleutels wanneer de aanbieder dit ondersteunt
import os
os.environ['OPENAI_API_KEY'] = 'sk-proj-abc123xyz789'
def get_key(env_var):
key = os.environ.get(env_var)
if not key:
raise EnvironmentError(f'Missing required env var: {env_var}')
return key
def mask_key(key):
if len(key) < 8:
return '***'
return key[:4] + '...' + key[-4:]
api_key = get_key('OPENAI_API_KEY')
print(f'Using key: {mask_key(api_key)}')401 Unauthorized in je agent afhandelen
Wanneer een agent een 401 Unauthorized-antwoord krijgt, mag hij nooit blindelings opnieuw proberen — dat verspilt aanvraagquota. Controleer in plaats daarvan of het token is verlopen (probeer het te vernieuwen) of dat de sleutel zelf ongeldig is (waarschuw onmiddellijk zodat iemand dit kan herstellen).
import requests
import os
def call_api_with_auth_check(url, api_key):
response = requests.get(
url,
headers={'Authorization': f'Bearer {api_key}'}
)
if response.status_code == 401:
error = response.json().get('error', {})
code = error.get('code', 'unknown')
if code == 'token_expired':
print('Token expired — refresh needed')
# trigger token refresh flow
else:
raise PermissionError(
f'API key rejected: {error.get("message", "401 Unauthorized")}'
)
response.raise_for_status()
return response.json()Korte controle: opslag van API-sleutels
Toets je begrip van het beheer van aanmeldgegevens.
Samenvatting van authenticatie
Je hebt de twee belangrijkste authenticatiepatronen voor agents geleerd:
- API-sleutels — doorgegeven in de
Authorization: Bearer TOKEN- ofX-API-Key-header; eenvoudig en toestandsloos - OAuth 2.0 — clientgegevensstroom voor M2M; tokens verlopen en moeten worden vernieuwd
- Bewaar sleutels altijd in omgevingsvariabelen, nooit in broncode
- Gebruik lokaal python-dotenv; gebruik in productie omgevingsvariabelen of geheimenbeheerders
- Handel 401-antwoorden af door te controleren of het token is verlopen of de sleutel ongeldig is
Een degelijke afhandeling van authenticatie is de basis van elke betrouwbare agent.
Leer AI-agenten met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 60
- Lessen
- 239
Veelgestelde vragen
Is de les “Authenticatie: API-keys en OAuth” gratis?
Ja — de volledige tekst van “Authenticatie: API-keys en OAuth” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus AI-agenten wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus AI-agenten bevat in totaal 4 lessen.
Wat leer ik in “Authenticatie: API-keys en OAuth”?
Bearer-tokens, headers met API-keys en OAuth2-flows voor API-toegang door agents. Je oefent met AI-agenten door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met AI-agenten te beginnen?
Ervaring vooraf is niet nodig. AI-agenten op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Authenticatie: API-keys en OAuth”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over AI-agenten?
Ja. Elke les over AI-agenten bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- REST API-basis voor agentontwikkelaars
- Authenticatie: API-keys en OAuth
- API-responses en fouten afhandelen
- Rate limiting en retry-logica