diff options
author | Toby Vincent <tobyv@tobyvin.dev> | 2024-04-16 13:56:26 -0500 |
---|---|---|
committer | Toby Vincent <tobyv@tobyvin.dev> | 2024-04-16 13:56:26 -0500 |
commit | e607eb77d4253adfb15c8a4ce08684e16ae96674 (patch) | |
tree | 921e6d002d9e3dc761f5d1bb7fea82abd2045919 /src/auth.rs | |
parent | 469cbc20853bcae0e74922f16f7a969d1b7a9a67 (diff) |
refactor(auth): move credential resource to module
Diffstat (limited to 'src/auth.rs')
-rw-r--r-- | src/auth.rs | 51 |
1 files changed, 9 insertions, 42 deletions
diff --git a/src/auth.rs b/src/auth.rs index d2cfb3e..a27deb2 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -1,11 +1,7 @@ -use argon2::{ - password_hash::{rand_core::OsRng, SaltString}, - Argon2, PasswordHash, PasswordHasher, PasswordVerifier, -}; -use axum::{extract::State, http::StatusCode, Router}; +use argon2::{Argon2, PasswordHash, PasswordVerifier}; +use axum::{extract::State, routing::get, Router}; use axum_extra::{ headers::{authorization::Basic, Authorization}, - routing::Resource, TypedHeader, }; use uuid::Uuid; @@ -17,11 +13,15 @@ use self::{error::Error, jwt::JWT}; pub use self::claims::{AccessClaims, RefreshClaims}; pub mod claims; +pub mod credentials; pub mod error; pub mod jwt; pub fn router() -> Router<AppState> { - axum::Router::new().merge(Resource::named("users").index(issue).create(create)) + Router::new() + .route("/issue", get(issue)) + .route("/refresh", get(refresh)) + .merge(credentials::router()) } pub async fn issue( @@ -42,28 +42,6 @@ pub async fn issue( Ok((access, refresh)) } -pub async fn create( - State(state): State<AppState>, - TypedHeader(Authorization(basic)): TypedHeader<Authorization<Basic>>, -) -> Result<(StatusCode, (AccessClaims, RefreshClaims)), Error> { - let salt = SaltString::generate(&mut OsRng); - let password_hash = Argon2::default().hash_password(basic.password().as_bytes(), &salt)?; - - let uuid = sqlx::query!( - "INSERT INTO credential (password_hash) VALUES ($1) RETURNING id", - password_hash.to_string() - ) - .fetch_optional(&state.pool) - .await? - .ok_or(Error::Registration)? - .id; - - let refresh = RefreshClaims::issue(uuid); - let access = refresh.refresh(); - - Ok((StatusCode::CREATED, (access, refresh))) -} - pub async fn refresh(claims: RefreshClaims) -> AccessClaims { claims.refresh() } @@ -83,17 +61,6 @@ mod tests { use crate::tests::{setup_test_env, TestResult}; - #[test] - fn test_jwt_encode_decode() -> TestResult { - setup_test_env(); - - let claims = AccessClaims::issue(uuid::Uuid::new_v4()); - let token = JWT.encode(&claims)?; - let decoded = JWT.decode(&token)?.claims; - assert_eq!(claims, decoded); - Ok(()) - } - #[sqlx::test(fixtures(path = "../fixtures", scripts("users")))] async fn test_issue_ok(pool: PgPool) -> TestResult { setup_test_env(); @@ -106,7 +73,7 @@ mod tests { ); let request = Request::builder() - .uri("/users") + .uri("/issue") .method("GET") .header(AUTHORIZATION, auth.0.encode()) .body(Body::empty())?; @@ -127,7 +94,7 @@ mod tests { let auth = Authorization::basic("4c14f795-86f0-4361-a02f-0edb966fb145", "hunter2"); let request = Request::builder() - .uri("/users") + .uri("/issue") .method("GET") .header(AUTHORIZATION, auth.0.encode()) .body(Body::empty())?; |