Я пытаюсь подписать и проверить JSON веб-токены в Rust с помощью ящиков openssl
и jsonwebtoken
.
use serde::{Deserialize, Serialize};
use jsonwebtoken::{ encode, Header, EncodingKey, Algorithm };
use jsonwebtoken::errors;
#[derive(Serialize, Deserialize)]
pub struct Claims {
email: String
}
pub fn mk_token (claims: &Claims, encoding_key: &EncodingKey) -> Result<String, errors::Error> {
Ok(encode(&Header::new(Algorithm::RS256), claims, encoding_key)?)
}
#[cfg(test)]
mod tests {
use super::*;
use jsonwebtoken::{ decode, DecodingKey, Validation };
use openssl::rsa::Rsa;
use openssl::pkey::{ PKey };
#[test]
fn test_mk_token() {
let rsa = Rsa::generate(2048).unwrap();
let pkey = PKey::from_rsa(rsa).unwrap();
let private_der = pkey.private_key_to_der().unwrap();
let public_der = pkey.public_key_to_der().unwrap();
let encoding_key = EncodingKey::from_rsa_der(&private_der);
let decoding_key = DecodingKey::from_rsa_der(&public_der);
let test_claims = Claims {
email: "a@b.c".to_string()
};
let token = match mk_token(&test_claims, &encoding_key) {
Ok(t) => t,
Err(_) => {
panic!()
}
};
let token_data = match decode::<Claims>(
&token,
&decoding_key,
&Validation::new(Algorithm::RS256)
) {
Ok(t) => t,
Err(e) => {
eprintln!("{}", e);
panic!("Could not decode")
}
};
println!("{}", token_data.claims.email)
}
}
Тест сообщает об ошибке InvalidSignature, но я действительно могу ' не понимаю, почему.
Как подписать и проверить json веб-токены с ключами формата DER?