Add API tokens support #9
@ -17,6 +17,7 @@ pub struct Token {
|
|||||||
pub description: String,
|
pub description: String,
|
||||||
created: u64,
|
created: u64,
|
||||||
updated: u64,
|
updated: u64,
|
||||||
|
#[serde(skip_serializing_if = "TokenPubKey::is_invalid")]
|
||||||
pub pub_key: TokenPubKey,
|
pub pub_key: TokenPubKey,
|
||||||
pub rights: Vec<TokenRights>,
|
pub rights: Vec<TokenRights>,
|
||||||
pub last_used: Option<u64>,
|
pub last_used: Option<u64>,
|
||||||
@ -121,7 +122,7 @@ pub async fn create(t: &NewToken) -> anyhow::Result<(Token, TokenPrivKey)> {
|
|||||||
Ok((token, priv_key))
|
Ok((token, priv_key))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the entire list of api toksn
|
/// Get the entire list of api tokens
|
||||||
pub async fn full_list() -> anyhow::Result<Vec<Token>> {
|
pub async fn full_list() -> anyhow::Result<Vec<Token>> {
|
||||||
let mut list = Vec::new();
|
let mut list = Vec::new();
|
||||||
for f in std::fs::read_dir(AppConfig::get().api_tokens_path())? {
|
for f in std::fs::read_dir(AppConfig::get().api_tokens_path())? {
|
||||||
@ -129,3 +130,8 @@ pub async fn full_list() -> anyhow::Result<Vec<Token>> {
|
|||||||
}
|
}
|
||||||
Ok(list)
|
Ok(list)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the information about a single token
|
||||||
|
pub async fn get_single(id: TokenID) -> anyhow::Result<Token> {
|
||||||
|
Token::load_from_file(&AppConfig::get().api_token_definition_path(id))
|
||||||
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//! # API tokens management
|
//! # API tokens management
|
||||||
|
|
||||||
use crate::api_tokens;
|
use crate::api_tokens;
|
||||||
use crate::api_tokens::NewToken;
|
use crate::api_tokens::{NewToken, TokenID};
|
||||||
use crate::controllers::api_tokens_controller::rest_token::RestToken;
|
use crate::controllers::api_tokens_controller::rest_token::RestToken;
|
||||||
use crate::controllers::HttpResult;
|
use crate::controllers::HttpResult;
|
||||||
use crate::utils::jwt_utils::TokenPrivKey;
|
use crate::utils::jwt_utils::TokenPrivKey;
|
||||||
@ -58,3 +58,15 @@ pub async fn list() -> HttpResult {
|
|||||||
|
|
||||||
Ok(HttpResponse::Ok().json(list))
|
Ok(HttpResponse::Ok().json(list))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
pub struct TokenIDInPath {
|
||||||
|
uid: TokenID,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the information about a single token
|
||||||
|
pub async fn get_single(path: web::Path<TokenIDInPath>) -> HttpResult {
|
||||||
|
let token = api_tokens::get_single(path.uid).await?;
|
||||||
|
|
||||||
|
Ok(HttpResponse::Ok().json(RestToken::new(token)))
|
||||||
|
}
|
||||||
|
@ -286,11 +286,11 @@ async fn main() -> std::io::Result<()> {
|
|||||||
"/api/tokens/list",
|
"/api/tokens/list",
|
||||||
web::get().to(api_tokens_controller::list),
|
web::get().to(api_tokens_controller::list),
|
||||||
)
|
)
|
||||||
/* TODO .route(
|
.route(
|
||||||
"/api/tokens/{uid}",
|
"/api/tokens/{uid}",
|
||||||
web::get().to(api_tokens_controller::get_single),
|
web::get().to(api_tokens_controller::get_single),
|
||||||
)
|
)
|
||||||
.route(
|
/* TODO .route(
|
||||||
"/api/tokens/{uid}",
|
"/api/tokens/{uid}",
|
||||||
web::put().to(api_tokens_controller::update),
|
web::put().to(api_tokens_controller::update),
|
||||||
)
|
)
|
||||||
|
@ -6,10 +6,10 @@ use rand::rngs::OsRng;
|
|||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
|
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug, Eq, PartialEq)]
|
||||||
#[serde(tag = "alg")]
|
#[serde(tag = "alg")]
|
||||||
pub enum TokenPubKey {
|
pub enum TokenPubKey {
|
||||||
/// This variant DOES make crash the program. It MUST NOT be serialized.
|
/// This variant DOES make crash the program. It MUST NOT used to validate JWT.
|
||||||
///
|
///
|
||||||
/// It is a hack to hide public key when getting the list of tokens
|
/// It is a hack to hide public key when getting the list of tokens
|
||||||
None,
|
None,
|
||||||
@ -18,6 +18,12 @@ pub enum TokenPubKey {
|
|||||||
ES384 { r#pub: String },
|
ES384 { r#pub: String },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TokenPubKey {
|
||||||
|
pub fn is_invalid(&self) -> bool {
|
||||||
|
self == &TokenPubKey::None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
|
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
|
||||||
#[serde(tag = "alg")]
|
#[serde(tag = "alg")]
|
||||||
pub enum TokenPrivKey {
|
pub enum TokenPrivKey {
|
||||||
|
Loading…
Reference in New Issue
Block a user