diff --git a/src/token_stuff/mod.rs b/src/token_stuff/mod.rs index a9d2647..aa9454f 100644 --- a/src/token_stuff/mod.rs +++ b/src/token_stuff/mod.rs @@ -41,14 +41,49 @@ pub fn create_service_token(provided: &String, id: &uuid::Uuid) -> Result<(Strin } pub fn verify_token(key: &String, token: &String) -> bool { - let ver = Hs256.verifier_from_bytes(key.as_bytes()).unwrap(); - let (payload, _header) = jwt::decode_with_verifier(token, &ver).unwrap(); - match payload.subject() { - Some(_sub) => true, - None => false, + match get_payload(key, token) { + Ok((payload, _header)) => { + match payload.subject() { + Some(_sub) => true, + None => false, + } + } + Err(_err) => { + false + } } } +pub fn extract_id_from_token(key: &String, token: &String) -> Result { + match get_payload(key, token) { + Ok((payload, _header)) => { + match payload.claim("id") { + Some(id) => { + match uuid::Uuid::parse_str(id.as_str().unwrap()) { + Ok(extracted) => { + Ok(extracted) + } + Err(err) => { + Err(std::io::Error::other(err.to_string())) + } + } + } + None => { + Err(std::io::Error::other("No claim found")) + } + } + } + Err(err) => { + Err(std::io::Error::other(err.to_string())) + } + } +} + +fn get_payload(key: &String, token: &String) -> Result<(josekit::jwt::JwtPayload, josekit::jws::JwsHeader), josekit::JoseError> { + let ver = Hs256.verifier_from_bytes(key.as_bytes()).unwrap(); + jwt::decode_with_verifier(token, &ver) +} + #[cfg(test)] mod tests { use super::*;