# Skillの認証

SkillのcredentialはXMEMO_KEYまたはサポートされているdevice-login flowで管理し、public outputには決して含めません。

- Canonical: https://docs.xmemo.dev/ja/docs/skills/authentication
- Locale: ja-JP
- Content-Locale: ja-JP
- Canonical-Content-Digest: be9eeb314af1163f47f713234e990cb81a2e76a585a0fe87f77a4a45fcecb506
- Edition-Digest: 6bdd1150ebff22a8fda06a889711acf6928f580e54a8f5c31cd94f87c04f06a0
- Source-Revision: sha256:bd8b11d078e9e281fe66b1a4a5591f15aaaae0518de04b052b0c28ef43a177c1

## Credential解決の優先順位

standalone Skill runtimeは厳格な3段階の優先順位を使用してcredentialを解決します。管理対象の外部シークレットは常にローカルファイルより優先され、環境シークレットが指定されている場合にtokenがディスクに重複して保存されるのを防ぎます。

- 1. XMEMO_KEY: 環境変数またはマネージドシークレットストア（Doppler、1Password、Vault）。推奨されます。ローカルのcredentialファイルにコピーされることはありません。
- 2. Meta Muse Secure Vault: サポートされているMeta Muse環境におけるサロゲートVault解決。
- 3. ローカルcredentialファイル: ~/.xmemo/skill-credentials.json（または $XMEMO_CREDENTIALS_PATH）。環境credentialが未設定の場合のフォールバックとしてのみ読み取られます。
- OpenClaw egress要件: OpenClaw egressはXMEMO_KEYブランチ（auth-state.mjs）内で処理されるトランスポート要件です。OpenClawセンチネルが検出された場合、egress proxyの到達可能性が強制されます。これはXMEMO_KEY内のトランスポート検証であり、独立したcredentialソースではありません。
- Token露出ゼロ: コマンドおよびdoctor診断において、アクティブなtokenやシークレットプレフィックスが出力されることは決してありません。

```bash
# Preferred: provide credential via environment or secret store
export XMEMO_KEY='<your-xmemo-token>'

# Inspect active credential source and scopes without printing secrets:
node scripts/xmemo-skill.mjs auth status --verify
```

## デバイスログインと十分な情報に基づくプレーンテキストの選択

管理対象の環境キーが存在しない場合、対話型セットアップではブラウザベースのデバイス認証を使用します。ユーザーはブラウザでアクセスを承認し、ブラウザにbearer tokenの値が表示されることはありません。

- 明示的なプレーンテキスト同意: loginコマンドでは、ローカルマシンに暗号化されずにtokenを保存することに対する十分な情報に基づく同意を確認するために --allow-plaintext が必要です。
- 制限されたファイルパーミッション: ~/.xmemo/skill-credentials.json は0600 POSIXパーミッション（所有者のみ読み書き可能）で作成されます。
- 安全なstdinインポート: auth add --from-stdin --allow-plaintext を使用して標準入力経由で既存のtokenをインポートし、コマンドライン引数やシェル履歴への記録を回避します。
- デバイス認証エンドポイント: POST /v1/auth/device/start（フロー開始）、POST /v1/auth/device/token（ポーリングと交換）、POST /v1/auth/token/validate（検証）、POST /v1/auth/token/revoke-self（失効）。

```bash
# Start interactive device login (requires explicit plaintext flag):
node scripts/xmemo-skill.mjs login --allow-plaintext

# Or pipe an existing token securely from standard input:
printf '%s' "$XMEMO_KEY" | node scripts/xmemo-skill.mjs auth add --from-stdin --allow-plaintext

# Verify active session status:
node scripts/xmemo-skill.mjs auth status --verify
```

## 一時登録の境界

無人環境や人間が正式なログインを拒否した場合、Skillは一時的な記憶サンドボックスを登録できます。一時記憶は厳密に制限されており、短期間の運用継続性のみを目的としています。

- 無人または拒否された場合のみ: node scripts/xmemo-skill.mjs register --reason <unattended|declined> --allow-plaintext。
- 容量上限: 最大100アイテムに制限されます。
- 保持TTL: 14日間の非アクティブTTLおよび30日間の絶対最大ライフタイム。
- 2段階クレームハンドオフ: オペレーターが一時アカウントを申請して正式なcredentialにバインドできるようにするバインドURL（bind_url）を発行します。
- クレーム管理コマンド: auth claim-status で保留中のクレームを確認し、auth claim-confirm で正式なtokenハンドオフを受け入れ、auth claim-deny でバインドを拒否します。
- サンドボックスの制限事項: 一時アカウントでは、再起動スナップショットの取得（restart-snapshot）やKnowledgeベースへのアクセス（recall-context --include_knowledge true）はできません。

```bash
# Register temporary sandbox:
node scripts/xmemo-skill.mjs register --reason unattended --allow-plaintext

# Inspect and manage claim binding:
node scripts/xmemo-skill.mjs auth claim-status --allow-plaintext
node scripts/xmemo-skill.mjs auth claim-confirm --allow-plaintext
node scripts/xmemo-skill.mjs auth claim-deny --allow-plaintext
```

## ログアウトとプロバイダーに応じた失効

ログアウトすると、ローカルのcredentialファイルのリンクが解除され、サーバー上のアクティブなセッショントークンが自己失効します。外部シークレットプロバイダーはそれぞれの環境で管理する必要があります。

- ローカルセッションのログアウト: node scripts/xmemo-skill.mjs logout は ~/.xmemo/skill-credentials.json を削除し、/v1/auth/token/revoke-self を呼び出します。
- 外部環境トークン: XMEMO_KEY がアクティブなcredentialを提供している場合、--revoke-environment-token が明示的に渡されない限り、ログアウトしてもそのtokenは保持されます。
- ローカル削除はグローバル失効ではない: ローカルのskillディレクトリの削除やローカルでのログアウトを行っても、クラウドシークレットVault、CI/CDランナー、または他のマシンに保存されているtokenは失効しません。
- 外部のクリーンアップ: シェルで XMEMO_KEY を設定解除するか、シークレットマネージャーからシークレットを削除して、アクセス権限を恒久的に解除します。

```bash
# Log out and revoke local credential file:
node scripts/xmemo-skill.mjs logout

# Log out and revoke external environment token remotely:
node scripts/xmemo-skill.mjs logout --revoke-environment-token
```

