summaryrefslogtreecommitdiffstats
path: root/src/auth.rs
diff options
context:
space:
mode:
authorToby Vincent <tobyv@tobyvin.dev>2024-04-16 13:56:26 -0500
committerToby Vincent <tobyv@tobyvin.dev>2024-04-16 13:56:26 -0500
commite607eb77d4253adfb15c8a4ce08684e16ae96674 (patch)
tree921e6d002d9e3dc761f5d1bb7fea82abd2045919 /src/auth.rs
parent469cbc20853bcae0e74922f16f7a969d1b7a9a67 (diff)
refactor(auth): move credential resource to module
Diffstat (limited to 'src/auth.rs')
-rw-r--r--src/auth.rs51
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())?;