summaryrefslogtreecommitdiffstats
path: root/crates/auth-service/src/server/routes/authorised.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/auth-service/src/server/routes/authorised.rs')
-rw-r--r--crates/auth-service/src/server/routes/authorised.rs103
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())
}