5.1 KiB
5.1 KiB
Diagnostic 401 Unauthorized - Backend
Problème
Erreur lors de l'appel au backend :
Received: 'Unauthorized, status code 401' when invoking REST Client method:
'dev.lions.user.manager.client.service.RoleServiceClient#getAllRealmRoles'
Causes Possibles
1. Token JWT non envoyé au backend
Vérification :
- Ouvrir les DevTools du navigateur (F12)
- Aller dans l'onglet "Network"
- Filtrer par "XHR" ou "Fetch"
- Cliquer sur une requête vers
/api/roles/realm - Vérifier l'en-tête
Authorization: Bearer <token>
Solution :
- Vérifier que
bearer-token-propagation=trueest configuré dansapplication.properties - Vérifier que le client est bien authentifié via OIDC
2. Backend ne peut pas valider le token
Vérification :
- Vérifier les logs du backend pour voir les erreurs OIDC
- Chercher les messages :
Bearer access token is not available,Token validation failed, etc.
Solution :
- Vérifier que
quarkus.oidc.enabled=truedansapplication-dev.properties - Vérifier que
quarkus.oidc.auth-server-urlpointe vers le bon realm (lions-user-manager) - Vérifier que
quarkus.oidc.token.issuercorrespond au realm
3. Rôles non extraits du token
Vérification :
- Vérifier les logs du backend pour voir :
No claim exists at the path 'realm_access/roles' - Obtenir le token JWT et le décoder sur https://jwt.io
- Vérifier que le claim
realm_access.rolesexiste et contient les rôles
Solution :
- Vérifier que
quarkus.oidc.roles.role-claim-path=realm_access/rolesest configuré - Vérifier que le client Keycloak a le scope "roles" activé
- Vérifier que
fullScopeAllowed=trueest configuré pour le client
4. Token expiré
Vérification :
- Vérifier les logs du backend pour voir :
Token expired - Obtenir le token JWT et vérifier le claim
exp
Solution :
- Se reconnecter pour obtenir un nouveau token
- Augmenter la durée de vie du token dans Keycloak si nécessaire
Étapes de Diagnostic
Étape 1 : Vérifier les logs du backend
Redémarrer le backend avec les logs DEBUG activés et chercher :
# Logs à surveiller
- "Bearer access token is not available"
- "No claim exists at the path"
- "Token validation failed"
- "Roles extracted from claim"
Étape 2 : Vérifier le token JWT
- Obtenir le token JWT (via DevTools ou script)
- Décoder sur https://jwt.io
- Vérifier :
iss: doit êtrehttp://localhost:8180/realms/lions-user-managerrealm_access.roles: doit contenir les rôles (admin,user_manager, etc.)exp: doit être dans le futur
Étape 3 : Vérifier la configuration OIDC
Backend (application-dev.properties) :
quarkus.oidc.enabled=true
quarkus.oidc.auth-server-url=http://localhost:8180/realms/lions-user-manager
quarkus.oidc.application-type=service
quarkus.oidc.token.issuer=http://localhost:8180/realms/lions-user-manager
quarkus.oidc.roles.role-claim-path=realm_access/roles
quarkus.oidc.verify-access-token=true
Client (application.properties) :
quarkus.rest-client."lions-user-manager-api".bearer-token-propagation=true
Étape 4 : Tester manuellement avec curl
# 1. Obtenir un token
TOKEN=$(curl -X POST "http://localhost:8180/realms/lions-user-manager/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=test-user" \
-d "password=test123" \
-d "grant_type=password" \
-d "client_id=lions-user-manager-client" \
-d "client_secret=NTuaQpk5E6qiMqAWTFrCOcIkOABzZzKO" \
-d "scope=openid profile email roles" | jq -r '.access_token')
# 2. Tester l'endpoint backend
curl -X GET "http://localhost:8081/api/roles/realm?realm=master" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json"
Configuration Actuelle
Backend OIDC
- Realm :
lions-user-manager - Type :
service(valide les tokens sans client-id/secret) - Role Claim Path :
realm_access/roles - Token Audience :
optional(accepte tous les clients)
Client OIDC
- Realm :
lions-user-manager - Client ID :
lions-user-manager-client - Bearer Token Propagation :
true
Solution Recommandée
- Vérifier que le backend est démarré sur le port 8081
- Vérifier que Keycloak est démarré sur le port 8180
- Vérifier que l'utilisateur
test-userest connecté au client - Vérifier les logs du backend pour voir exactement où l'erreur se produit
- Tester manuellement avec curl pour isoler le problème
Logs à Surveiller
Backend (port 8081)
# Chercher ces messages dans les logs
DEBUG [io.qu.oi.ru.BearerAuthenticationMechanism] Starting a bearer access token authentication
DEBUG [io.qu.oi.ru.OidcUtils] Looking for a token in the authorization header
DEBUG [io.qu.oi.ru.OidcUtils] Roles extracted from claim 'realm_access/roles': [...]
Client (port 8080)
# Chercher ces messages dans les logs
DEBUG [io.qu.oi.ru.OidcAuthenticationMechanism] q_session_chunk_1 cookie set
DEBUG [io.qu.oi.ru.OidcUtils] No claim exists at the path 'realm_access/roles'