use genies_core::jwt::*;
use genies_core::error::*;
use genies_core::RespVO;
use salvo::prelude::*;
use salvo::http::StatusCode;
use crate::app_context::ApplicationContext;
use crate::CONTEXT;
pub fn is_white_list_api(
context: &ApplicationContext,
path: &str) -> bool {
if path.eq("/") {
return true;
}
for x in &context.config.white_list_api {
if x.contains(path) {
return true;
}
if x.ends_with("*") {
let white_apis: Vec<&str> = x.split("*").collect();
let starts_with = white_apis.get(0).unwrap();
if path.contains(starts_with) {
return true;
}
}
}
return false;
}
pub async fn checked_token(
context: &ApplicationContext,
token: &str,
_path: &str,
) -> Result<JWTToken, Error> {
let token_value = token
.strip_prefix("Bearer ")
.unwrap_or("");
match &context.config.keycloak_auth_server_url.is_empty() {
false => {
let keycloak = &context.keycloak_keys;
return JWTToken::verify_with_keycloak(keycloak, token_value);
}
_ => {
return Err(genies_core::error::Error::from("jwt_key error".to_string()));
}
};
}
pub async fn check_auth(
_context: &ApplicationContext,
_token: &JWTToken, _path: &str) -> Result<(), Error> {
return Ok(());
}
#[handler]
pub async fn salvo_auth(req: &mut Request,_depot: &mut Depot,res: &mut Response, _ctrl: &mut FlowCtrl) {
let token = req.headers().get("Authorization").map(|v|v.to_str().unwrap_or_default().to_string()).unwrap_or_default();
let path =req.uri().path().to_string();
if !is_white_list_api(&CONTEXT,&path) {
match checked_token(&CONTEXT, &token, &path).await {
Ok(data) => {
match check_auth(&CONTEXT, &data, &path).await {
Ok(_) => {
_depot.insert("jwtToken",data.clone());
_depot.insert("token",token);
}
Err(e) => {
let resp: RespVO<String> = RespVO {
code: Some("-1".to_string()),
msg: Some(format!("无权限访问:{}", e.to_string())),
data: None,
};
res.status_code(StatusCode::FORBIDDEN);
res.render(Json(resp));
}
}
}
Err(e) => {
let resp: RespVO<String> = RespVO {
code: Some("-1".to_string()),
msg: Some(format!("Unauthorized for:{}", e.to_string())),
data: None,
};
res.status_code(StatusCode::UNAUTHORIZED);
res.render(Json(resp));
}
}
}
}