💻 Développement

oauth2-oidc-advisor

Implémentation d'OAuth2, OpenID Connect, JWT et gestion des tokens pour sécuriser des APIs et applications web.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- oauth2-oidc-advisor --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } oauth2-oidc-advisor -Launch"

🚀 Déjà installé ?

claude "/oauth2-oidc-advisor"

Ou tapez /oauth2-oidc-advisor dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

OAuth2OIDCOpenID ConnectJWTtokenrefresh tokenidentity providerKeycloakAzure ADAuth0

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/dev-skills/oauth2-oidc-advisor ~/.claude/skills/

Source : dev-skills/oauth2-oidc-advisor

📖 Manuel

Conseiller OAuth2 / OIDC

Workflow

  1. Identifier le flow : Authorization Code, Client Credentials, Device Code, etc.
  2. Configurer l'IdP : clients, scopes, claims.
  3. Implémenter : middleware d'authentification, validation de tokens.
  4. Sécuriser : rotation des secrets, expiration, révocation.

Choisir le bon flow OAuth2

FlowUsageClient
Authorization Code + PKCEApps web, SPA, mobilePublic
Client CredentialsService-to-service, APIsConfidentiel
Device CodeIoT, CLI, TVPublic
Refresh TokenRenouvellement silencieuxTous

Ne plus utiliser

Implémentation ASP.NET Core

API protégée par JWT

// Program.cs
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "https://auth.company.com";
        options.Audience = "payment-api";
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.FromSeconds(30),
            ValidIssuers = new[] { "https://auth.company.com" }
        };
    });

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("PaymentAdmin", policy =>
        policy.RequireClaim("role", "payment-admin"));

    options.AddPolicy("ReadPayments", policy =>
        policy.RequireClaim("scope", "payments:read"));
});

Client Credentials (service-to-service)

// Appel entre services avec token machine-to-machine
builder.Services.AddHttpClient("PaymentApi", client =>
{
    client.BaseAddress = new Uri("https://api.company.com");
})
.AddClientCredentialsTokenHandler(options =>
{
    options.Authority = "https://auth.company.com";
    options.ClientId = "order-service";
    options.ClientSecret = configuration["Auth:ClientSecret"];
    options.Scope = "payments:write";
});

Extraction de claims

[Authorize]
[ApiController]
public class PaymentController : ControllerBase
{
    [HttpPost]
    [Authorize(Policy = "PaymentAdmin")]
    public async Task<IActionResult> CreatePayment(CreatePaymentRequest request)
    {
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        var roles = User.FindAll(ClaimTypes.Role).Select(c => c.Value);
        var tenantId = User.FindFirst("tenant_id")?.Value;

        // ...
    }
}

Structure d'un JWT

Header.Payload.Signature

{
  "alg": "RS256",         // Algorithme de signature
  "typ": "JWT",
  "kid": "key-id-123"     // Key ID pour la rotation
}
.
{
  "iss": "https://auth.company.com",   // Issuer
  "sub": "user-123",                    // Subject (user ID)
  "aud": "payment-api",                 // Audience
  "exp": 1700000000,                    // Expiration
  "iat": 1699996400,                    // Issued at
  "scope": "payments:read payments:write",
  "role": "payment-admin",
  "tenant_id": "tenant-abc"
}

Gestion des tokens

TokenDurée de vieStockage
Access Token5-15 minutesMémoire (SPA), cookie HttpOnly (web)
Refresh Token7-30 joursCookie HttpOnly secure, rotation obligatoire
ID Token5-15 minutesMémoire, jamais envoyé à une API

Rotation des refresh tokens

// Chaque utilisation d'un refresh token en génère un nouveau
// L'ancien est invalidé → détection de vol si réutilisé

Bonnes pratiques

À faire

À éviter

Règles