RSA密钥对签名和JSON Web令牌验证

时间:2020-02-22 21:24:53

标签: rust openssl jwt

我正在尝试使用openssljsonwebtoken板条箱在Rust中签名和验证JSON Web令牌。

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错误,但我真的不明白为什么。

如何使用DER格式密钥签名和验证json网络令牌?

0 个答案:

没有答案