Node.jsでのPASETO — pasetoクイックスタート
Node.jsでpaseto npmパッケージを使ってPASETO v4.publicトークンを発行・検証するクイックスタート。鍵処理と非同期API含む。
詳細な説明
Node.jsには人気のJWTライブラリ jose と同じ著者であるFilip Skokanによる paseto npmパッケージ経由で堅実なPASETOサポートがあります。v3とv4、localとpublicをサポートします。
インストール:
npm install paseto
v4.public鍵ペアの生成:
import { V4 } from 'paseto'
const { publicKey, privateKey } = await V4.generateKey('public')
鍵は標準のNode.js KeyObject インスタンスです — .export({ format: 'pem', type: 'pkcs8' }) で保存用にシリアライズできます。
トークンの発行:
import { V4 } from 'paseto'
const token = await V4.sign(
{
sub: 'user-12345',
aud: 'https://api.example.com'
},
privateKey,
{
issuer: 'https://auth.example.com',
expiresIn: '15 minutes'
}
)
// "v4.public.eyJzdWIiOi..."
ライブラリがISO 8601変換、iat 挿入、人間に読みやすい期間からの exp 計算を処理します。
トークンの検証:
import { V4 } from 'paseto'
try {
const payload = await V4.verify(token, publicKey, {
issuer: 'https://auth.example.com',
audience: 'https://api.example.com'
})
console.log(payload.sub) // 'user-12345'
} catch (err) {
// 署名失敗、期限切れ、発行者不一致など
}
検証が何らかの理由で失敗すると — 無効な署名、exp 期限切れ、iss 不一致、aud 不一致 — Promiseがrejectされます。誤って「検証なしでデコード」するAPIはありません。
フッター:
{ footer: { kid: 'key-1' } } を sign() のオプションとして渡すと、フッターがワイヤーに含まれ署名にバインドされます。verify() は complete: true オプションを渡すとペイロードと一緒にフッターを返します。
v4.local対称トークン:
同じAPI表面:V4.encrypt() / V4.decrypt()、V4.generateKey('local') からの対称鍵を使います。暗号化されたペイロードはワイヤー上で不透明 — 対称鍵の保持者だけが読めます。
非同期のみ:
Nodeの paseto パッケージは全体的に非同期です。これは意図的で、ライブラリが現代のNodeバージョンでノンブロッキングなネイティブ暗号プリミティブを使えるようにします。
ユースケース
Node.js認証サービスがpaseto npmパッケージでv4.publicトークンを発行し、expiresIn経由でexpを設定、すべてのAPIエンドポイントでaudienceとissuerピンニング付きで検証します。