diff options
author | rtkay123 <dev@kanjala.com> | 2025-08-02 13:15:22 +0200 |
---|---|---|
committer | rtkay123 <dev@kanjala.com> | 2025-08-02 13:15:22 +0200 |
commit | 9d9e800664503b1e2051ee4e05d83a880e63c6f4 (patch) | |
tree | b0fa9f8a265d5fd812c3d9d17ff8ce8a82ced73d /crates/auth-service/src/server/routes/authorised.rs | |
parent | 259cad06f8d88db9ddfa85c2c188b5b0130cb393 (diff) | |
download | sellershut-9d9e800664503b1e2051ee4e05d83a880e63c6f4.tar.bz2 sellershut-9d9e800664503b1e2051ee4e05d83a880e63c6f4.zip |
feat(auth): register profile
Diffstat (limited to 'crates/auth-service/src/server/routes/authorised.rs')
-rw-r--r-- | crates/auth-service/src/server/routes/authorised.rs | 103 |
1 files changed, 25 insertions, 78 deletions
diff --git a/crates/auth-service/src/server/routes/authorised.rs b/crates/auth-service/src/server/routes/authorised.rs index b4c2e00..9b97cd2 100644 --- a/crates/auth-service/src/server/routes/authorised.rs +++ b/crates/auth-service/src/server/routes/authorised.rs @@ -9,10 +9,14 @@ use axum::{ use axum_extra::{TypedHeader, headers}; use oauth2::{AuthorizationCode, TokenResponse}; use reqwest::{StatusCode, header::SET_COOKIE}; -use sellershut_core::users::CreateUserRequest; +use sellershut_core::{ + auth::{RegisterUserRequest, auth_server::Auth, register_user_request::AccountDetails}, + users::CreateUserRequest, +}; use serde::{Deserialize, Serialize}; use sqlx::types::uuid; use time::OffsetDateTime; +use tonic::IntoRequest; use tower_sessions::{ SessionStore, session::{Id, Record}, @@ -23,7 +27,8 @@ use crate::{ auth::Claims, error::AppError, server::{ - csrf_token_validation::csrf_token_validation_workflow, keys::generate_actor_keypair, routes::Provider, OAUTH_CSRF_COOKIE + OAUTH_CSRF_COOKIE, csrf_token_validation::csrf_token_validation_workflow, + grpc::auth::DbUser, keys::generate_actor_keypair, routes::Provider, }, state::AppHandle, }; @@ -35,7 +40,7 @@ pub struct AuthRequest { pub state: String, } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, Clone)] struct User { id: String, avatar: Option<String>, @@ -45,15 +50,6 @@ struct User { email: String, } -#[derive(Debug, Deserialize, Serialize)] -struct DbUser { - id: Uuid, - email: String, - private_key: String, - created_at: OffsetDateTime, - updated_at: OffsetDateTime, -} - /// The cookie to store the session id for user information. const SESSION_COOKIE: &str = "info"; const SESSION_DATA_KEY: &str = "data"; @@ -102,8 +98,6 @@ pub async fn login_authorised( // Create a new session filled with user data let session_id = Id(i128::from_le_bytes(uuid::Uuid::new_v4().to_bytes_le())); - let mut transaction = state.services.postgres.begin().await?; - let user = sqlx::query_as!( DbUser, " @@ -120,53 +114,29 @@ pub async fn login_authorised( provider, user_data.id ) - .fetch_optional(&mut *transaction) + .fetch_optional(&state.services.postgres) .await?; - let keys = generate_actor_keypair()?; - let user = if let Some(user) = user { - user + user.id } else { - let uuid = uuid::Uuid::now_v7(); - let user = sqlx::query_as!( - DbUser, - "insert into auth_user (id, email, private_key) values ($1, $2, $3) - on conflict (email) do update - set email = excluded.email - returning *; - ", - uuid, - user_data.email, - keys.private_key, - ) - .fetch_one(&mut *transaction) - .await?; - - sqlx::query_as!( - DbUser, - "with upsert as ( - insert into oauth_account (provider_id, provider_user_id, user_id) values ($1, $2, $3) - on conflict (provider_id, provider_user_id) do update - set provider_id = excluded.provider_id -- no-op - returning user_id - ) - select u.* - from upsert - join auth_user u on u.id = upsert.user_id; - ", - provider, - user_data.id, - user.id - ) - .fetch_one(&mut *transaction) - .await? + let data = user_data.clone(); + let request = RegisterUserRequest { + email: data.email, + account: Some(AccountDetails { + provider_id: provider, + provider_user_id: data.id, + }) + }; + + let resp = state.register_user(request.into_request()).await.unwrap().into_inner(); + Uuid::parse_str(&resp.auth_id).unwrap() }; let exp = OffsetDateTime::now_utc() + Duration::from_secs(15 * 60); let claims = Claims { - sub: user.id, + sub: user, exp: exp.unix_timestamp(), iss: "sellershut".to_owned(), sid: session_id.to_string(), @@ -182,18 +152,6 @@ pub async fn login_authorised( ), )?; - - let user_request = CreateUserRequest { - email: user_data.email.to_owned(), - avatar: user_data.avatar.as_ref().map(|value| { - format!( - "https://cdn.discordapp.com/avatars/{}/{value}", - user_data.id - ) - }), - public_key: keys.public_key, - }; - store .create(&mut Record { id: session_id, @@ -210,31 +168,20 @@ pub async fn login_authorised( sqlx::query!( "insert into token (user_id, token, session_id) values ($1, $2, $3)", - user.id, + user, token, session_id.to_string() ) - .execute(&mut *transaction) + .execute(&state.services.postgres) .await?; let cookie = format!("{SESSION_COOKIE}={session_id}; SameSite=Lax; HttpOnly; Secure; Path=/"); - let mut profile_client = state.users_client.clone(); - let resp = profile_client.create_user(user_request).await?.into_inner(); - - let user_id = resp.temp_id; - let mut headers = HeaderMap::new(); headers.insert( SET_COOKIE, cookie.parse().context("failed to parse cookie")?, ); - transaction.commit().await?; - - Ok(( - headers, - Redirect::to(&format!("/?user={user_id}&token={token}")), - ) - .into_response()) + Ok((headers, Redirect::to(&format!("/?token={token}"))).into_response()) } |