Skip to content

Commit cc1d014

Browse files
committed
feat: overwrite claims and jwt parser
1 parent 4e2996e commit cc1d014

File tree

5 files changed

+93
-49
lines changed

5 files changed

+93
-49
lines changed

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "casdoor-sdk-rust"
3-
version = "1.0.3"
3+
version = "1.1.0"
44
edition = "2021"
55
license = "Apache-2.0"
66
description = "A Casdoor SDK (contain APIs) with more complete interfaces and better usability."
@@ -23,15 +23,15 @@ reqwest = { version = "0.12", features = ["json"] }
2323
jsonwebtoken = "9.3.0"
2424
oauth2 = "5.0.0-rc.1"
2525
toml = "0.8"
26-
openssl = "0.10.68"
26+
openssl = "0.10"
2727
anyhow = "1.0.95"
2828
rand = "0.8"
2929
chrono = "0.4.39"
3030
thiserror = "2.0.11"
3131
serde_with = { version = "3.12.0", features = ["chrono_0_4"] }
3232

3333
[dependencies.uuid]
34-
version = "1.11.0"
34+
version = "1.12.1"
3535
features = [
3636
"v4",
3737
"fast-rng",

src/authn/mod.rs

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
mod models;
22

3-
use crate::{Method, QueryArgs, QueryResult, Sdk, SdkError, SdkResult, NO_BODY};
4-
use anyhow::Result;
3+
use crate::{Method, QueryArgs, QueryResult, Sdk, SdkResult, NO_BODY};
4+
use anyhow::{format_err, Result};
55
use jsonwebtoken::{
6-
errors::{Error, ErrorKind},
7-
Algorithm, DecodingKey, TokenData, Validation,
6+
DecodingKey, TokenData, Validation,
87
};
98
pub use models::*;
10-
use oauth2::{AccessToken, url, AuthUrl, AuthorizationCode, ClientId, ClientSecret, IntrospectionUrl, RedirectUrl, RefreshToken, TokenUrl};
9+
pub use oauth2::{basic::{BasicTokenIntrospectionResponse, BasicTokenType}, TokenIntrospectionResponse, TokenResponse};
10+
use oauth2::{url, AccessToken, AuthUrl, AuthorizationCode, ClientId, ClientSecret, IntrospectionUrl, RedirectUrl, RefreshToken, TokenUrl};
11+
use openssl::pkey::Id;
1112
use openssl::{
1213
base64,
1314
pkey::{PKey, Public},
1415
sha::sha256,
1516
};
1617
use rand::Rng;
1718
use std::{fmt::Write, iter};
18-
pub use oauth2::{basic::{BasicTokenIntrospectionResponse, BasicTokenType}, TokenIntrospectionResponse, TokenResponse};
1919
use uuid::Uuid;
2020

2121
impl Sdk {
@@ -132,30 +132,9 @@ impl AuthSdk {
132132

133133
let pb_key = self.sdk.replace_cert_to_pub_key().unwrap();
134134

135-
// TODO: Add ES512 support after https://github.com/Keats/jsonwebtoken/issues/250#issuecomment-2488307814
136-
match header.alg {
137-
Algorithm::ES256 => {
138-
let token_data: TokenData<ClaimsStandard> = get_tk_es(pb_key, validation, token);
139-
140-
Ok(token_data.claims)
141-
}
142-
Algorithm::ES384 => {
143-
let token_data: TokenData<ClaimsStandard> = get_tk_es(pb_key, validation, token);
144-
145-
Ok(token_data.claims)
146-
}
147-
Algorithm::RS256 => {
148-
let token_data: TokenData<ClaimsStandard> = get_tk_rsa(pb_key, validation, token);
149-
150-
Ok(token_data.claims)
151-
}
152-
Algorithm::RS512 => {
153-
let token_data: TokenData<ClaimsStandard> = get_tk_rsa(pb_key, validation, token);
154-
155-
Ok(token_data.claims)
156-
}
157-
_ => Err(SdkError::from(Error::from(ErrorKind::InvalidAlgorithm))),
158-
}
135+
let td = get_tk(pb_key, validation, token).unwrap();
136+
137+
Ok(td.claims)
159138
}
160139

161140
pub fn get_signing_url(&self, redirect_url: String) -> String {
@@ -264,27 +243,62 @@ fn generate_code_challange(verifier: String) -> String {
264243
base64::encode_block(&digest).replace("=", "-")
265244
}
266245

267-
fn get_tk_es(pb_key: PKey<Public>, validation: Validation, token: &str) -> TokenData<ClaimsStandard> {
268-
let public_key = pb_key.ec_key().unwrap().public_key_to_pem().unwrap();
269-
let decode_key = &DecodingKey::from_ec_pem(&public_key).unwrap();
270-
let token_data: TokenData<ClaimsStandard> = jsonwebtoken::decode(token, decode_key, &validation).unwrap();
271-
272-
token_data
246+
fn get_tk(pb_key: PKey<Public>, validation: Validation, token: &str) -> Result<TokenData<ClaimsStandard>> {
247+
match pb_key.id() {
248+
Id::RSA => {
249+
let rsa_pb_key = pb_key.rsa()?.public_key_to_pem()?;
250+
let decode_key = &DecodingKey::from_rsa_pem(&rsa_pb_key)?;
251+
let token_data: TokenData<ClaimsStandard> = jsonwebtoken::decode(token, decode_key, &validation)?;
252+
253+
Ok(token_data)
254+
},
255+
Id::EC => {
256+
let ec_pb_key = pb_key.ec_key()?.public_key_to_pem()?;
257+
let decode_key = &DecodingKey::from_ec_pem(&ec_pb_key)?;
258+
let token_data: TokenData<ClaimsStandard> = jsonwebtoken::decode(token, decode_key, &validation)?;
259+
260+
Ok(token_data)
261+
},
262+
Id::RSA_PSS => {
263+
println!("{}", "RSA_PSS");
264+
let ec_pb_key = pb_key.rsa()?.public_key_to_pem()?;
265+
let decode_key = &DecodingKey::from_rsa_pem(&ec_pb_key)?;
266+
let token_data: TokenData<ClaimsStandard> = jsonwebtoken::decode(token, decode_key, &validation)?;
267+
268+
Ok(token_data)
269+
},
270+
_ => {
271+
Err(format_err!("not supported"))
272+
},
273+
}
273274
}
274275

275-
fn get_tk_rsa(pb_key: PKey<Public>, validation: Validation, token: &str) -> TokenData<ClaimsStandard> {
276-
let public_key = pb_key.rsa().unwrap().public_key_to_pem().unwrap();
277-
let decode_key = &DecodingKey::from_rsa_pem(&public_key).unwrap();
278-
let td: TokenData<ClaimsStandard> = jsonwebtoken::decode(token, decode_key, &validation).unwrap();
279-
280-
td
281-
}
282276
#[cfg(test)]
283277
mod tests {
284278
use std::fs;
285279

286280
use crate::Config;
287281

282+
#[test]
283+
fn successfully_rs256_cert_ps256() {
284+
let token = fs::read_to_string("./src/authn/testdata/tok_rs256_ps.txt").unwrap();
285+
let cert = fs::read_to_string("./src/authn/testdata/cert_ps256.txt").unwrap();
286+
let cfg = Config::new(
287+
"http://localhost:8000".to_string(),
288+
"2707072ef8e8048ce2df".to_string(),
289+
"7d315de093a1b8268d0c7eb192bbe02f35a8877d".to_string(),
290+
cert,
291+
"built-in".to_string(),
292+
Some("app-built-in".to_owned())
293+
)
294+
.into_sdk();
295+
296+
let authnx = cfg.authn();
297+
298+
let tk = authnx.parse_jwt_token(&token).unwrap();
299+
assert_eq!(true, tk.reg_claims.audience.contains(&cfg.client_id));
300+
}
301+
288302
#[test]
289303
fn successfully_es256_jwt_custom() {
290304
let token = fs::read_to_string("./src/authn/testdata/tok_rs256_custom.txt").unwrap();
@@ -303,7 +317,6 @@ mod tests {
303317

304318
let tk = authnx.parse_jwt_token(&token).unwrap();
305319
assert_eq!(true, tk.reg_claims.audience.contains(&cfg.client_id));
306-
println!("{:#?}", tk);
307320
}
308321
#[test]
309322
fn successfully_es256_jwt_standart() {
@@ -324,7 +337,6 @@ mod tests {
324337
let tk = authnx.parse_jwt_token(&token).unwrap();
325338
assert_eq!("user", tk.user.display_name);
326339
assert_eq!(true, tk.reg_claims.audience.contains(&cfg.client_id));
327-
println!("{:#?}", tk);
328340
}
329341

330342
#[test]

src/authn/testdata/cert_ps256.txt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIFQTCCAvWgAwIBAgIDAeJAMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIB
3+
BQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIDAmMQ4wDAYDVQQK
4+
EwVhZG1pbjEUMBIGA1UEAwwLY2VydF9mOTA3djkwHhcNMjUwMTEyMjAzMDEwWhcN
5+
NDUwMTEyMjAzMDEwWjAmMQ4wDAYDVQQKEwVhZG1pbjEUMBIGA1UEAwwLY2VydF9m
6+
OTA3djkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCW0T7GiA/8DoGd
7+
DFrcDAFwXtZIGA5oA7w13OP/7OYU1B3+AULUHjtKB3t5kiOL6AgFNvEliY9t4Kyi
8+
8mV1XZWP2qv1wiDVQSJmMbzqrkkbHi+4rI7FDz7DhEXaFoARmcxRq6xa46I750c3
9+
UU6JV+BWHssrBIhr1hTGPfzrMR4aMIfYlBr3Q1pl8ZztVU72Fvk5T/7g77EIBRZ6
10+
RPHjcYnSyxv56kF9W13ukO4BbTn1/a0U0dz3nh1kTsmmH4Rk21Yk+FbdhIsI5BtP
11+
enaz9+Zu+Aq28AiyMjP9BFZrfHR6YHVEKs9M4zsTn9YFQAXNX67zAlKvcCXCCFbD
12+
E8YrGoa5B5fIkMZbMkIN+5iGRLaGkZaVQY2y/eYX/lQ+23KwdOrblHl5rZbHa4TK
13+
+QZcjdlYArIybzjR36ZCH/5AqT6O7pjVHflIfz0gMUMWrqkimV6AXuTxQf3lOyDZ
14+
i3ZS0c+bWpLZDKyao5vRIn1kYl0DyCQmIZ3jtxxg9vmOYarS25MFUe1xsY2CuIwV
15+
d2IR0IgFzqGkga73N+k8nHX79qI/sKP0wpSvE7OH61ZsarkliL8KDr4OYCRZe5Df
16+
NudtiyoaT8nC8C5kPRtwvVg7uWoeXGIrOrUJT2xvUuuU0rkIAOGYey8LA9xCSwPz
17+
EoBOgiY1y/MWSEXV371q6fijH+OT/wIDAQABoxAwDjAMBgNVHRMBAf8EAjAAMEEG
18+
CSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJ
19+
YIZIAWUDBAIBBQCiAwIBIAOCAgEAAYzn7qqWn9pEWA9iG5FWSnJV66jcJ44dxUJB
20+
4WJlEQiSBh1BJx2Y/B/CFfES2OlfxxWsTKMc2jdEg7ebHLxHvfLfL54lxxTsKvE7
21+
EvKzgVwxelwSq5qyfKBCyhCEJ336zqu9EtdlzgEir/gQF9+mAOlz/K3wXzytJ2UL
22+
nHbJWz8wueAMjvO2hlIoeDZHjgg4DZL/z3TOKXEvXg4u6h7DsvUiI736klIeDt+i
23+
XWqokT6o/cEF4btgO+b7Fc6hs3Q30PNrqkmeK+UdrnXap0b4kAf7bsLwFpNjnkk8
24+
WRkVOg0j3XFcOnblZOzUh6WatZWgsXjJm2wqmYKS9BuOGvEmhL7484fcBZHKPT/b
25+
nmFICFrNPB9L1ORpaEh0B4g28JsW7PdVjstlIhqTyUgTFvpmY0MlnW0JtGy87iol
26+
P4l431G1hzkZRUaxLwKvGT2+rkJYCfjjJ3fdnKFIGnNYknGYMVYcRUFmkTQ0xUQa
27+
9xHYjjXc7K+eLeJF3tPbnZ5/mIpSrRVAYPauP8hJZjgHrDyxAIPPSsLj89SpFrSp
28+
kTyBYwUT/8feb7AUGRlLk2uxMngxx1CE2+sX/rkVXhO17B4ZFY4IuiPsGdIUSxNP
29+
4eqQpTOsxgCNqCktFijOa1fI4bX8KUz6s2Of8wNGR59iUwOBRsHWYLYQkdTiKH1P
30+
I/GMs+M=
31+
-----END CERTIFICATE-----
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
eyJhbGciOiJSUzI1NiIsImtpZCI6ImNlcnRfZjkwN3Y5IiwidHlwIjoiSldUIn0.eyJvd25lciI6ImJ1aWx0LWluIiwibmFtZSI6ImFkbWluIiwiaWQiOiI1NjVjMWRiMi0zYTczLTRhM2YtYTYwMy0yMDc5NjFkNTUxN2IiLCJkaXNwbGF5TmFtZSI6IkFkbWluIiwiYXZhdGFyIjoiaHR0cHM6Ly9jZG4uY2FzYmluLm9yZy9pbWcvY2FzYmluLnN2ZyIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20iLCJwaG9uZSI6IiIsInRva2VuVHlwZSI6ImFjY2Vzcy10b2tlbiIsInNjb3BlIjoicHJvZmlsZSIsImFkZHJlc3MiOnsiZm9ybWF0dGVkIjoiIiwic3RyZWV0X2FkZHJlc3MiOiIiLCJsb2NhbGl0eSI6IiIsInJlZ2lvbiI6IiIsInBvc3RhbF9jb2RlIjoiIiwiY291bnRyeSI6IiJ9LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwMDAiLCJzdWIiOiI1NjVjMWRiMi0zYTczLTRhM2YtYTYwMy0yMDc5NjFkNTUxN2IiLCJhdWQiOlsiMjcwNzA3MmVmOGU4MDQ4Y2UyZGYiXSwiZXhwIjoyMDk3NjQ3MDUzLCJuYmYiOjE3Mzc2NTA2NTMsImlhdCI6MTczNzY1MDY1MywianRpIjoiYWRtaW4vM2NjYmE4MWUtMzM4Ni00MDRkLTg4ZDEtNDA3Zjk0YTc2ODkzIn0.iqMxd-8IT8cgKTFYAw0TKGDVIlYrK5x5zI2u4W2HN3bQAUFsF11qFUXaWHk1WczALSkQjJTLr2xl_Drd1VKuJQlun8PoKitxEmcd2fylRF2mJq5-BgKkxEQT_lTV5ATGOkOHZpS2aVlgw8fi0ECPn4Qj9aSzqHPxiRbEDu7R8cXfZMQp3nMdGwm_Y0w-vfR72UaapAqvL_OpWKNB7YD8nwDd43FXuYmv4eO-H1tMtBoDwovNWuw2o_cqN3dGeLygELd-HVDcHhoGTGkJlM1mvY2iDsXDi_MeiYCKlZ3qa28QVonH5eSajk6V0gQa7ILr94l8hGw6AMBPHZpVZVPRz2DnZm79EPNBwNTzM-oeOEFF57Ga-xRX6xdfbvpb7qQSEUMs-e_IibQaB7UPqGKn4cS4trpwPh-_4Zjmos_LitbNohdIk2tgvpUrqSgYjo_1ewcDouDVMqlymSCabRLlipW_GoxOBT-462_YMAWXC_96X_wTZRiy4Sb7T5ZPva30L2jRVmrqacBpMXeZ4Nq2Dgnqv5JA8rElqJ0uLPYycvYbTiPnpdtnpztF0WEOMzTD_-uCX1XEQ0WQ3dPP3AyR3Y6K_Q2Qip5vwRU8ukrfPPqOqmBzCWFQ5SM4pXCyJirVr5pj9D0V9M06SXgmePmS59zAXbm6NohiHr_A_IJZlBA

src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl Config {
5353
}
5454

5555
pub fn replace_cert_to_pub_key(&self) -> Result<PKey<Public>, ErrorStack> {
56-
let cert_x509 = &X509::from_pem(self.certificate.as_bytes())?;
56+
let cert_x509 = X509::from_pem(self.certificate.as_bytes())?;
5757
cert_x509.public_key()
5858
}
5959
}

0 commit comments

Comments
 (0)