Skip to content

Commit d25e45b

Browse files
committed
jwt: Add unified_secret handling
Signed-off-by: Denys Fedoryshchenko <denys.f@collabora.com>
1 parent e48e08c commit d25e45b

1 file changed

Lines changed: 35 additions & 19 deletions

File tree

src/storjwt.rs

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,49 @@ use jwt::{Header, SignWithKey, Token, VerifyWithKey};
44
use sha2::Sha256;
55
use std::collections::BTreeMap;
66
use toml::value::Table;
7+
fn verify_with_key_str(
8+
token_str: &str,
9+
key_str: &str,
10+
) -> Result<BTreeMap<String, String>, jwt::Error> {
11+
let key: Hmac<Sha256> = Hmac::new_from_slice(key_str.as_bytes())?;
12+
let token: Token<Header, BTreeMap<String, String>, _> = token_str.verify_with_key(&key)?;
13+
let claims = token.claims();
14+
if claims.get("email").is_none() {
15+
debug_log!("email not found");
16+
return Err(jwt::Error::InvalidSignature);
17+
}
18+
Ok(claims.clone())
19+
}
20+
721
pub fn verify_jwt_token(token_str: &str) -> Result<BTreeMap<String, String>, jwt::Error> {
8-
// config.toml, jwt_secret parameter
922
let toml_cfg = get_config_content();
1023
let parsed_toml = toml_cfg.parse::<Table>().unwrap();
1124
let key_str = parsed_toml["jwt_secret"].as_str().unwrap();
12-
let key: Hmac<Sha256> = Hmac::new_from_slice(key_str.as_bytes())?;
13-
let verify_result = token_str.verify_with_key(&key);
14-
let token: Token<Header, BTreeMap<String, String>, _> = match verify_result {
15-
Ok(token) => token,
16-
Err(e) => {
17-
eprintln!("JWT verification error: {:?}", e);
18-
return Err(e);
25+
26+
match verify_with_key_str(token_str, key_str) {
27+
Ok(claims) => {
28+
debug_log!("email: {}", claims["email"]);
29+
return Ok(claims);
1930
}
20-
};
21-
//let header = token.header();
22-
let claims = token.claims();
23-
let email = claims.get("email");
24-
match email {
25-
Some(email) => {
26-
debug_log!("email: {}", email);
31+
Err(e) => {
32+
debug_log!("JWT verification with jwt_secret failed: {:?}", e);
2733
}
28-
None => {
29-
debug_log!("email not found");
30-
return Err(jwt::Error::InvalidSignature);
34+
}
35+
36+
if let Some(unified) = parsed_toml.get("unified_secret").and_then(|v| v.as_str()) {
37+
match verify_with_key_str(token_str, unified) {
38+
Ok(claims) => {
39+
debug_log!("email (unified_secret): {}", claims["email"]);
40+
return Ok(claims);
41+
}
42+
Err(e) => {
43+
eprintln!("JWT verification with unified_secret also failed: {:?}", e);
44+
return Err(e);
45+
}
3146
}
3247
}
33-
Ok(claims.clone())
48+
49+
Err(jwt::Error::InvalidSignature)
3450
}
3551

3652
pub fn generate_jwt_secret() {

0 commit comments

Comments
 (0)