@@ -4,33 +4,49 @@ use jwt::{Header, SignWithKey, Token, VerifyWithKey};
44use sha2:: Sha256 ;
55use std:: collections:: BTreeMap ;
66use 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+
721pub 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
3652pub fn generate_jwt_secret ( ) {
0 commit comments