background
cli-authv0.1.0-beta

OAuth de qualité production pour votre CLI

Une bibliothèque d’authentification complète et entièrement modulaire. Quatre flux. Stockage des jetons, rafraîchissement, verrouillage inter-processus, intégration au trousseau. Tout est pris en charge, tout est interchangeable.

$npm install cli-auth
Licence MITNode.js 22+Bun 1.1+ESM uniquementTypeScript
~/projects/your-cli — zsh

Quatre flux. Une seule bibliothèque.

Choisissez une stratégie. La plomberie vient avec.

Code d’appareilRFC 8628

Celui qu’il faut pour les serveurs, terminaux Docker et toutes les machines où ouvrir un navigateur n’est pas possible.

  • La boucle de polling gère pour vous le back-off slow_down et la date limite d’expiration
  • Le code utilisateur est exposé via un rappel onAuthorization pour que vous décidiez comment l'afficher
  • Se rafraîchit automatiquement à l’approche de l’expiration du jeton
Quand utiliser cela → Sans interface, SSH ou à distance. Partout où votre CLI vit dans un endroit inaccessible au navigateur. L’utilisateur se connecte depuis son ordinateur portable pendant que votre CLI effectue le polling en tâche de fond.
device-code.ts
1import { createCliAuth, keyringStorage } from 'cli-auth';2import { Entry } from '@napi-rs/keyring';3 4const auth = createCliAuth({5  strategy: 'device-code',6  provider: {7    metadata: {8      deviceAuthorizationEndpoint: 'https://your-tenant.logto.app/oidc/device/auth',9      tokenEndpoint: 'https://your-tenant.logto.app/oidc/token',10    },11  },12  clientId: 'your-cli-client',13  storage: keyringStorage({ entry: new Entry('your-cli', 'tokens') }),14  scope: 'openid offline_access',15});16 17await auth.login({18  onAuthorization: ({ userCode, verificationUri }) => {19    console.log(`Visit ${verificationUri} and enter ${userCode}`);20  },21});22 23const accessToken = await auth.getToken();

Ce que personne ne vous dit sur l’auth CLI.

Chaque remarque ci-dessous correspond à un vrai bug, une course critique ou une clause de la spécification déjà gérés ici.

slow_down back-off
PKCE verifier + challenge
loopback on 127.0.0.1
O_CREAT | O_EXCL
atomic write + rename
cross-process lock
recheck after lock
0600 permissions
macOS Keychain
Windows Credential Store
Linux Secret Service
refresh token single-use
expiry threshold
per-resource token cache
proxy / OTel fetch hook
branded callback page
custom parameters
TypeScript discriminated unions
…and tests.
background

Remplacez n’importe quelle pièce. Rien n’est une boîte noire.

Stockage, verrouillage, fetch, et la page de callback sont tous des hooks. Rien n’est codé en dur. Cliquez sur un slot et voyez la config se réécrire automatiquement.

Remplacer le stockage
Trousseau macOS, Windows Credential Store, ou Linux Secret Service, selon l’OS. Via @napi-rs/keyring.
cli-auth.config.ts
1import { createCliAuth } from 'cli-auth';2 3const auth = createCliAuth({4  strategy: 'authorization-code',5  provider: { /* ... */ },6  clientId: 'your-cli-client',7  storage: keyringStorage({ entry: new Entry('your-cli', 'tokens') }),8});

Utilisez votre fournisseur d’identité

Tout serveur compatible OAuth 2.0 / OIDC fonctionne. Pointez la bibliothèque sur vos endpoints et ça roule. Nous n’avons pas créé cela uniquement pour Logto.

Logto
Auth0
Okta
Keycloak
Microsoft Entra
Google
Authelia
Any OIDC 2.0 server
Logto
Auth0
Okta
Keycloak
Microsoft Entra
Google
Authelia
Any OIDC 2.0 server

Questions fréquentes

Quelle différence avec openid-client ?

Est-ce compatible avec Auth0, Okta, ou mon fournisseur ?

Comment fonctionne le verrouillage inter-processus ?

Que faire si le trousseau OS n'est pas disponible ?

Quels environnements sont supportés ?

Puis-je personnaliser la page de callback post-login ?

Débloquez plus avec Logto Cloud

Authentification CLI sans l'écrire vous-même.