Crates.io | easy-auth |
lib.rs | easy-auth |
version | 0.3.0 |
source | src |
created_at | 2023-04-16 13:52:45.00791 |
updated_at | 2023-04-16 13:52:45.00791 |
description | lib qui facilite la génération de mot de passe et l'encodage decodage de jwt |
homepage | |
repository | |
max_upload_size | |
id | 840599 |
size | 16,081 |
Cette lib met à disposition deux services vraiment facile à utiliser :
pub trait PasswordService: Send + Sync {
fn create_hash_password(&self, password: String) -> String;
fn verifie(&self, password: String, hash: String) -> bool;
}
Vous pouvez facilement générer et vérifier un mot de passe en utilisant
l'implémentation du trait PasswordService avec la struct PasswordServiceImpl
pub trait TokenService {
fn encode<'a, CLAIMS: Debug + Serialize + Deserialize<'a>>(&self, claims: CLAIMS) -> String;
fn decode<CLAIMS: Debug + Serialize + DeserializeOwned>(&self, token: &str) -> Result<CLAIMS, DecodeError>;
}
Vous pouvez facilement encode et decoder des données en utilisant l'implementation du service TokenService avec la struct JwtTokenService
#[test]
fn password_should_be_verfied_when_compared_with_hashed_and_salt() {
// given
let salt = "salt_test";
let password_service = PasswordServiceImpl::new(salt.to_string());
let password = "mon_mot_de_passe";
let password_hashed_salt = "$2y$12$a0DqbD7yXVLyKB.uKB.uK.OacqAixOlKJF6yowQChMdIuJ9EHTc4K";
let expected = true;
// when
let result = password_service.verifie(password.to_string(), password_hashed_salt.to_string());
// then
assert_eq!(result, expected)
}
Commençons par creer notre struct claims (exp est un champ obligatoire), mettez n'importe quelle données avec.
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
struct Claims {
sub: String,
exp: usize,
pseudo: String
}
fn claim_test_with_expired() -> Claims {
claim_from_exp(1358781921)
}
fn claim_test_valid() -> Claims {
claim_from_exp(
SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs() as usize + 3600
)
}
fn claim_from_exp(exp: usize) -> Claims {
Claims {
sub: "test_sub".to_string(),
exp,
pseudo: "pseudo_test".to_string()
}
}
#[test]
fn encode_should_generate_jwt_token() {
// given
let secret_key = "my_secret_key";
let jwt_token_service = JwtTokenService::new(secret_key.to_string());
let claims = claim_test_valid();
let expected = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0X3N1YiIsImV4cCI6MTM1ODc4MTkyMSwicHNldWRvIjoicHNldWRvX3Rlc3QifQ.jV6TRv2GgyeniAwDVboXzbf2ftLczlHr5U6Uux6IOHk";
// when
let result = jwt_token_service.encode(claims);
// then
assert_eq!(result, expected.to_string())
}
#[test]
fn decode_should_give_claims_from_jwt() {
// given
let secret_key = "my_secret_key";
let jwt_token_service = JwtTokenService::new(secret_key.to_string());
let claims_expected = claim_test_valid(); // current timestamp + 3600
let jwt_for_decoding = jwt_token_service.encode(claims_expected.clone());
// when
let result = jwt_token_service
.decode::<Claims>(jwt_for_decoding.as_str())
.unwrap();
// then
assert_eq!(result, claims_expected)
}