ys memos

Blog

Rustで簡単なJWTライブラリを実装してみた ~2. プロジェクト設定~


rust

2024/08/30


  1. 概要と使用例
  2. プロジェクト設定
  3. base64関連
  4. 署名アルゴリズム関連
  5. ヘッダ定義
  6. JWT本体の実装
  7. JWT本体のTest

本Partでは、プロジェクトの設定や構成、および基本的な型の定義を行う。


ファイル構成は以下のようにした。

.
├── Cargo.lock
└── src
    ├── error.rs
    ├── jwt
    │   ├── base64.rs
    │   ├── header
    │   │   ├── algorithm.rs
    │   │   └── mod.rs
    │   ├── mod.rs
    │   └── tests.rs
    ├── lib.rs # クレートのエントリポイント
    └── main.rs # 実行サンプル

Cargo.toml
[package]
name = "rust-chibi-jwt"
version = "0.1.0"
edition = "2021"

[dependencies]
base64 = "0.22.1"
hmac = "0.12.1"
serde = { version = "1.0.204", features = ["derive"] }
serde_json = "1.0.120"
sha2 = "0.10.8"
thiserror = "1.0.63"

外部からクレートとして利用するためのエントリポイントとなる。

ここで、「何を外に公開するか」を決める。

今回は、大量のpubがあるわけではないので、 preludeは書かない。

src/lib.rs
mod error;
mod jwt;

pub use error::Error; // エラー型の公開。これをしておかないと、他のモジュールに不便を強いることになる
pub use jwt::header::Alg; // `Jwt::new()`するときにAlgを指定するために公開
pub use jwt::Jwt;

エラー型の定義。利用するクレートのエラー型からの変換をthiserrorで定義していく。

これにより、エラー型の変換が簡単になる。

併せて、クレート内のあちこちで利用するためのResult型も定義しておく。

src/error.rs
pub(crate) type Result<T> = std::result::Result<T, Error>;

#[derive(Debug, thiserror::Error)]
pub enum Error {
    #[error("utf8 decode error {0}")]
    Utf8Decode(#[from] std::string::FromUtf8Error),

    #[error("base64 decode error {0}")]
    Base64Decode(#[from] base64::DecodeError),

    #[error("json decode error {0}")]
    JsonDecode(#[from] serde_json::Error),

    #[error("hmac error {0}")]
    HmacDigestInvalidLength(#[from] hmac::digest::InvalidLength),

    #[error("decode error: jwt must have 3 parts separated by '.'")]
    DecodeInvalidParts,

    #[error("encode error: jwt must be signed")]
    EncodeUnsigned,
}


関連タグを探す