2020
2121-include (" oauth2_client.hrl" ).
2222-include_lib (" kernel/include/logger.hrl" ).
23+ -include_lib (" jose/include/jose_jwk.hrl" ).
2324
2425-spec get_access_token (oauth_provider (), access_token_request ()) ->
2526 {ok , successful_access_token_response ()} |
@@ -78,18 +79,11 @@ introspect_token(Token) ->
7879sign_token (TokenPayload ) ->
7980 case get_opaque_token_signing_key () of
8081 {error , _ } = Error -> Error ;
81- SK ->
82- case SK # signing_key .type of
83- hs256 ->
84- {_ , Value } = sign_token_hs (TokenPayload , SK # signing_key .key , SK # signing_key .id ),
85- {ok , Value };
86- _ -> {error , not_implemented }
87- end
82+ {ok , SK } ->
83+ {_ , Value } = sign_token_hs (TokenPayload , SK # signing_key .key , SK # signing_key .id ),
84+ {ok , Value }
8885 end .
8986
90- sign_token_hs (Token , #{<<" kid" >> := TokenKey } = Jwk ) ->
91- sign_token_hs (Token , Jwk , TokenKey ).
92-
9387sign_token_hs (Token , Jwk , TokenKey ) ->
9488 Jws0 = #{
9589 <<" alg" >> => <<" HS256" >>,
@@ -98,13 +92,6 @@ sign_token_hs(Token, Jwk, TokenKey) ->
9892 Jws = maps :put (<<" kid" >>, TokenKey , Jws0 ),
9993 sign_token (Token , Jwk , Jws ).
10094
101- sign_token_rsa (Token , Jwk , TokenKey ) ->
102- Jws = #{
103- <<" alg" >> => <<" RS256" >>,
104- <<" kid" >> => TokenKey
105- },
106- sign_token (Token , Jwk , Jws ).
107-
10895sign_token (Token , Jwk , Jws ) ->
10996 Signed = jose_jwt :sign (Jwk , Jws , Token ),
11097 jose_jws :compact (Signed ).
@@ -418,7 +405,7 @@ get_opaque_token_signing_key() ->
418405 case get_env (opaque_token_signing_key ) of
419406 undefined -> {error , missing_opaque_token_signing_key };
420407 List ->
421- parse_signing_key_configuration (List )
408+ { ok , parse_signing_key_configuration (List )}
422409 end .
423410
424411-spec get_opaque_token_signing_key (string ()|binary ()) -> {ok , signing_key ()} | {error , any ()}.
@@ -436,49 +423,50 @@ get_opaque_token_signing_key(KeyId) ->
436423parse_signing_key_configuration (List ) ->
437424 SK0 = case proplists :get_value (id , List , undefined ) of
438425 undefined -> {error , missing_signing_key_id };
439- Id -> # signing_key {id = Id }
426+ Id -> # signing_key {id = Id , type = hs256 }
440427 end ,
441428 case {SK0 , proplists :get_value (type , List , hs256 )} of
442429 {{error , _ } = Error , _ } ->
443430 Error ;
444431 {_ , hs256 } ->
445- Sk1 = case proplists :get_value (key , List , undefined ) of
432+ SK1OrError = case proplists :get_value (key , List , undefined ) of
446433 undefined -> {error , missing_symmetrical_key_value };
447- SymKey -> SK0 # signing_key {
448- type = hs256 ,
449- key = case make_jwk (#{
450- <<" alg" >> => <<" HS256" >>,
451- <<" value" >> => SymKey ,
452- <<" kty" >> => <<" MAC" >>,
453- <<" use" >> => <<" sig" >>}) of
454- {error , _ } = Error -> Error ;
455- {ok , Val } -> Val
456- end
457- }
458- end ,
459- case Sk1 # signing_key .key of
434+ SymKey ->
435+ case make_jwk (#{
436+ <<" alg" >> => <<" HS256" >>,
437+ <<" value" >> => SymKey ,
438+ <<" kty" >> => <<" MAC" >>,
439+ <<" use" >> => <<" sig" >>}) of
440+ {error , _ } = Error -> Error ;
441+ {ok , Val } ->
442+ SK0 # signing_key {
443+ key = Val
444+ }
445+ end
446+ end ,
447+ case SK1OrError of
460448 {error , _ } = Error1 -> Error1 ;
461- _ -> Sk1
462- end ;
463- {_ , rs256 } ->
464- Sk2 = case proplists :get_value (key_pem_file , List , undefined ) of
465- undefined ->
466- {error , missing_key_pem_file };
467- PrivateKey ->
468- case proplists :get_value (cert_pem_file , List , undefined ) of
469- undefined ->
470- {error , missing_cert_pem_file };
471- PublicKey ->
472- SK0 # signing_key {type = hs256 ,
473- private_key = PrivateKey ,
474- public_key = PublicKey }
475- end
476- end ,
477- case {Sk2 # signing_key .private_key , Sk2 # signing_key .public_key } of
478- {{error , _ } = Error2 , _ } -> Error2 ;
479- {_ , {error , _ } = Error3 } -> Error3 ;
480- {_ , _ } -> Sk2
449+ SK1 -> SK1
481450 end ;
451+ % {_, rs256} ->
452+ % Sk2 = case proplists:get_value(key_pem_file, List, undefined) of
453+ % undefined ->
454+ % {error, missing_key_pem_file};
455+ % PrivateKey ->
456+ % case proplists:get_value(cert_pem_file, List, undefined) of
457+ % undefined ->
458+ % {error, missing_cert_pem_file};
459+ % PublicKey ->
460+ % SK0#signing_key{type = hs256,
461+ % private_key = PrivateKey,
462+ % public_key = PublicKey}
463+ % end
464+ % end,
465+ % case {Sk2#signing_key.private_key, Sk2#signing_key.public_key} of
466+ % {{error, _} = Error2, _} -> Error2;
467+ % {_, {error, _} = Error3} -> Error3;
468+ % {_, _} -> Sk2
469+ % end;
482470 {_ , _ } -> {error , unsupported_signing_type }
483471 end .
484472
@@ -929,62 +917,23 @@ set_env(Par, Val) ->
929917 application :set_env (rabbitmq_auth_backend_oauth2 , Par , Val ).
930918
931919
932- -include_lib (" jose/include/jose_jwk.hrl" ).
933920
934- -spec make_jwk (binary () | map ()) -> {ok , #{binary () => binary ()}} | {error , term ()}.
935- make_jwk (Json ) when is_binary (Json ); is_list (Json ) ->
936- JsonMap = jose :decode (iolist_to_binary (Json )),
937- make_jwk (JsonMap );
921+ -spec make_jwk (map ()) -> {ok , #{binary () => binary ()}} | {error , term ()}.
938922
939923make_jwk (JsonMap ) when is_map (JsonMap ) ->
940924 case JsonMap of
941925 #{<<" kty" >> := <<" MAC" >>, <<" value" >> := _Value } ->
942926 {ok , mac_to_oct (JsonMap )};
943- #{<<" kty" >> := <<" RSA" >>, <<" n" >> := _N , <<" e" >> := _E } ->
944- {ok , fix_alg (JsonMap )};
945- #{<<" kty" >> := <<" oct" >>, <<" k" >> := _K } ->
946- {ok , fix_alg (JsonMap )};
947- #{<<" kty" >> := <<" OKP" >>, <<" crv" >> := _Crv , <<" x" >> := _X } ->
948- {ok , fix_alg (JsonMap )};
949- #{<<" kty" >> := <<" EC" >>} ->
950- {ok , fix_alg (JsonMap )};
951- #{<<" kty" >> := Kty } when Kty == <<" oct" >>;
952- Kty == <<" MAC" >>;
953- Kty == <<" RSA" >>;
954- Kty == <<" OKP" >>;
955- Kty == <<" EC" >> ->
956- {error , {fields_missing_for_kty , Kty }};
957927 #{<<" kty" >> := _Kty } ->
958928 {error , unknown_kty };
959929 #{} ->
960930 {error , no_kty }
961931 end .
962932
963- from_pem (Pem ) ->
964- case jose_jwk :from_pem (Pem ) of
965- # jose_jwk {} = Jwk -> {ok , Jwk };
966- Other ->
967- error_logger :warning_msg (" Error parsing jwk from pem: " , [Other ]),
968- {error , invalid_pem_string }
969- end .
970-
971- from_pem_file (FileName ) ->
972- case filelib :is_file (FileName ) of
973- false ->
974- {error , enoent };
975- true ->
976- case jose_jwk :from_pem_file (FileName ) of
977- # jose_jwk {} = Jwk -> {ok , Jwk };
978- Other ->
979- error_logger :warning_msg (" Error parsing jwk from pem file: " , [Other ]),
980- {error , invalid_pem_file }
981- end
982- end .
983-
984933mac_to_oct (#{<<" kty" >> := <<" MAC" >>, <<" value" >> := Value } = Key ) ->
985934 OktKey = maps :merge (Key ,
986935 #{<<" kty" >> => <<" oct" >>,
987- <<" k" >> => base64url :encode (Value )}),
936+ <<" k" >> => base64 :encode (Value )}),
988937 fix_alg (OktKey ).
989938
990939fix_alg (#{<<" alg" >> := Alg } = Key ) ->
0 commit comments