rusty_jwt/lib.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, TokenData, Validation};
use serde::{Deserialize, Serialize};
use std::{
env,
error::Error,
io,
ops::Add,
time::{SystemTime, UNIX_EPOCH},
};
use uuid::Uuid;
pub struct Cookie {}
#[derive(Debug, Serialize, Deserialize)]
pub struct Claims {
sub: String,
name: String,
email: String,
iat: u64,
exp: u64,
}
pub struct Users {
pub name: String,
pub email: String,
pub exp: u64,
}
impl Cookie {
/*
!encode
!takes two parameter secret and claims
!secret name like SECRET_NAME
!claims
!let claims = Claims {
!sub:auomatic generate,
!name:"USER_NAME",
!email:"USER_EMAIL",
!"iat":authomatic,
!"exp: eg: 3600 //1hour
!}
!encode the claims
!let cookie = Cookie::encode("SECRET_NAME", claims);
!eg eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaW5zdF9hdHRyaWJ1dGVzIjp7ImlhdCI6MTUxNjIzOTAyMn19.5f4dc9f2c5c9de145d528be2346f1bc1f8f63de53963bba6fcb41f648bc272e1
*/
pub fn encode(secret: String, claims: Users) -> Result<String, Box<dyn Error>> {
let secret = env::var(secret);
let claim = Claims {
sub: Uuid::new_v4().to_string(),
name: claims.name,
email: claims.email,
iat: SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs(),
exp: SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs()
.add(claims.exp),
};
match secret {
Ok(secret) => {
let encode_key = EncodingKey::from_secret(secret.as_bytes());
let encode = encode(&Header::default(), &claim, &encode_key);
match encode {
Ok(ecoded_cookie) => {
// let ecoded_cookie = &ecoded_cookies;
Ok(ecoded_cookie)
}
Err(err) => Err(Box::new(io::Error::new(
io::ErrorKind::InvalidData,
err.to_string(),
))),
}
}
Err(err) => Err(Box::new(io::Error::new(
io::ErrorKind::InvalidData,
err.to_string(),
))),
}
// Ok(())
}
/*
!decode cookie
!let decode = decode("SECRET_NAME",&cookie);
! return claims and header
*/
pub fn decode(secret: String, cookie: String) -> Result<TokenData<Claims>, Box<dyn Error>> {
let secret = env::var(secret);
match secret {
Ok(secret) => {
let decode_key = DecodingKey::from_secret(secret.as_bytes());
let encode = decode(
&cookie,
&decode_key,
&Validation::new(jsonwebtoken::Algorithm::HS256),
);
match encode {
Ok(encode) => Ok(encode),
Err(err) => Err(Box::new(io::Error::new(
io::ErrorKind::InvalidData,
err.to_string(),
))),
}
}
Err(err) => Err(Box::new(io::Error::new(
io::ErrorKind::InvalidData,
err.to_string(),
))),
}
}
}