fix(auth): corrections runtime LinkedIn OAuth (#88)

- Workaround nonce OIDC LinkedIn (non-conformité) : capture MissingClaimError après échange de code réussi et fetch userinfo séparément
- Ajout token_endpoint_auth_method: client_secret_post (requis par LinkedIn)
- suppress_callback_exceptions=True pour corriger les erreurs Dash multi-pages
- Suppression bouton déconnexion redondant sur /compte/admin et style hover incorrect sur la navbar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Colin Maudry
2026-06-25 00:38:01 +02:00
parent 5a702ac77e
commit 590b927e31
9 changed files with 48 additions and 9 deletions
+12 -2
View File
@@ -264,12 +264,22 @@ def linkedin_callback():
# L'utilisateur a refusé / annulé l'autorisation côté LinkedIn.
return _redirect_with_error("/connexion", "oauth_cancelled")
try:
token = oauth.linkedin.authorize_access_token()
# LinkedIn ne retourne pas le nonce dans l'ID token (non-conformité OIDC) :
# authorize_access_token() lève MissingClaimError("nonce") après avoir échangé
# le code avec succès. Le token est déjà stocké dans oauth.linkedin.token à ce
# moment, donc on capture cette erreur précise et on continue.
try:
oauth.linkedin.authorize_access_token()
except Exception as exc:
if "nonce" not in str(exc) or not oauth.linkedin.token:
raise
resp = oauth.linkedin.get("https://api.linkedin.com/v2/userinfo")
resp.raise_for_status()
userinfo = resp.json()
except Exception:
logger.exception("Échec de l'échange de token LinkedIn")
return _redirect_with_error("/connexion", "oauth_failed")
userinfo = token.get("userinfo") or {}
subject = userinfo.get("sub")
email = (userinfo.get("email") or "").strip().lower()
if not subject or not email: