Skip to content

Commit

Permalink
test: Add integration test
Browse files Browse the repository at this point in the history
  • Loading branch information
cmackenzie1 committed Jan 2, 2025
1 parent 1cf1547 commit 0ac2308
Show file tree
Hide file tree
Showing 4 changed files with 169 additions and 0 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ tokio = { version = "1", default-features = false, features = [
"rt-multi-thread",
"macros",
] }
serde_json = "1"

[[example]]
name = "local"
Expand Down
103 changes: 103 additions & 0 deletions tests/integration_test.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
use axum::{
extract::FromRef,
response::IntoResponse,
routing::{get, post},
Json, Router,
};

use axum_jwt_auth::{Claims, Decoder, JwtDecoderState, LocalDecoder};
use chrono::{Duration, Utc};
use jsonwebtoken::{encode, Algorithm, DecodingKey, EncodingKey, Header, Validation};
use serde::{Deserialize, Serialize};

#[derive(Clone, FromRef)]
struct AppState {
decoder: JwtDecoderState,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct MyClaims {
iat: u64,
aud: String,
exp: u64,
}

#[tokio::test]
async fn token_is_valid() {
// Load the keys
let encoding_key = EncodingKey::from_rsa_pem(include_bytes!("jwt.key")).unwrap();
let decoding_key = DecodingKey::from_rsa_pem(include_bytes!("jwt.key.pub")).unwrap();

let mut validation = Validation::new(Algorithm::RS256);
validation.set_audience(&["https://example.com"]);
let decoder: Decoder = LocalDecoder::new(vec![decoding_key.to_owned()], validation).into();
let state = AppState {
decoder: JwtDecoderState { decoder },
};

let app = Router::new()
.route("/", get(|| async { "Hello, World!" }))
.route(
"/user_info",
get(|Claims(claims): Claims<MyClaims>| async { Json(claims) }),
)
.route(
"/login",
post(|| async move {
let mut header = Header::new(Algorithm::RS256);
header.kid = Some("test".to_string());

let exp = Utc::now() + Duration::hours(1);
let claims = MyClaims {
iat: 1234567890,
aud: "https://example.com".to_string(),
exp: exp.timestamp() as u64,
};

let token = encode::<MyClaims>(&header, &claims, &encoding_key).unwrap();

token.into_response()
}),
)
.with_state(state);

// run it on localhost:3000
tokio::spawn(async move {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
});

// Test the server
let client = reqwest::Client::new();

// Unauthorized
let res = client
.get("http://localhost:3000/user_info")
.send()
.await
.unwrap();
assert_eq!(res.status(), 401);

// Login
let res = client
.post("http://localhost:3000/login")
.send()
.await
.unwrap();
let token = res.text().await.unwrap();

// Authorized with token
let res = client
.get("http://localhost:3000/user_info")
.header("Authorization", format!("Bearer {}", token))
.send()
.await
.unwrap();

assert_eq!(res.status(), 200);
let body = res.text().await.unwrap();
let claims: MyClaims = serde_json::from_str(&body).unwrap();
assert_eq!(claims.aud, "https://example.com");
assert_eq!(claims.iat, 1234567890);
assert!(claims.exp > Utc::now().timestamp() as u64);
}
51 changes: 51 additions & 0 deletions tests/jwt.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
14 changes: 14 additions & 0 deletions tests/jwt.key.pub
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsPWeaqsN+2KZu9rlto59
XASssMoaVjIxMYXtLyifky1sXS4EvYFnvr37X63B+lMwuZ3xACc7xsUPK+GXPe6X
qZGJdj+Wgf7a3J6FieSNpnrDK4x6CMr0iAPgIhoEYp7BUyPKzPv21vMl6A5kJvlA
AdxfPm3jhk5NDWHSfiFnWiC7UESARgyFl0TlJ+f9H3qaArkzp3Cb+m+wlHpleewO
Sr9maTPLdIS+ZzZ1ZC4lDIQnetJJ0kue+o1wAL4VmdBMY8IVxEutPAaZO+9G8eYJ
ywZiDDkcrrqWymDvSUarcB/AOzEQjxN6nSSNuW6UbalfnDlGmR0kFK8fopraA4nw
U4tG6fAuKTPpOmahC910IRAkedOp6IrRU+2LmcBQ0oyzukHjXd9o9/5MES2wTDFg
ZBalVRZCo55vdQt5CtQDQWVUbQ1y95dm/0EmmgZzWBgiguSKcO2QuqwYIiq5t9ui
kFleeVQDVnd+V6yZ5wWfnA6H0+dPw4VTEUkxaTN8jQImQtB9gvj8iknsGX08LGF5
WjWh1ewJI0L74Ey5T/ytsXME6Xpn1qfXB2sr5tPol3KeV8pjuGrAymvaLJZz4ZqN
Y3f4wULfCsyVasUOdknMm8UmTgPR+vnDlF+1ItsmN+Jl+RJ1dFkXRDcelCIJS44s
MSchnxv47OwnqvBHCPbiUI8CAwEAAQ==
-----END PUBLIC KEY-----

0 comments on commit 0ac2308

Please sign in to comment.