From 269a23a8b75f4491e5815fbeaec6a10171ca2b9a Mon Sep 17 00:00:00 2001 From: Jett Chen Date: Thu, 21 Nov 2024 15:10:38 +0800 Subject: [PATCH] Auth endpoint --- burrow/src/auth/server/grpc_defs.rs | 2 +- burrow/src/auth/server/grpc_server.rs | 41 +++++++++++++++++++++++ burrow/src/auth/server/mod.rs | 3 +- burrow/src/auth/server/providers/mod.rs | 2 +- burrow/src/auth/server/providers/slack.rs | 16 +++++---- 5 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 burrow/src/auth/server/grpc_server.rs diff --git a/burrow/src/auth/server/grpc_defs.rs b/burrow/src/auth/server/grpc_defs.rs index 97a5b30..5e8e5f6 100644 --- a/burrow/src/auth/server/grpc_defs.rs +++ b/burrow/src/auth/server/grpc_defs.rs @@ -1,5 +1,5 @@ pub use burrowwebrpc::*; -mod burrowwebrpc { +pub mod burrowwebrpc { tonic::include_proto!("burrowweb"); } diff --git a/burrow/src/auth/server/grpc_server.rs b/burrow/src/auth/server/grpc_server.rs new file mode 100644 index 0000000..23f2f6b --- /dev/null +++ b/burrow/src/auth/server/grpc_server.rs @@ -0,0 +1,41 @@ +use tonic::{Request, Response, Status}; + +use super::{ + grpc_defs::{ + burrowwebrpc::burrow_web_server::{BurrowWeb, BurrowWebServer}, + CreateDeviceRequest, CreateDeviceResponse, Empty, JwtInfo, ListDevicesResponse, + SlackAuthRequest, + }, + providers::slack::auth, +}; + +#[derive(Debug)] +struct BurrowGrpcServer; + +#[tonic::async_trait] +impl BurrowWeb for BurrowGrpcServer { + async fn slack_auth( + &self, + request: Request, + ) -> Result, Status> { + auth(request).await + } + + async fn create_device( + &self, + request: Request, + ) -> Result, Status> { + unimplemented!() + } + + async fn delete_device(&self, request: Request) -> Result, Status> { + unimplemented!() + } + + async fn list_devices( + &self, + request: Request, + ) -> Result, Status> { + unimplemented!() + } +} diff --git a/burrow/src/auth/server/mod.rs b/burrow/src/auth/server/mod.rs index 4071668..c6bf63a 100644 --- a/burrow/src/auth/server/mod.rs +++ b/burrow/src/auth/server/mod.rs @@ -1,5 +1,6 @@ pub mod db; -mod grpc_defs; +pub mod grpc_defs; +mod grpc_server; pub mod providers; use anyhow::Result; diff --git a/burrow/src/auth/server/providers/mod.rs b/burrow/src/auth/server/providers/mod.rs index 36ff0bd..9901c87 100644 --- a/burrow/src/auth/server/providers/mod.rs +++ b/burrow/src/auth/server/providers/mod.rs @@ -1,5 +1,5 @@ pub mod slack; -pub use super::db; +pub use super::{db, grpc_defs}; #[derive(serde::Deserialize, Default, Debug)] pub struct OpenIdUser { diff --git a/burrow/src/auth/server/providers/slack.rs b/burrow/src/auth/server/providers/slack.rs index 581cd1e..2b7d8b3 100644 --- a/burrow/src/auth/server/providers/slack.rs +++ b/burrow/src/auth/server/providers/slack.rs @@ -8,17 +8,20 @@ use reqwest::header::AUTHORIZATION; use serde::Deserialize; use super::db::store_connection; +use super::grpc_defs::{JwtInfo, SlackAuthRequest}; +use tonic::{Request as TRequest, Response as TResponse, Result as TResult, Status as TStatus}; #[derive(Deserialize)] pub struct SlackToken { slack_token: String, } -pub async fn auth(Json(payload): Json) -> (StatusCode, String) { - let slack_user = match fetch_slack_user(&payload.slack_token).await { +pub async fn auth(request: TRequest) -> TResult, TStatus> { + let slack_token = request.into_inner().slack_token; + let slack_user = match fetch_slack_user(&slack_token).await { Ok(user) => user, Err(e) => { log::error!("Failed to fetch Slack user: {:?}", e); - return (StatusCode::UNAUTHORIZED, String::new()); + return Err(TStatus::unauthenticated("Failed to fetch slack user")); } }; @@ -28,15 +31,16 @@ pub async fn auth(Json(payload): Json) -> (StatusCode, String) { slack_user.sub ); - let conn = match store_connection(slack_user, "slack", &payload.slack_token, None) { + let conn = match store_connection(slack_user, "slack", &slack_token, None) { Ok(user) => user, Err(e) => { log::error!("Failed to fetch Slack user: {:?}", e); - return (StatusCode::UNAUTHORIZED, String::new()); + return Err(TStatus::unauthenticated("Failed to store connection")); } }; - (StatusCode::OK, String::new()) + // TODO + Ok(TResponse::new(JwtInfo { jwt: "TODO".into() })) } async fn fetch_slack_user(access_token: &str) -> Result {