# authia
WebAssemblyを使用した高性能なEd25519 JWT検証ライブラリ
## 特徴
- 🚀 Rust + WebAssemblyによる高速なEd25519 JWT検証
- ⚡ **v0.3.0 最適化**: 同期的なシングルパスJSONパースによる最高速のパフォーマンス
- 🔒 セキュアな設計 - アルゴリズムはEd25519に固定
- 🌐 ユニバーサルランタイム対応(Node.js、ブラウザ、Cloudflare Workers)
- 📦 ランタイム依存なし
- 🎯 TypeScript型定義を同梱
- ⚡ 自動的なWasm初期化
## 📊 ベンチマーク
Cloudflare Workersやエッジランタイムのような環境において、**authia**はRustの実行効率と最小限のメモリフットプリントを活かした極めて高速な検証を提供します。
| **authia (WASM)** | **0.20ms** | **0.17ms** | **0.36ms** |
| jose (WebCrypto) | 0.30ms | 0.28ms | 0.50ms |
_authia v0.3.0での測定結果。Node.jsのネイティブCryptoモジュールはC++バインディングによりさらに高速な場合がありますが、authiaは高スループットなWASM環境(Workers等)に最適化されています。_
## インストール
```bash
npm install authia
```
## 使い方
ライブラリは環境(Node.jsまたはBundler/Workers)を自動検出し、WebAssemblyの読み込みを処理します。
### アクセストークンの検証
```typescript
import { verifyAccessToken } from "authia";
try {
// ⚡ 推奨: publicKeyJwkRawでパフォーマンス向上 (v0.2.0+)
const payload = await verifyAccessToken(token, {
publicKeyJwkRaw: process.env.JWT_PUBLIC_KEY, // 生のJWK JSON文字列
audience: "kapock-app",
issuer: "https://auth.kapock.com",
});
console.log(`ユーザーID: ${payload.sub}, メール: ${payload.email}`);
} catch (error) {
console.error("トークン検証失敗:", error);
}
```
**レガシー(サポート継続、ただし低速):**
```typescript
// Base64エンコードされたJWK(後方互換性)
const payload = await verifyAccessToken(token, {
publicKeyJwk: btoa(process.env.JWT_PUBLIC_KEY), // Base64エンコードが必要
audience: "kapock-app",
issuer: "https://auth.kapock.com",
});
```
### リフレッシュトークンの検証
```typescript
import { verifyRefreshToken } from "authia";
const payload = await verifyRefreshToken(token, {
publicKeyJwkRaw: process.env.JWT_PUBLIC_KEY, // 生JWKでパフォーマンス向上
audience: "kapock-app",
issuer: "https://auth.kapock.com",
});
console.log(`JTI: ${payload.jti}`);
```
### パフォーマンスのコツ
1. **`publicKeyJwkRaw`を使用**:`publicKeyJwk`より2〜5倍高速(高スループットシナリオ)
2. **検証オプションをWorker/プロセスレベルでキャッシュ**
3. ライブラリ内部で自動的に公開鍵をキャッシュ
```typescript
// Worker-levelキャッシングの例(Cloudflare Workers)
export async function verifyToken(token: string, env: Env) {
if (!cachedPublicKey) {
cachedPublicKey = env.JWT_PUBLIC_KEY.trim();
}
return verifyAccessToken(token, {
publicKeyJwkRaw: cachedPublicKey, // 繰り返しのtrim()呼び出しを回避
audience: "kapock-app",
issuer: "https://auth.kapock.com",
});
}
```
## ランタイムの動作
### Node.js
検証は**同期的**です。WebAssemblyモジュールは、起動時に最適化されたNode.jsターゲットとして読み込まれ、インスタンス化されます。
### Cloudflare Workers / バンドラー
検証も**同期的**です。ライブラリは、モジュールのロード時にWebAssemblyのインスタンス化を自動的に処理します。例にある `await` は互換性のために維持されていますが、検証自体はペイロードを直接返します。
## API
詳細は[APIドキュメント](./docs/api.md)を参照してください。
## ライセンス
MIT