Подписание пары ключей RSA и проверка JSON веб-токенов - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь подписать и проверить 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?

...