Hi, nice to me you. I am a new man using rust to write web project. I try to archive a JWT, but i meet a probleam when i write a Token trait.
My mind is write a common trait for every string which is Tokenable. So i can use tokenString.decode() to get a decode token that include header and claims.
But the error occur in signature method, i have no idea for solving this error. Are there someone guide me to solve this? Thank you very much.
pub trait Tokenable<B> {
type DecodeToken;
fn decode(&self, secret: &[u8], algorithm: Algorithm) -> Result<Self::DecodeToken, Error>;
fn signature(&self, secret: &[u8], algorithm: Algorithm) -> String;
}
impl<B> Tokenable<B> for String where B: Base64able{
type DecodeToken = DeToken<B>;
fn decode(&self, secret: &[u8], algorithm: Algorithm) -> Result<Self::DecodeToken, Error> {
let token_data: Vec<&str> = self.rsplit('.').collect();
if token_data.len() != 3 {
return Err(Error::InvalidToken);
}
let header: Header = try!(Header::from_base64(token_data[3]));
let claims: B = try!(B::from_base64(token_data[2]));
let sign = token_data[1];
// Validate algorithm
if header.alg != algorithm {
return Err(Error::InvalidAlgorithm);
}
// Validate signature
let payload: String = [token_data[3], token_data[2]].join(".");
let re_sign: String = payload.signature(secret, header.alg);
if re_sign != sign {
return Err(Error::InvalidSignature);
}
let de_token = DeToken::new(header, claims);
Ok(de_token)
}
fn signature(&self, secret: &[u8], algorithm: Algorithm) -> String {
fn crypt<D: Digest>(digest: D, payload: &str, secret: &[u8]) -> String {
let mut hmac = Hmac::new(digest, secret);
hmac.input(payload.as_bytes());
hmac.result().code().to_base64(base64::URL_SAFE)
}
match algorithm {
Algorithm::HS256 => crypt(Sha256::new(), self, secret),
Algorithm::HS384 => crypt(Sha384::new(), self, secret),
Algorithm::HS512 => crypt(Sha512::new(), self, secret),
}
}}
This is error showing:
src/lib.rs:132:39: 132:68 error: unable to infer enough type information about _
; type annotations or generic parameter binding required [E0282]
src/lib.rs:132 let re_sign: String = payload.signature(secret, header.alg);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/lib.rs:132:39: 132:68 help: run rustc --explain E0282
to see a detailed explanation
error: aborting due to previous error
Could not compile jsonwebtoken
.