2024/08/30
目次
- 概要と使用例
- プロジェクト設定
- base64関連
- 署名アルゴリズム関連
- ヘッダ定義
- JWT本体の実装
- 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
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"
lib.rs
外部からクレートとして利用するためのエントリポイントとなる。
ここで、「何を外に公開するか」を決める。
今回は、大量の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;
error.rs
エラー型の定義。利用するクレートのエラー型からの変換を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,
}