Support for slack auth

This commit is contained in:
Jett Chen 2024-11-21 19:44:44 +08:00
parent 820f619aeb
commit d60b70ffb4
4 changed files with 13 additions and 6 deletions

View file

@ -49,7 +49,7 @@ pub fn init_db() -> Result<()> {
} }
pub fn store_connection( pub fn store_connection(
openid_user: super::providers::OpenIdUser, openid_user: &super::providers::OpenIdUser,
openid_provider: &str, openid_provider: &str,
access_token: &str, access_token: &str,
refresh_token: Option<&str>, refresh_token: Option<&str>,

View file

@ -25,7 +25,7 @@ impl BurrowWeb for BurrowGrpcServer {
&self, &self,
request: Request<SlackAuthRequest>, request: Request<SlackAuthRequest>,
) -> Result<Response<JwtInfo>, Status> { ) -> Result<Response<JwtInfo>, Status> {
auth(request).await auth(request, &self.jwt_keypair).await
} }
async fn create_device( async fn create_device(

View file

@ -58,6 +58,7 @@ mod tests {
name: "Inquisition".into(), name: "Inquisition".into(),
}; };
let encoded = JwtInfo::try_from_oid(sample_usr.clone(), &key_pair)?; let encoded = JwtInfo::try_from_oid(sample_usr.clone(), &key_pair)?;
println!("{}", encoded.jwt);
let decoded = OpenIdUser::try_from_jwt(&encoded, &key_pair)?; let decoded = OpenIdUser::try_from_jwt(&encoded, &key_pair)?;
assert_eq!(decoded, sample_usr); assert_eq!(decoded, sample_usr);
Ok(()) Ok(())

View file

@ -9,13 +9,17 @@ use serde::Deserialize;
use super::db::store_connection; use super::db::store_connection;
use super::grpc_defs::{JwtInfo, SlackAuthRequest}; use super::grpc_defs::{JwtInfo, SlackAuthRequest};
use super::KeypairT;
use tonic::{Request as TRequest, Response as TResponse, Result as TResult, Status as TStatus}; 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(request: TRequest<SlackAuthRequest>) -> TResult<TResponse<JwtInfo>, TStatus> { pub async fn auth(
request: TRequest<SlackAuthRequest>,
key_pair: &KeypairT,
) -> TResult<TResponse<JwtInfo>, TStatus> {
let slack_token = request.into_inner().slack_token; let slack_token = request.into_inner().slack_token;
let slack_user = match fetch_slack_user(&slack_token).await { let slack_user = match fetch_slack_user(&slack_token).await {
Ok(user) => user, Ok(user) => user,
@ -31,7 +35,7 @@ pub async fn auth(request: TRequest<SlackAuthRequest>) -> TResult<TResponse<JwtI
slack_user.sub slack_user.sub
); );
let conn = match store_connection(slack_user, "slack", &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);
@ -39,8 +43,10 @@ pub async fn auth(request: TRequest<SlackAuthRequest>) -> TResult<TResponse<JwtI
} }
}; };
// TODO Ok(TResponse::new(
Ok(TResponse::new(JwtInfo { jwt: "TODO".into() })) JwtInfo::try_from_oid(slack_user, &key_pair)
.map_err(|e| TStatus::unauthenticated(format!("JWT Generation failed: {e}")))?,
))
} }
async fn fetch_slack_user(access_token: &str) -> Result<super::OpenIdUser> { async fn fetch_slack_user(access_token: &str) -> Result<super::OpenIdUser> {