Auth endpoint

This commit is contained in:
Jett Chen 2024-11-21 15:10:38 +08:00
parent 82d6eaa2a8
commit 269a23a8b7
5 changed files with 55 additions and 9 deletions

View file

@ -1,5 +1,5 @@
pub use burrowwebrpc::*; pub use burrowwebrpc::*;
mod burrowwebrpc { pub mod burrowwebrpc {
tonic::include_proto!("burrowweb"); tonic::include_proto!("burrowweb");
} }

View file

@ -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<SlackAuthRequest>,
) -> Result<Response<JwtInfo>, Status> {
auth(request).await
}
async fn create_device(
&self,
request: Request<CreateDeviceRequest>,
) -> Result<Response<CreateDeviceResponse>, Status> {
unimplemented!()
}
async fn delete_device(&self, request: Request<JwtInfo>) -> Result<Response<Empty>, Status> {
unimplemented!()
}
async fn list_devices(
&self,
request: Request<JwtInfo>,
) -> Result<Response<ListDevicesResponse>, Status> {
unimplemented!()
}
}

View file

@ -1,5 +1,6 @@
pub mod db; pub mod db;
mod grpc_defs; pub mod grpc_defs;
mod grpc_server;
pub mod providers; pub mod providers;
use anyhow::Result; use anyhow::Result;

View file

@ -1,5 +1,5 @@
pub mod slack; pub mod slack;
pub use super::db; pub use super::{db, grpc_defs};
#[derive(serde::Deserialize, Default, Debug)] #[derive(serde::Deserialize, Default, Debug)]
pub struct OpenIdUser { pub struct OpenIdUser {

View file

@ -8,17 +8,20 @@ use reqwest::header::AUTHORIZATION;
use serde::Deserialize; use serde::Deserialize;
use super::db::store_connection; 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)] #[derive(Deserialize)]
pub struct SlackToken { pub struct SlackToken {
slack_token: String, slack_token: String,
} }
pub async fn auth(Json(payload): Json<SlackToken>) -> (StatusCode, String) { pub async fn auth(request: TRequest<SlackAuthRequest>) -> TResult<TResponse<JwtInfo>, TStatus> {
let slack_user = match fetch_slack_user(&payload.slack_token).await { let slack_token = request.into_inner().slack_token;
let slack_user = match fetch_slack_user(&slack_token).await {
Ok(user) => user, Ok(user) => user,
Err(e) => { Err(e) => {
log::error!("Failed to fetch Slack user: {:?}", 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<SlackToken>) -> (StatusCode, String) {
slack_user.sub 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, Ok(user) => user,
Err(e) => { Err(e) => {
log::error!("Failed to fetch Slack user: {:?}", 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<super::OpenIdUser> { async fn fetch_slack_user(access_token: &str) -> Result<super::OpenIdUser> {