メインコンテンツまでスキップ

クイックスタート

Ninka は認可コンパイラです。認可を宣言的な 手形 (Tegata) として記述し、Rego/WASM へコンパイルして、型付きの check() で適用します。このガイドは、空のプロジェクトから最初の認可判定までを案内します。背景にある考え方は 認可コンパイラ を参照してください。

1. インストール

npm install ninka-authz

Node.js 20 以降が必要です。ninka CLI とランタイムが同梱されています。

2. 初期ファイルを生成する

npx ninka init

authz/ ワークスペース、lib/authz.ts 境界、AGENTS.md を生成します。詳細は CLI リファレンス を参照してください。

3. 手形を書く

ポリシーは 1 つにつき authz/<policy-id>.tegata.json に書きます。まずはルール 1 つから始めます。

{
"tegata": "0.1",
"policy": { "id": "invoice-access", "description": "Invoice access" },
"rules": [
{
"id": "allow-employee-view-invoice",
"effect": "allow",
"subject": { "roles": ["employee"] },
"actions": ["view"],
"resource": { "type": "invoice" }
}
]
}

「従業員は請求書を閲覧できる」という意味です。手形手形スキーマ を参照してください。

4. コンパイルする

npx ninka compile

関所 の検査を実行し、Rego・WASM・型付き TypeScript を authz/out/ に出力します。生成ファイル を参照してください。

5. 検証する

npx ninka verify

CI ゲートです。再コンパイルし、コミット済みの authz/out/ とのバイト単位の一致を要求します。すべてのプルリクエストで実行してください。

6. アプリで適用する

ninka initlib/authz.ts を生成しています。ハンドラから check() を呼び出します。

import { check, policies } from "@/lib/authz";

const allowed = await check(policies.invoiceAccess, {
subject: { properties: { roles: session.user.roles, user_id: session.user.id } },
action: { name: "view" },
resource: { type: "invoice", properties: { amount: invoice.amount, submitted_by: invoice.submittedBy } },
});
if (!allowed) {
return new Response("Forbidden", { status: 403 });
}
  • check() は真偽値を返します(true で続行、false で拒否)。
  • ポリシーは型付きの policies テーブルで明示的に指定します。
  • 入力の形は生成された型で検査されます。

Ninka.load・デシジョンログ・オプションについては ランタイム API を参照してください。