token.rs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. use crate::{
  2. config::env::{domain, jwt_secret},
  3. entities::logged_user::EXPIRED_DURATION_DAYS,
  4. };
  5. use actix_web::{dev::Payload, FromRequest, HttpRequest};
  6. use backend_service::{configuration::HEADER_TOKEN, errors::ServerError};
  7. use chrono::{Duration, Local};
  8. use derive_more::{From, Into};
  9. use futures::future::{ready, Ready};
  10. use jsonwebtoken::{decode, encode, Algorithm, DecodingKey, EncodingKey, Header, Validation};
  11. use serde::{Deserialize, Serialize};
  12. const DEFAULT_ALGORITHM: Algorithm = Algorithm::HS256;
  13. #[derive(Debug, Serialize, Deserialize)]
  14. pub struct Claim {
  15. // issuer
  16. iss: String,
  17. // subject
  18. sub: String,
  19. // issue at
  20. iat: i64,
  21. // expiry
  22. exp: i64,
  23. user_id: String,
  24. }
  25. impl Claim {
  26. pub fn with_user_id(user_id: &str) -> Self {
  27. let domain = domain();
  28. Self {
  29. iss: domain,
  30. sub: "auth".to_string(),
  31. user_id: user_id.to_string(),
  32. iat: Local::now().timestamp(),
  33. exp: (Local::now() + Duration::days(EXPIRED_DURATION_DAYS)).timestamp(),
  34. }
  35. }
  36. pub fn user_id(self) -> String { self.user_id }
  37. }
  38. // impl From<Claim> for User {
  39. // fn from(claim: Claim) -> Self { Self { email: claim.email } }
  40. // }
  41. #[derive(From, Into, Clone)]
  42. pub struct Token(pub String);
  43. impl Token {
  44. pub fn create_token(user_id: &str) -> Result<Self, ServerError> {
  45. let claims = Claim::with_user_id(&user_id);
  46. encode(
  47. &Header::new(DEFAULT_ALGORITHM),
  48. &claims,
  49. &EncodingKey::from_secret(jwt_secret().as_ref()),
  50. )
  51. .map(Into::into)
  52. .map_err(|err| ServerError::internal().context(err))
  53. }
  54. pub fn decode_token(token: &Self) -> Result<Claim, ServerError> {
  55. decode::<Claim>(
  56. &token.0,
  57. &DecodingKey::from_secret(jwt_secret().as_ref()),
  58. &Validation::new(DEFAULT_ALGORITHM),
  59. )
  60. .map(|data| Ok(data.claims))
  61. .map_err(|err| ServerError::unauthorized().context(err))?
  62. }
  63. pub fn parser_from_request(request: &HttpRequest) -> Result<Self, ServerError> {
  64. match request.headers().get(HEADER_TOKEN) {
  65. Some(header) => match header.to_str() {
  66. Ok(val) => Ok(Token(val.to_owned())),
  67. Err(_) => Err(ServerError::unauthorized()),
  68. },
  69. None => Err(ServerError::unauthorized()),
  70. }
  71. }
  72. }
  73. impl FromRequest for Token {
  74. type Error = ServerError;
  75. type Future = Ready<Result<Self, Self::Error>>;
  76. fn from_request(request: &HttpRequest, _payload: &mut Payload) -> Self::Future {
  77. match Token::parser_from_request(request) {
  78. Ok(token) => ready(Ok(token)),
  79. Err(err) => ready(Err(err)),
  80. }
  81. }
  82. }