EmDash の CLI にログインする(デバイス認可でパスワード不要)

EmDash の CLI(emdash login)で、ブラウザで承認するだけで本番サイトにログインする手順です。トークンの保存場所と注意点、実際に使った例(日本語検索の設定)も紹介します。

EmDash にはコマンドラインツール(CLI)が付いています。CLI にログインすると、記事の一覧取得や検索、スキーマの操作などをターミナルから行えます。管理画面にない設定を、API で変えることもできます。

EmDash の管理画面にはパスワードがなく、パスキーでログインします。CLI のほうは、「デバイス認可」という方式でログインします。

画像は、ローカル環境でダミーのユーザー(Dev Admin)を使って撮りました。本番のドメインは your-site.example.com に置き換えています。

デバイス認可とは

テレビやゲーム機で動画サービスにログインするとき、「スマホで○○を開いてコードを入力してください」と表示されることがあります。デバイス認可は、それと同じ仕組みです。正式には OAuth 2.0 Device Authorization Grant といいます。

  1. CLI がサイトにログインを要求し、短いコードを受け取る
  2. あなたがブラウザで管理画面を開き、そのコードを入力して承認する
  3. CLI がトークンを受け取って保存する

ターミナルでパスワードを打つことはありません。本人確認は、ブラウザでのいつものパスキーログインで済みます。

準備

  • EmDash のプロジェクトフォルダーがあること(CLI は emdash パッケージに含まれています)
  • ログインしたいサイトに、ブラウザからパスキーでログインできること

手順

1. ターミナルで emdash login を実行する

プロジェクトフォルダーで次のコマンドを実行します。本番サイトなら、--url に本番の URL を指定します(省略すると http://localhost:4321 になります)。

pnpm emdash login --url https://your-site.example.com

開く URL と、XXXX-XXXX 形式のコードが表示されます。CLI はそのまま承認を待ちます。

emdash login を実行したところ

2. ブラウザで承認ページを開く

表示された URL(/_emdash/admin/device)をブラウザで開きます。管理画面にログインしていない場合は、先にパスキーでログインしてください。

デバイスの承認ページ

3. コードを入力して[承認]を押す

ターミナルに表示されたコードを入力すると、CLI が求めている権限が表示されます。管理者のアカウントで承認すると、権限は「管理者フルアクセス」になります。

コードを入力したところ
自分で実行した CLI のコードだけを承認してください。画面の下にも「操作中の CLI に表示されたコードと一致する場合だけ承認してください」と書かれています。ほかの人から「このコードを入力して」と頼まれても、絶対に承認してはいけません。承認すると、その人の CLI が、あなたの権限でサイトを操作できるようになります。

[承認]を押せば完了です。このページは閉じてかまいません。

承認が完了したところ

4. ターミナルでログインを確認する

ターミナルに戻ると、Logged in as ... と表示されています。誰としてログインしているかは、emdash whoami で確かめられます。

pnpm emdash whoami --url https://your-site.example.com
ログイン完了と whoami

トークンの保存場所

項目

内容

保存場所

~/.config/emdash/auth.json(自分だけが読める権限 600 で作られる)

中身

サイトごとのアクセストークン、リフレッシュトークン、有効期限、ユーザー情報

有効期限

アクセストークンは約 1 時間。期限が切れても、リフレッシュトークンで更新される

本番サイト

URL ごとに保存される(例: https://your-site.example.com)

ローカル

path:<プロジェクトのフォルダー> の形で保存される

ログアウトするときは、次のコマンドを実行します。

pnpm emdash logout --url https://your-site.example.com
このファイルには、管理者として操作できるトークンが入っています。Git にコミットしたり、チャットに貼ったりしないでください。

使いどころの例: 日本語の全文検索を設定する

CLI のトークンは、管理画面にない設定を API で変えたいときに役立ちます。

私のサイトでは、日本語の全文検索がうまく動きませんでした。EmDash の検索は、デフォルトでは SQLite FTS5 の porter unicode61 トークナイザーを使います。これは英語向けで、日本語の文を単語に分けられません。

テスト記事 3 本で比べた結果は次のとおりです。

検索語

デフォルト(porter unicode61)

trigram

パスキー / 管理画面

○

○

デプロイ / 自動で(文の途中にある語)

×

○

画像 / D1(2 文字の語)

文の区切りの直後にあるときだけ○

×

3 文字以上の語なら、文中のどこにあっても見つかる trigram に切り替えることにしました。ただし、この設定は管理画面からは変えられず、POST /_emdash/api/search/enable という API で行います。

そこで、CLI が保存したアクセストークンを使って API を呼び、検索を有効にしているすべてのコレクションに設定しました。

# CLI が保存したアクセストークンを取り出す(Node.js を使用)
TOKEN=$(node -p "require(process.env.HOME + '/.config/emdash/auth.json')['https://your-site.example.com'].accessToken")

# コレクションごとに trigram を設定する
for c in guides releases glossary posts pages; do
  curl -s -X POST https://your-site.example.com/_emdash/api/search/enable \
    -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
    -d "{\"collection\":\"$c\",\"enabled\":true,\"tokenize\":\"trigram\"}"; echo
done
trigram を設定したところ(ドメインはダミー)

"success":true が返れば設定できています。indexed は索引に登録した記事の数で、記事がまだなければ 0 になります。

コレクション名(guides など)は、自分のサイトのものに置き換えてください。管理画面の「コンテンツタイプ」で確認できます。なお、trigram でも 2 文字の語(「画像」など)は見つかりません。2 文字の語を検索する方法は、別の記事で紹介する予定です。

自動化(CI)で使う場合

emdash login はブラウザでの承認が必要なので、人が手元で使うための方式です。GitHub Actions などの自動処理では、管理画面で発行する個人アクセストークン(ec_pat_ で始まる)を使います。

トークンのスコープは、必要な分だけに絞ります。たとえば記事の下書きを作るだけなら、content:write と media:write で足ります。自動処理には専用のユーザーを作り、ロールも必要最小限にしておきます。トークンの権限は、ユーザーのロールを超えません。トークンは CI の Secret に保存し、リポジトリには書きません。

参考