RustでのPASETO — paseto-rsクイックスタート
paseto-rsを使ってRustでPASETO v4.publicトークンを発行・検証するクイックスタート。鍵生成とフッター処理含む。
詳細な説明
Rustには rusty_paseto クレート(paseto-rsとも呼ばれる)経由で優れたPASETOサポートがあります。v1〜v4、localとpublic両方、加えてPASERKをサポートします。
Cargo.toml:
[dependencies]
rusty_paseto = { version = "0.7", features = ["v4_public", "v4_local"] }
serde_json = "1"
v4.public鍵ペアの生成:
use rusty_paseto::core::{Key, V4, Public};
let private = Key::<64>::try_new_random()?; // Ed25519秘密鍵
let public = Key::<32>::try_from(&private[32..])?; // 末尾32バイトが公開部分
実際には、鍵タイプを処理してくれる高レベル PasetoBuilder APIを使います。
v4.publicトークンの発行:
use rusty_paseto::prelude::*;
let token = PasetoBuilder::<V4, Public>::default()
.set_claim(IssuerClaim::from("https://auth.example.com"))
.set_claim(SubjectClaim::from("user-12345"))
.set_claim(AudienceClaim::from("https://api.example.com"))
.set_claim(ExpirationClaim::try_from("2026-01-01T00:00:00Z")?)
.build(&private_key)?;
結果は v4.public.eyJpc3MiOi... のような文字列です。
v4.publicトークンの検証:
use rusty_paseto::prelude::*;
let parsed = PasetoParser::<V4, Public>::default()
.check_claim(IssuerClaim::from("https://auth.example.com"))
.check_claim(AudienceClaim::from("https://api.example.com"))
.parse(&token, &public_key)?;
let payload: serde_json::Value = serde_json::from_value(parsed)?;
パーサーは署名が無効、または check_claim のいずれかが失敗した場合、クレームを返すことを拒否します — 誤って未検証ペイロードを信頼することはできません。
フッター:
ビルド時に .set_footer(Footer::from("{"kid":"key-1"}")) でフッターを追加し、解析されたトークンからパーサーAPI経由で読み取ります。フッターは署名の一部として検証されます。
PASETOにRustを使う理由:
Rustの強い型システムはPASETOのバージョン+用途モデルにきれいにマップされます — PasetoBuilder<V4, Public> と PasetoBuilder<V4, Local> は異なる型なので、誤って入れ替えることが文字通りできません。ライブラリはこれを活用してコンパイル時に誤用を防ぎます。
ユースケース
RustマイクロサービスがPasetoBuilderでv4.publicトークンを発行しkidフッターを付加、下流サービスが起動時に設定されたマッチング公開鍵で検証します。