RustでのPASETO — paseto-rsクイックスタート

paseto-rsを使ってRustでPASETO v4.publicトークンを発行・検証するクイックスタート。鍵生成とフッター処理含む。

Implementation

詳細な説明

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フッターを付加、下流サービスが起動時に設定されたマッチング公開鍵で検証します。

試してみる — PASETO Decoder

フルツールを開く