authentification OpenID Connect (Keycloak) : flux authorization code, state signé, validation du token ID via JWKS, provisioning automatique des utilisateurs

This commit is contained in:
fabien committed 2026-10-06 22:03:20 +02:00
1 parent 51bbb45b32
commit bedb6c98e7
15 files changed
+1057 -23

No files matched your search

+32
View File
@@ -75,6 +75,38 @@ func (tm *JwtTokenManager) GenerateRefreshToken(userID string) (string, time.Tim
return signed, expiresAt, err
}
// GenerateStateToken crée un JWT court (10 min) utilisé comme paramètre state
// du flux OIDC, porteur d'une donnée arbitraire (ex: l'id du fournisseur).
func (tm *JwtTokenManager) GenerateStateToken(data string) (string, error) {
claims := jwt.RegisteredClaims{
Subject: data,
Issuer: tm.issuer,
ExpiresAt: jwt.NewNumericDate(time.Now().Add(10 * time.Minute)),
IssuedAt: jwt.NewNumericDate(time.Now()),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString(tm.secret)
}
// ParseStateToken vérifie un state généré par GenerateStateToken et retourne
// la donnée qu'il transporte.
func (tm *JwtTokenManager) ParseStateToken(state string) (string, error) {
claims := &jwt.RegisteredClaims{}
token, err := jwt.ParseWithClaims(state, claims, func(t *jwt.Token) (interface{}, error) {
if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, errors.New("méthode de signature inattendue")
}
return tm.secret, nil
})
if err != nil {
return "", err
}
if !token.Valid {
return "", errors.New("token invalide")
}
return claims.Subject, nil
}
// ParseAndValidate décode et vérifie la signature + l'expiration d'un JWT.
func (tm *JwtTokenManager) ParseAndValidate(tokenString string) (*domain.User, error) {
claims := &Claims{}