11mod 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 } ;
55use jsonwebtoken:: {
6- errors:: { Error , ErrorKind } ,
7- Algorithm , DecodingKey , TokenData , Validation ,
6+ DecodingKey , TokenData , Validation ,
87} ;
98pub 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 ;
1112use openssl:: {
1213 base64,
1314 pkey:: { PKey , Public } ,
1415 sha:: sha256,
1516} ;
1617use rand:: Rng ;
1718use std:: { fmt:: Write , iter} ;
18- pub use oauth2:: { basic:: { BasicTokenIntrospectionResponse , BasicTokenType } , TokenIntrospectionResponse , TokenResponse } ;
1919use uuid:: Uuid ;
2020
2121impl 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) ]
283277mod 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]
0 commit comments