background
cli-authv0.1.0-beta

OAuth промышленного уровня для вашего CLI

Аутентификационная библиотека с полным набором функций и возможностью подмены каждого компонента. Четыре потока. Хранение токенов, обновление, блокировка между процессами, интеграция с keychain. Всё реализовано, любую часть можно заменить.

$npm install cli-auth
Лицензия MITNode.js 22+Bun 1.1+Только ESMTypeScript
~/projects/your-cli — zsh

Четыре потока. Одна библиотека.

Выберите стратегию. Вся логика уже внутри.

Device codeRFC 8628

То, что нужно для серверов, Docker-оболочек и любой машины, где нельзя открыть браузер.

  • Цикл опроса автоматически обрабатывает сбавление частоты и дедлайн окончания действия
  • Код пользователя передаётся через onAuthorization callback — вы сами выбираете, как показывать
  • Обновляется автоматически, когда access token близок к окончанию
Когда пригодится → Безголовые, SSH или удалённые среды. Везде, где ваш CLI работает, а браузер недоступен. Пользователь входит на своём ноутбуке, пока ваш CLI опрашивает сервер в фоне.
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();

То, чего вам никто не расскажет про аутентификацию в CLI.

Каждый пункт — реальный баг, гонка или пункт спецификации, которые мы уже учли.

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

Меняйте любые части. Нет чёрных ящиков.

Хранение, блокировки, fetch и страницу callback можно заменить через хуки. Ничего не зашито. Кликните на слот, чтобы увидеть, как меняется конфиг.

Заменить хранилище
macOS Keychain, Windows Credential Store или Linux Secret Service — что доступно в вашей ОС. Через @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});

Используйте своего провайдера идентификации

Подойдёт любой сервер, совместимый с OAuth 2.0 / OIDC. Просто укажите свои endpoint — библиотека всё сделает сама. Мы делали не только для 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

Вопросы пользователей

Чем это отличается от openid-client?

Работает ли это с Auth0, Okta или моим провайдером?

Как реально работает блокировка между процессами?

Что, если keyring ОС недоступен?

Какие среды поддерживаются?

Можно ли сделать свою страницу callback после входа?

Получите больше возможностей с Logto Cloud

CLI-аутентификация без самостоятельной реализации.