クイックスタート
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 init が lib/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 を参照してください。