scribejava

đŸ›Ąïž SĂ©curitĂ© AvancĂ©e : DPoP & PAR

ScribeJava v9 intĂšgre les derniers standards de sĂ©curitĂ© de l’IETF pour protĂ©ger vos Ă©changes OAuth 2.0.


🔐 1. DPoP (Demonstrating Proof-of-Possession)

Le DPoP empĂȘche l’utilisation d’un jeton volĂ© en le liant mathĂ©matiquement Ă  une paire de clĂ©s privĂ©e/publique dĂ©tenue par le client.

Mise en Ɠuvre

// 1. Créez un générateur de preuve (fourni dans le module OIDC)
DefaultDPoPProofCreator proofCreator = new DefaultDPoPProofCreator(myKeyPair);

// 2. Configurez le service
OAuth20Service service = new ServiceBuilder(clientId)
    .apiSecret(secret)
    .dpopProofCreator(proofCreator) // Active DPoP pour tous les échanges
    .build(GoogleApi20.instance());

// Les jetons obtenus seront de type 'DPoP' et les requĂȘtes signĂ©es automatiquement.

đŸ›°ïž 2. PAR (Pushed Authorization Requests)

Le PAR (RFC 9126) amĂ©liore la sĂ©curitĂ© en envoyant les paramĂštres d’autorisation directement au serveur via une requĂȘte POST sĂ©curisĂ©e, plutĂŽt que de les faire transiter par l’URL du navigateur.

Mise en Ɠuvre

// ScribeJava gĂšre le PAR automatiquement si l'API le supporte
PushedAuthorizationResponse parResponse = service.pushAuthorizationRequest(new AuthorizationCodeGrant(code));

// Redirigez l'utilisateur vers l'URI fournie par le serveur
String authUrl = parResponse.getRequestUri();

💡 Recommandations

  1. Toujours utiliser PKCE : MĂȘme pour les clients confidentiels (serveur).
  2. Rotation des clés : Changez vos clés DPoP réguliÚrement.
  3. Scopes limités : Ne demandez que le strict nécessaire.

✅ Checklist de SĂ©curitĂ© (Mise en Production)

Avant de déployer votre intégration, vérifiez ces 5 points :

  1. PKCE Activé : Utilisez-vous .pkce(true) dans votre ServiceBuilder ?
  2. HTTPS Uniquement : Vos redirections (callback) et endpoints sont-ils tous en HTTPS ?
  3. Secret protĂ©gĂ© : Votre apiSecret est-il chargĂ© via une variable d’environnement (et non en dur) ?
  4. Validation ID Token : Si vous utilisez OIDC, validez-vous systématiquement le jeton (Signature + iss + aud) ?
  5. DPoP (Si sensible) : Pour les APIs critiques (paiement, santé), avez-vous activé le DPoP pour lier le jeton à votre client ?

4. JWT Secured Authorization Request (JAR) - RFC 9101

Pour empĂȘcher l’altĂ©ration des paramĂštres de la requĂȘte d’autorisation (ex: injection de redirect_uri malveillant), vous pouvez signer la requĂȘte.

Activation

Utilisez JarAuthorizationRequestConverter (du module scribejava-oidc) dans le builder.

// Clé privée pour signer le JWT
JWK signingKey = JWK.parse("{\"kty\":\"RSA\", ...}");

OAuth20Service service = new ServiceBuilder("client-id")
    .apiSecret("secret")
    .callback("https://callback.com")
    // Active JAR : Convertit les params en JWT signé
    .authorizationRequestConverter(
        new JarAuthorizationRequestConverter(
            "client-id", // issuer
            "https://issuer.com", // audience (l'IDP)
            signingKey,
            JWSAlgorithm.RS256
        )
    )
    .build(OidcGoogleApi20.instance());

// L'URL générée contiendra ?client_id=...&request=eyJ...
String url = service.getAuthorizationUrl();

Combinaison avec PAR (Pushed Authorization Requests)

Si vous activez Ă  la fois JAR et PAR, ScribeJava enverra le JWT signĂ© (request) directement au serveur via l’appel API PAR (POST /par). C’est la configuration la plus sĂ©curisĂ©e possible.

// JAR + PAR = Sécurité Maximale
OAuth20Service service = new ServiceBuilder("client-id")
    .authorizationRequestConverter(new JarAuthorizationRequestConverter(...)) // JAR
    .build(GoogleApi20.instance());

// Pousse le JWT signé au serveur
PushedAuthorizationResponse response = service.pushAuthorizationRequestAsync(...).get();

âŹ…ïž Retour Ă  l’accueil