All guides
IntermediateSelf-pacedFree GuideSection 42/95

APIs — Authentification et sécurité

Practise development foundations: programming, web, APIs, data and AI tools. Work through sections and exercises to build your first projects.

The full lessons for this course are currently available in French. Use the section menu to navigate the French course.

💡

Free content, available without an account. Tools and models change: use the current model guide to check their versions. Models and sources

Section 11.3.3 : APIs — Authentification et sécurité

🎯 Objectif pédagogique

Comprendre les méthodes d'authentification des APIs (clés API, OAuth 2.0, JWT) et les bonnes pratiques de sécurité. Vous serez capable de vous authentifier correctement sur n'importe quelle API et de protéger vos credentials.


Pourquoi l'authentification ?

Sans authentification, n'importe qui pourrait lire, modifier ou supprimer les données de n'importe quel utilisateur. L'authentification répond à deux questions : qui êtes-vous ? (authentication) et avez-vous le droit ? (authorization).

Les 3 méthodes principales

1. Clé API (API Key) — Le plus simple

import requests

# Dans l'URL (déconseillé — visible dans les logs)
response = requests.get("https://api.example.com/data?api_key=sk_live_abc123")

# Dans le header (recommandé)
response = requests.get(
    "https://api.example.com/data",
    headers=\{"X-API-Key": "sk_live_abc123"\}
)
AvantageInconvénient
Simple à utiliserPas de gestion fine des permissions
Pas d'expiration (sauf config)Si volée → accès total
Idéal pour les APIs serveur-à-serveurPas pour les apps client

2. OAuth 2.0 — Le standard pour les utilisateurs

# Le flux OAuth 2.0 simplifié :
# 1. L'app redirige vers le provider (Google, GitHub)
# 2. L'utilisateur se connecte et autorise
# 3. Le provider retourne un "authorization code"
# 4. L'app échange le code contre un "access token"
# 5. L'app utilise le token pour accéder à l'API

# Avec un access token obtenu
response = requests.get(
    "https://api.github.com/user",
    headers=\{"Authorization": "Bearer ghp_xxxxxxxxxxxxxxxxxxxx"\}
)
user = response.json()
print(f"Connecté : \{user['login']\}")

3. JWT (JSON Web Token) — L'identité portable

# Un JWT contient 3 parties séparées par des points :
# header.payload.signature

# header:  \{"alg": "HS256", "typ": "JWT"\}  → algorithme de signature
# payload: \{"user_id": 1, "exp": 1735689600\}  → données + expiration
# signature: HMAC(header + payload, secret)  → preuve d'authenticité

# Utilisation
response = requests.get(
    "https://api.jobtracker.com/applications",
    headers=\{"Authorization": "Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.xxx"\}
)

Protéger ses credentials

# ❌ JAMAIS dans le code
api_key = "sk_live_abc123def456"  # Visible dans Git !

# ✅ Variables d'environnement
import os
from dotenv import load_dotenv

load_dotenv()  # Charge .env

api_key = os.getenv("API_KEY")
db_url = os.getenv("DATABASE_URL")
# Fichier .env (JAMAIS commité !)
API_KEY=sk_live_abc123def456
DATABASE_URL=postgresql://user:pass@host:5432/db
OPENAI_API_KEY=sk-...
# .gitignore — ajoutez TOUJOURS
.env
.env.local
.env.production
*.key
*.pem

Le cauchemar du secret commité

En 2024, 12,8 millions de secrets (clés API, mots de passe) ont été détectés dans les repos GitHub publics (GitGuardian). En moyenne, un secret exposé est exploité en moins de 5 minutes. Marc a failli publier sa clé OpenAI — 500€ de requêtes en 2 heures avant de la révoquer.

Rate limiting — Respecter les limites

import requests
import time

def api_call_with_retry(url, headers, max_retries=3):
    """Appel API avec gestion du rate limiting."""
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers)
        
        if response.status_code == 200:
            return response.json()
        
        if response.status_code == 429:  # Too Many Requests
            retry_after = int(response.headers.get('Retry-After', 60))
            print(f"Rate limited. Attente \{retry_after\}s...")
            time.sleep(retry_after)
            continue
        
        response.raise_for_status()
    
    raise Exception(f"Échec après \{max_retries\} tentatives")

🏋️ Exercice pratique (15 minutes)

  1. →Créez un fichier .env avec une clé API fictive
  2. →Écrivez un script qui la charge avec python-dotenv
  3. →Faites un appel API authentifié (utilisez Open Meteo qui ne nécessite pas de clé)
  4. →Ajoutez la gestion du rate limiting
Quick Check

Pourquoi ne faut-il JAMAIS mettre une clé API directement dans le code source ?

Quick Check

Quelle est la différence entre OAuth 2.0 et une simple clé API ?

Your progress

Progress is self-reported and stored in your browser. The final completion record is not a qualification or an independent assessment.

View progress and completion record

Learn AI, from prompts to agents

15 free guidesQuizzes, diagrams and workshopsNo account needed

One practical AI workflow in your inbox

Methods, resources and new exercises. Free, unsubscribe at any time.