From d04fac0e94dabf3c8d86a023ab691fa3001ae38c Mon Sep 17 00:00:00 2001 From: Diego Balseiro Date: Wed, 27 Sep 2023 21:42:44 -0500 Subject: [PATCH 1/2] Add details to Invalid Token error --- src/error.rs | 13 +++++++------ src/handler.rs | 16 ++++++++-------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/error.rs b/src/error.rs index edf4d6a..7a0f209 100644 --- a/src/error.rs +++ b/src/error.rs @@ -9,8 +9,8 @@ use thiserror::Error; pub enum Error { #[error("Missing TOKEN")] MissingToken, - #[error("JWT token not valid")] - InvalidToken, + #[error("JWT token not valid - {0}")] + InvalidToken(String), #[error("JWT token creation error")] TokenCreation, } @@ -24,11 +24,12 @@ struct ErrorResponse { impl IntoResponse for Error { fn into_response(self) -> Response { match self { - Error::MissingToken => (StatusCode::UNAUTHORIZED, self.to_string()).into_response(), - Error::InvalidToken => (StatusCode::NOT_FOUND, self.to_string()).into_response(), - Error::TokenCreation => { + Error::MissingToken => + (StatusCode::UNAUTHORIZED, self.to_string()).into_response(), + Error::InvalidToken(_) => + (StatusCode::NOT_FOUND, self.to_string()).into_response(), + Error::TokenCreation => (StatusCode::INTERNAL_SERVER_ERROR, self.to_string()).into_response() - } } } } diff --git a/src/handler.rs b/src/handler.rs index ace762d..1c1a0be 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -38,7 +38,7 @@ pub async fn auth_with_path(Path(token): Path) -> Result &jwt::DecodingKey::from_secret(CONFIG.jwt.secret.as_bytes()), &jwt::Validation::new(jwt::Algorithm::HS512), ) - .map_err(|_| Error::InvalidToken)?; + .map_err(|e| Error::InvalidToken(e.to_string()))?; Ok(decoded.claims.exp.to_string()) } @@ -66,7 +66,7 @@ pub async fn auth_with_header(headers: HeaderMap) -> Result { .get("TOKEN") .ok_or(Error::MissingToken)? .to_str() - .map_err(|_| Error::InvalidToken)?; + .map_err(|e| Error::InvalidToken(e.to_string()))?; validate_jwt(token) } @@ -79,13 +79,13 @@ pub async fn auth_with_x_forward_uri(headers: HeaderMap) -> Result().map_err(|_| Error::InvalidToken)?; + .map_err(|e| Error::InvalidToken(e.to_string()))?; + let uri = header.parse::().map_err(|e| Error::InvalidToken(e.to_string()))?; match uri.query_to_map().get("token") { Some(token) => validate_jwt(token), None => Err(Error::MissingToken) } - + } /// Validate a JWT token @@ -95,7 +95,7 @@ pub fn validate_jwt(token: &str) -> Result { &jwt::DecodingKey::from_secret(CONFIG.jwt.secret.as_bytes()), &jwt::Validation::new(jwt::Algorithm::HS512), ) - .map_err(|_| Error::InvalidToken)?; + .map_err(|e| Error::InvalidToken(e.to_string()))?; Ok(decoded.claims.exp.to_string()) } @@ -147,8 +147,8 @@ mod tests { ("key", "value"), ("foo", "bar"), ("token", "123"), - + ]); assert_eq!(hm, uri.query_to_map()); } -} \ No newline at end of file +} From ba94eb7dc4ba8f7c72360058988b73825d11727e Mon Sep 17 00:00:00 2001 From: Diego Balseiro Date: Thu, 28 Sep 2023 10:14:49 -0500 Subject: [PATCH 2/2] Better refactor --- src/error.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/error.rs b/src/error.rs index 7a0f209..a85d442 100644 --- a/src/error.rs +++ b/src/error.rs @@ -9,12 +9,24 @@ use thiserror::Error; pub enum Error { #[error("Missing TOKEN")] MissingToken, + #[error("JWT token not valid - {0}")] InvalidToken(String), + #[error("JWT token creation error")] TokenCreation, } +impl Error { + pub fn status(&self) -> StatusCode { + match self { + Error::MissingToken => StatusCode::UNAUTHORIZED, + Error::InvalidToken(_) => StatusCode::NOT_FOUND, + Error::TokenCreation => StatusCode::INTERNAL_SERVER_ERROR + } + } +} + #[derive(Serialize, Debug)] struct ErrorResponse { status: String, @@ -23,13 +35,6 @@ struct ErrorResponse { impl IntoResponse for Error { fn into_response(self) -> Response { - match self { - Error::MissingToken => - (StatusCode::UNAUTHORIZED, self.to_string()).into_response(), - Error::InvalidToken(_) => - (StatusCode::NOT_FOUND, self.to_string()).into_response(), - Error::TokenCreation => - (StatusCode::INTERNAL_SERVER_ERROR, self.to_string()).into_response() - } + (self.status(), self.to_string()).into_response() } }