use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Claims {
pub iss: String,
pub exp: u64,
pub sub: String,
pub principal_type: String,
pub principal_name: String,
}
pub fn create_token(
claims: &Claims,
jwt_secret: &str,
) -> Result<String, jsonwebtoken::errors::Error> {
encode(
&Header::default(),
claims,
&EncodingKey::from_secret(jwt_secret.as_ref()),
)
}
pub fn validate_token(
token: &str,
jwt_secret: &str,
) -> Result<Claims, jsonwebtoken::errors::Error> {
let validation = Validation::default();
let token_data = decode::<Claims>(
token,
&DecodingKey::from_secret(jwt_secret.as_ref()),
&validation,
)?;
Ok(token_data.claims)
}
pub fn parse_bearer_token(header_value: &str) -> Option<&str> {
header_value
.strip_prefix("Bearer ")
.or_else(|| header_value.strip_prefix("bearer "))
}