« Login expired · Please run /login » signifie que Claude Code a tenté de renouveler automatiquement votre connexion enregistrée, s'est vu opposer un refus, puis a effacé les identifiants stockés. Dans cet état, vos instructions ne sont pas envoyées à l'API : elles s'arrêtent sur votre machine. Se reconnecter avec /login règle le problème, alors que relancer encore et encore ne change rien au message.
Login expired · Please run /login
En mode non interactif (claude -p) et dans l'Agent SDK, le même état s'affiche avec le libellé suivant (le code d'erreur structuré est authentication_failed).
Failed to authenticate: OAuth session expired and could not be refreshed
Commencez par le libellé exact du message
Plusieurs messages différents vous demandent « /login »
Le renouvellement de la connexion enregistrée a été refusé et les identifiants sont déjà effacés
Cette session n'a tout simplement aucun identifiant utilisable
L'API a rejeté une requête qui avait été envoyée
C'est le compte lui-même qui est suspendu, pas la connexion
Se reconnecter ne le fait pas disparaître
Sommaire
- 1. Qu'est-ce qui a expiré avec Login expired ?
- 2. La différence avec Not logged in et OAuth token expired
- 3. Se reconnecter avec /login
- 4. Vérifier que c'est réglé
- 5. Ce qu'il faut vérifier quand le message revient souvent
- 6. Des cas signalés dont la cause n'est pas établie
- 7. Les informations à garder si rien n'y fait
- 8. En résumé
- FAQ
1. Qu'est-ce qui a expiré avec Login expired ?
D'après la référence officielle des erreurs de Claude Code, ce message apparaît au terme de l'enchaînement ci-dessous. Ce qui a expiré, c'est la connexion claude.ai ou Claude Console (vos identifiants OAuth) que vous avez enregistrée localement avec /login.
Au moment où le renouvellement échoue, les identifiants stockés ont déjà disparu
① La connexion enregistrée
La connexion claude.ai ou Claude Console enregistrée avec /login
② Tentative de renouvellement automatique
Claude Code demande un renouvellement avec le jeton d'actualisation stocké
③ Refus, puis effacement
Le service d'authentification OAuth refuse, et Claude Code efface les identifiants stockés
④ Arrêt avant l'envoi
Les instructions suivantes s'arrêtent sur la machine avec Login expired. Seul /login peut créer de nouveaux identifiants
Tout se joue à l'étape ④. Comme Claude Code a déjà effacé les identifiants, il n'envoie pas la requête à l'API. C'est pour cela que chaque renvoi produit le même message, ce que la documentation officielle dit aussi : réessayer sans se reconnecter affiche le même message à chaque requête. L'explication officielle s'arrête au fait que le renouvellement a été refusé et ne détaille pas les raisons du refus. Elle précise en revanche que si la cause n'était pas une connexion trop ancienne mais la suspension du compte lui-même, un autre message s'affiche : « Your account is on hold ».
Ce message existe depuis la v2.1.206
D'après la référence officielle des erreurs, avant la v2.1.206, Claude Code continuait d'envoyer les requêtes avec les identifiants restés dans l'environnement, même quand la connexion ne pouvait plus être renouvelée. Résultat : quel que soit le modèle choisi, on obtenait « There's an issue with the selected model » ou une erreur 401, sans aucune invitation à se reconnecter. L'entrée v2.1.206 du CHANGELOG officiel l'indique également : une connexion expirée faisait échouer tous les modèles avec une erreur de modèle trompeuse au lieu d'inviter à lancer /login, et c'est corrigé (publication sur npm le 9 juillet 2026, UTC). Si vous utilisez une ancienne version et que tous les modèles renvoient une erreur de modèle, essayez d'abord /login.
Les modes d'authentification qui n'affichent jamais ce message
Les sessions authentifiées par une clé API (ANTHROPIC_API_KEY), par un jeton longue durée créé avec claude setup-token (CLAUDE_CODE_OAUTH_TOKEN) ou par un fournisseur cloud comme Amazon Bedrock n'utilisent pas la connexion enregistrée : ce message n'y apparaît donc pas. Autrement dit, une session qui a affiché Login expired utilisait bien la connexion enregistrée comme identifiant actif.
Un avertissement 3 jours avant
D'après la documentation officielle sur l'authentification, depuis la v2.1.203, l'avertissement suivant s'affiche au démarrage lorsqu'il reste moins de 3 jours avant l'expiration de la connexion enregistrée (5 jours avant la v2.1.217). Il est purement informatif : l'authentification fonctionne jusqu'à l'échéance.
Your login expires in 3 days · run /login to renew
Renouveler tôt compte surtout pour les sessions qui tournent sans surveillance. Si une session en arrière-plan de l'agent view ou une session Remote Control franchit l'échéance de la connexion, elle cesse d'avancer dès que les identifiants tombent et ne repart pas tant que vous ne vous êtes pas reconnecté.
2. La différence avec Not logged in et OAuth token expired
Tous ces messages finissent par vous demander /login, mais ils diffèrent sur ce qui s'est passé et sur le fait que la requête a atteint l'API ou non. Voici les explications de la référence officielle des erreurs, côte à côte.
| Message | Ce qui s'est passé | Envoi à l'API | Solution |
|---|---|---|---|
| Login expired · Please run /login | Le renouvellement de la connexion enregistrée a été refusé et les identifiants ont été effacés | Pas d'envoi (arrêt sur la machine) | /login |
| Not logged in · Please run /login | Cette session n'a aucun identifiant utilisable | ― | /login, ou vérifier que la variable d'environnement prévue est bien chargée |
| OAuth token revoked · Please run /login / …401 OAuth token has expired… | L'API a rejeté une requête envoyée (déconnexion de tous les appareils, suppression par un administrateur, échec du renouvellement automatique en cours de session) | Envoyée, puis 401 | /login. S'il revient dans la même session, /logout → /login |
| Please run /login · API Error: 401 Invalid authentication credentials | Le format de l'identifiant est accepté, mais le compte ou l'organisation le rejette | Envoyée, puis 401 | Vérifier l'identifiant actif avec /status avant d'agir |
| Your account is on hold… | Le compte est suspendu (affiché comme Login expired avant la v2.1.235) | ― | Consulter les détails ou faire appel via le lien du message |
| Remote Control disconnected — Claude.ai login expired — … | Seule la connexion Remote Control s'est arrêtée. La session locale continue | ― | /login. Selon le message, enchaîner avec /remote-control |
Retenez-le ainsi : Not logged in signifie « il n'y a jamais eu d'identifiants », Login expired signifie « il y en avait, mais ils n'ont pas pu être renouvelés et ont été effacés ». Avec Not logged in, il arrive aussi que la variable ANTHROPIC_API_KEY que vous comptiez utiliser ne soit pas chargée dans le shell d'où vous avez lancé Claude Code. Les causes de Not logged in, et la raison pour laquelle une variable d'environnement de clé API passe avant la connexion par abonnement, sont expliquées dans notre article sur les erreurs d'authentification et de connexion de Claude Code (Not logged in / Invalid API key).
Ce qui distingue OAuth token has expired, c'est le moment : après ou avant l'envoi à l'API. La documentation officielle l'explique : quand la connexion enregistrée a déjà été effacée après un renouvellement raté, c'est Login expired qui s'affiche à la place. Le message au nom proche Anthropic profile login expired n'apparaît que si vous utilisez un profil d'identifiants Anthropic choisi via ANTHROPIC_PROFILE ou un réglage équivalent ; il ne s'affiche jamais dans une session qui utilise une connexion claude.ai.
3. Se reconnecter avec /login
La requête qui a affiché ce message n'a pas atteint l'API. Mais s'il est apparu en cours de tour, des modifications de fichiers ou des commandes antérieures de ce même tour ont pu déjà s'exécuter, et renvoyer l'instruction telle quelle risque de les exécuter deux fois. Avant de la renvoyer, vérifiez jusqu'où le travail était allé.
Vérifier quel compte a expiré
Ouvrez /status depuis la zone de saisie. D'après la documentation officielle, depuis la v2.1.210, la ligne Login affiche Expired — log in again, ainsi que l'organisation et l'adresse e-mail enregistrées pour la connexion expirée. Cette ligne n'apparaît que si la connexion enregistrée est l'identifiant actif. Si vous jonglez entre plusieurs comptes, notez ici celui auquel vous devez vous reconnecter.
Lancer /login et se reconnecter avec le même compte
Un navigateur s'ouvre. Connectez-vous avec votre compte claude.ai si vous avez un abonnement, ou avec votre compte Claude Console si vous payez à l'usage de l'API. Si le navigateur ne s'ouvre pas, appuyez sur c pour copier l'URL et collez-la dans un navigateur de votre machine. Sous WSL2, via SSH ou dans un conteneur, le navigateur peut afficher un code de connexion une fois la connexion faite. Collez-le alors à l'invite Paste code here if prompted du terminal. Quand Login successful s'affiche, appuyez sur Enter pour revenir.
Si le collage du code ne fonctionne pas, se connecter depuis le shell
Dans les terminaux où le collage n'atteint pas la zone de saisie, essayez une autre méthode, comme le clic droit ou Shift+Insert dans Windows Terminal. Si cela échoue encore, lancez claude auth login dans votre shell. Cette commande lit le code collé depuis l'entrée standard, et la documentation officielle indique qu'elle fonctionne aussi sous Windows natif.
Vérifier la réponse avec une courte instruction avant de reprendre
N'envoyez pas tout de suite votre grosse instruction d'origine. Envoyez d'abord un court test sans aucune opération sur les fichiers. Une fois la réponse revenue, vérifiez où en était le travail, puis renvoyez l'instruction mise de côté.
# Dans la zone de saisie de Claude Code
/status
/login
# Si le collage dans la zone de saisie ne fonctionne pas (à lancer dans le shell)
claude auth login
Quand le message apparaît avec claude -p ou en CI
Le mode non interactif ne permet pas de se connecter dans un navigateur. La procédure officielle consiste à lancer une fois claude en mode interactif dans le même environnement, terminer /login, puis relancer la commande d'origine. Pour une automatisation qui ne peut pas se connecter de façon interactive, utilisez une clé API Console (ANTHROPIC_API_KEY, facturée à l'usage de l'API) ou un jeton longue durée créé avec claude setup-token.
claude setup-token
# Après validation dans le navigateur, le jeton s'affiche dans le terminal (il n'est enregistré nulle part)
export CLAUDE_CODE_OAUTH_TOKEN=le-jeton-affiché
D'après la documentation officielle sur l'authentification, ce jeton est valable un an et nécessite une offre Pro, Max, Team ou Enterprise. Il ne sert qu'aux requêtes vers le modèle : il ne fonctionne ni pour Remote Control ni pour les connecteurs claude.ai. Les exécutions avec --bare ne lisent pas cette variable ; utilisez-y une clé API ou apiKeyHelper. Notez que lorsque ce jeton lui-même expire ou devient invalide, c'est le message OAuth token revoked / expired qui s'affiche, et non Login expired.
Quand la connexion elle-même échoue
Pour les cas où la cause reste obscure, le guide de dépannage officiel propose une réinitialisation : /logout → fermer Claude Code → le relancer avec claude et se connecter. /logout réinitialise aussi l'état de la configuration du premier lancement : au démarrage suivant, vous refaites la connexion et la configuration initiale. Tous les identifiants stockés sont supprimés, et il faudra aussi ressaisir les connexions aux serveurs MCP et les valeurs secrètes des plugins. Si OAuth error: Invalid code s'affiche, le code de connexion a expiré ou a été tronqué à la copie : terminez l'opération dès que le navigateur s'ouvre, et copiez l'URL en entier avec c.
4. Vérifier que c'est réglé
Ne considérez pas l'affaire close parce que l'erreur ne s'est pas affichée une fois. Vérifiez ces trois points.
Ce qu'affiche /status
Expired — log in again a-t-il disparu de la ligne Login, et l'organisation et l'adresse e-mail sont-elles celles du compte voulu ? Quand une connexion et une clé API coexistent, celle qui n'est pas utilisée est signalée
Le code de sortie de claude auth status
Selon la référence officielle de la CLI, il vaut 0 si vous êtes connecté et 1 sinon. Pratique comme vérification préalable dans un script
Une courte réponse revient-elle ?
On ne sait qu'une requête au modèle passe vraiment qu'une fois la réponse revenue. Le message de test consomme de l'utilisation comme d'habitude
# Affichage lisible
claude auth status --text
# Voir le code de sortie (macOS, Linux)
claude auth status; echo $?
# Voir le code de sortie (PowerShell)
claude auth status; $LASTEXITCODE
Pour vérifier la réponse, envoyez par exemple ceci.
Ceci est un test de connexion. Ne lis ni n'écris aucun fichier et n'appelle aucun outil ;
réponds seulement « Réponse OK ».
5. Ce qu'il faut vérifier quand le message revient souvent
Une seule fois, /login suffit. S'il revient tous les quelques jours, voire presque chaque jour, passez les points ci-dessous en revue en partant du haut. Tous viennent de la documentation officielle ou du CHANGELOG ; aucun n'a été ajouté par supposition. Commencez par vérifier que votre version n'est pas ancienne.
claude --version
claude update
Sessions parallèles et sortie de veille
Selon la documentation officielle, les sessions parallèles d'une même machine partagent la connexion enregistrée, et le renouvellement se fait un processus à la fois. Avant la v2.1.211, deux sessions pouvaient renouveler avec le même jeton à la sortie de veille, ce qui invalidait la connexion enregistrée : toutes les sessions demandaient alors de se reconnecter en même temps
Une ancienne build tourne sur la même machine
L'entrée v2.1.277 du CHANGELOG indique la correction d'une déconnexion inattendue quand une ancienne build, comme la CLI embarquée dans une extension d'IDE, tourne sur la même machine. Le message affiché à ce moment-là n'est pas précisé. Mettez à jour la CLI et l'extension d'IDE
Le trousseau macOS
Si le trousseau est verrouillé ou si son mot de passe ne correspond plus à celui du compte, l'écriture est refusée et la connexion est enregistrée en clair dans ~/.claude/.credentials.json. Suivez la procédure ci-dessous pour le rendre de nouveau accessible en écriture. Ajout du 26 septembre 2026 : l'entrée v2.1.281 du CHANGELOG indique la correction d'un problème où une écriture faite pendant que le trousseau était verrouillé, par exemple juste après la sortie de veille, pouvait supprimer l'élément du trousseau
L'horloge du système
Le guide de dépannage officiel rappelle que la validation des jetons dépend d'une heure exacte, et conseille de vérifier l'horloge si l'on vous demande souvent de vous reconnecter. Activez la mise à l'heure automatique de votre OS
Plusieurs comptes et CLAUDE_CONFIG_DIR
Quand CLAUDE_CONFIG_DIR est défini, les identifiants sont stockés dans ce dossier, et les éléments du trousseau macOS sont eux aussi séparés par dossier. Si vous lancez /login avec une valeur différente de celle de la session qui a affiché le message, la connexion part dans un autre emplacement
Le même message persiste après reconnexion
Avant la v2.1.235, un compte suspendu s'affichait lui aussi comme Login expired. Si /login ne le fait pas disparaître sur une ancienne version, mettez à jour, puis relisez le message
Rendre le trousseau macOS de nouveau accessible en écriture
Voici la procédure du guide de dépannage officiel. Si le rapport de claude doctor ne contient aucun avertissement commençant par macOS Keychain is not writable, le trousseau est accessible en écriture : faites seulement l'étape 4.
- Vérifiez l'accès au trousseau avec
claude doctor - En cas d'avertissement, déverrouillez-le avec la commande ci-dessous, puis relancez
claude doctor - Si l'avertissement persiste après le déverrouillage, ouvrez Keychain Access (Trousseau d'accès), sélectionnez le trousseau
loginet utilisezEdit > Change Password for Keychain "login"(intitulé de l'interface en anglais, tel que dans la procédure officielle) pour l'aligner sur le mot de passe de votre compte - Une fois l'avertissement disparu, reconnectez-vous avec
/logout→/login. La connexion est de nouveau enregistrée dans le trousseau
claude doctor
security unlock-keychain ~/Library/Keychains/login.keychain-db
Passer à une clé API fait-il disparaître ce message ?
Oui, mais le mode de facturation change. Selon l'ordre de priorité officiel, une ANTHROPIC_API_KEY approuvée passe avant la connexion faite avec /login, et en mode non interactif -p, elle est toujours utilisée dès qu'elle est définie. Pendant ce temps, l'utilisation n'est pas imputée à votre abonnement mais facturée à l'usage de l'API Console. Nous déconseillons de configurer une clé API dans le seul but d'éviter Login expired. Si votre objectif est de faire tourner des tâches sans surveillance, claude setup-token, utilisable avec un abonnement, convient mieux.
6. Des cas signalés dont la cause n'est pas établie
Le dépôt GitHub de Claude Code contient des rapports de bogue qui citent ce message mot pour mot. Nous avons ouvert et lu les six ci-dessous le 22 septembre 2026. Ce sont tous des signalements ou des hypothèses d'utilisateurs, et dans ce que nous avons lu, Anthropic n'avait publié aucune réponse. Un même symptôme n'implique pas une même cause : ne les reprenez pas comme des procédures, servez-vous-en pour juger si votre situation leur ressemble.
- #94464 (macOS, CLI 2.1.270) : dans un environnement où le Claude Code intégré à l'application de bureau Claude et la CLI du terminal partagent le même
~/.claude, le terminal affiche Login expired presque tous les jours. L'auteur suppose que les jetons renouvelés par la version intégrée ne sont écrits que dans le fichier, laissant un ancien jeton dans le trousseau. Un ajout signale le même symptôme en 2.1.273 - #88583 (macOS, 2.1.229 fournie avec l'application de bureau) : des sessions parallèles se disputeraient le renouvellement, et les identifiants du trousseau seraient vidés. Un ajout cite un cas de
Failed to authenticate: OAuth session expired and could not be refreshedsous Windows en 2.1.251 - #88947 (Linux, 2.1.228 à 2.1.240) : dans un environnement où 10 à 24 sessions interactives partagent un seul
~/.claude, toutes les sessions tombent sur Login expired à des intervalles de moins d'une semaine - #95822 (macOS) : signale que des commandes brèves comme
claude auth statuslancent un renouvellement au démarrage et se terminent sans en enregistrer le résultat, laissant derrière elles un jeton d'actualisation déjà consommé. Un outil de supervision l'exécutait toutes les quelques minutes (observé en 2.1.259). Mieux vaut éviter de lancer à intervalles rapprochés leclaude auth statusde la section 4 - #83834 (Windows, 2.1.221) : Login expired s'affiche même juste après la connexion, et la valeur d'expiration du fichier stocké valait 0. Un ajout indique la même chose sous Linux en 2.1.241
- #80605 (macOS, 2.1.218) : le message persistait même après suppression des identifiants et de l'élément du trousseau puis réinstallation, et
/loginn'affichait pas d'écran de connexion. L'auteur a pu se connecter le lendemain, mais écrit ne pas savoir ce qui a fonctionné (ticket clos)
Les quatre premiers ont un point commun : plusieurs processus d'une même machine utilisent la même connexion enregistrée. Si le message revient régulièrement, notez combien d'instances de Claude Code tournent en même temps (CLI du terminal, extension d'IDE, application de bureau, sessions en arrière-plan) : vous pourrez ainsi décrire la situation avec précision en la signalant.
7. Les informations à garder si rien n'y fait
Le guide de dépannage officiel cite ces quatre recours quand le problème n'est pas résolu.
- Générer un rapport de diagnostic automatique avec
claude doctor - Si vous pouvez ouvrir une session, le signaler avec
/feedbackdans la zone de saisie - Chercher les problèmes connus dans les Issues GitHub et, s'il n'y en a pas, ouvrir un nouveau rapport avec votre OS, votre méthode d'installation et le texte complet de l'erreur
- Pour un problème côté compte, comme une boucle de connexion, se connecter à claude.ai (utilisateurs de la Console : platform.claude.com), cliquer sur ses initiales en bas à gauche et choisir « Get help » pour contacter le support
Modèle de notes pour un signalement
- Environnement
- Résultat de
claude --version/ OS / méthode d'installation (native, npm, intégrée à l'application de bureau, etc.) - Message
- Texte complet de l'erreur / heure d'apparition et fuseau horaire / ligne Login de
/status(masquez l'adresse e-mail) - Contexte
- Nombre et types d'instances de Claude Code qui tournaient en même temps / était-ce juste après une sortie de veille ou une mise à jour ?
- Ce que vous avez essayé
- Ce qui a changé avant et après
/login,/logout, la vérification du trousseau, etc.
8. En résumé
« Login expired · Please run /login » s'affiche une fois que le renouvellement de la connexion enregistrée a été refusé et que Claude Code a effacé les identifiants. Les requêtes s'arrêtent sur votre machine, donc réessayer ne sert à rien ; pour continuer à utiliser la connexion enregistrée, il n'y a pas d'autre voie que de vous reconnecter avec /login. Vérifiez le compte expiré avec /status, reconnectez-vous avec le même compte, confirmez avec une courte réponse, et c'est terminé.
Si le message revient souvent, vérifiez dans cet ordre : la mise à jour de votre version, une ancienne build ou une extension d'IDE sur la même machine, le trousseau macOS, l'horloge et CLAUDE_CONFIG_DIR. Not logged in (aucun identifiant) et OAuth token has expired (refus de l'API) se règlent autrement : comparez d'abord le libellé exact du message. Pour les autres erreurs, consultez notre récapitulatif des erreurs courantes de Claude Code et de leurs solutions.
FAQ
Q. Que signifie « Login expired · Please run /login » ?
R. Claude Code a tenté de renouveler automatiquement votre connexion enregistrée, s'est vu opposer un refus, puis a effacé les identifiants stockés. Dès lors, les requêtes ne sont plus envoyées à l'API : elles s'arrêtent sur votre machine. Se reconnecter avec /login règle le problème.
Q. Est-ce que réessayer plusieurs fois peut suffire ?
R. Non. Les identifiants sont déjà effacés, et la documentation officielle précise que réessayer sans se reconnecter affiche le même message à chaque requête. Seul /login peut créer de nouveaux identifiants.
Q. Est-ce que cela veut dire que mon abonnement a pris fin ?
R. Ce message seul ne permet pas de le savoir. L'explication officielle est que le renouvellement de la connexion enregistrée a été refusé. Si c'est le compte lui-même qui est suspendu, un autre message s'affiche : « Your account is on hold ». Vérifiez l'état de votre offre avec /status ou dans les paramètres de claude.ai après vous être reconnecté.
Q. Quelle est la différence avec Not logged in ?
R. Not logged in signifie que cette session n'a jamais eu d'identifiants utilisables. Login expired signifie qu'il y avait une connexion enregistrée, mais qu'elle n'a pas pu être renouvelée et a été effacée. Les deux se règlent avec /login, mais avec Not logged in, vérifiez aussi que la variable d'environnement que vous comptiez utiliser est bien chargée.
Sources primaires consultées
- Claude Code — Error reference (documentation officielle) : définitions de Login expired, Not logged in, OAuth token revoked or expired, Your account is on hold et des messages Remote Control, ainsi que les changements des v2.1.206 et v2.1.235
- Claude Code — Authentication (documentation officielle) : emplacement de stockage des identifiants, avertissement 3 jours avant l'expiration, ligne Login de
/status, ordre de priorité de l'authentification,claude setup-token - Claude Code — Troubleshoot installation and login (documentation officielle) : réinitialisation de la connexion, collage du code sous WSL2 et SSH, renouvellement entre sessions parallèles, procédure de récupération du trousseau macOS, recours au support
- Claude Code — Référence de la CLI (documentation officielle) :
claude auth loginet codes de sortie declaude auth status - anthropics/claude-code — CHANGELOG (officiel) : v2.1.203 (avertissement avant l'expiration), v2.1.206 (de l'erreur de modèle à l'invitation /login), v2.1.211 (déconnexion générale à la sortie de veille), v2.1.217 (avertissement ramené à 3 jours), v2.1.277 (déconnexion due à une ancienne build sur la même machine), v2.1.281 (écriture dans un trousseau verrouillé)
- Issues GitHub : #94464, #88583, #88947, #95822, #83834, #80605 (tous des signalements d'utilisateurs ; consultés le 22 septembre 2026)