第7章:セキュリティと認証

7.1 概要

セキュリティメカニズムはプロトコルの重要な構成要素であり、スキル提供者が誰がスキルを発見・呼び出せるかを制御できることを保証します。プロトコルは複数の認証方式とアクセス制御ポリシーをサポートし、オープン性とセキュリティのバランスを取ります。

7.2 アクセス制御ポリシー

3レベルアクセス制御

レベル発見可視性呼び出し権限適用シナリオ
public全員に可視認証不要で呼び出し可能オープンAPI、公開ナレッジベース
restricted全員に可視認証後に呼び出し可能商用API、有料サービス
private認証後のみ可視認証後に呼び出し可能内部ツール、プライベートサービス

アクセス制御と発見の関係

  • 未認証リクエストがWell-Known URIにアクセスした場合:
    • すべてのpublicおよびrestrictedスキルを返す
    • privateスキルは返さない
  • 認証済みリクエストがWell-Known URIにアクセスした場合:
    • すべてのスキルを返す(privateを含む)

7.3 認証方式

API Key認証

最もシンプルな認証方式。HTTP Headerを通じてキーを渡します。

Descriptor宣言:

{
  "type": "api_key",
  "description": "HTTP Headerを通じてAPI Keyを渡す",
  "header": "X-API-Key"
}

呼び出し時のHeader付加:

POST /invoke HTTP/1.1
Host: api.example.com
X-API-Key: sk-your-api-key-here
Content-Type: application/json

OAuth 2.0認証

きめ細かい権限制御が必要なシナリオに適しています。

Descriptor宣言:

{
  "type": "oauth2",
  "oauth2": {
    "authorization_url": "https://example.com/oauth/authorize",
    "token_url": "https://example.com/oauth/token",
    "scopes": {
      "skill:invoke": "スキルの呼び出し",
      "skill:read": "スキル情報の読み取り",
      "skill:admin": "スキル設定の管理"
    }
  }
}

呼び出し時のBearer Token付加:

POST /invoke HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Content-Type: application/json

カスタム認証

非標準の認証シナリオに適しています。提供者はinstructionsフィールドを通じて認証方式を説明します。

Descriptor宣言:

{
  "type": "custom",
  "custom": {
    "instructions": "HMAC-SHA256でリクエストボディに署名し、署名をX-Signature headerに配置する",
    "parameters": [
      {
        "name": "secret_key",
        "type": "string",
        "description": "HMAC署名用の秘密鍵",
        "required": true
      }
    ]
  }
}

認証なし

公開スキルは認証不要:

{
  "type": "none"
}

7.4 認証エラー処理

認証失敗(401)

有効な資格情報が提供されない場合:

{
  "error": {
    "code": "AUTH_REQUIRED",
    "message": "Authentication is required to invoke this skill",
    "details": {
      "required_auth_type": "oauth2",
      "authorization_url": "https://example.com/oauth/authorize"
    }
  }
}

権限不足(403)

資格情報は有効だがアクセス権がない場合:

{
  "error": {
    "code": "PERMISSION_DENIED",
    "message": "Insufficient permissions to invoke this skill",
    "details": {
      "required_scopes": ["skill:invoke"],
      "current_scopes": ["skill:read"]
    }
  }
}

7.5 セキュリティベストプラクティス

  1. すべての通信はHTTPSを使用すべき
  2. API KeyはHeaderを通じて渡し、URLへの露出を避ける
  3. OAuth 2.0 Tokenには適切な有効期限を設定する
  4. スキル提供者は悪用防止のためレート制限を実装すべき
  5. 機密性の高いスキルはprivateアクセスポリシーを使用し、未認可者による発見を防ぐ