|
1 | 1 | -module(id_token_jws).
|
2 | 2 |
|
3 |
| --ignore_xref([generate_key_for/1, generate_key_for/2, sign/2, sign/3]). |
4 |
| --export([generate_key_for/1, generate_key_for/2, sign/2, sign/3, validate/2]). |
| 3 | +-define(API_CALLS, |
| 4 | + [generate_key_for/1, generate_key_for/2, |
| 5 | + sign/2, sign/3, |
| 6 | + validate/1, validate/2]). |
| 7 | +-ignore_xref(?API_CALLS). |
| 8 | +-export(?API_CALLS). |
5 | 9 |
|
6 | 10 | -include_lib("jose/include/jose_jwt.hrl").
|
7 | 11 | -include_lib("jose/include/jose_jwk.hrl").
|
@@ -32,12 +36,23 @@ sign(Claims, JWK, JWS) ->
|
32 | 36 | {_Modules, JWTBin} = jose_jws:compact(JWT),
|
33 | 37 | JWTBin.
|
34 | 38 |
|
| 39 | +-spec validate(binary()) -> |
| 40 | + {ok, map()} | |
| 41 | + {error, invalid_signature | expired | no_public_key_matches}. |
| 42 | +validate(IdToken) -> |
| 43 | + Kid = extract_kid(IdToken), |
| 44 | + case id_token_pubkeys_storage:get(Kid) of |
| 45 | + {error, _} -> |
| 46 | + {error, no_public_key_matches}; |
| 47 | + {ok, Key} -> |
| 48 | + validate_exp(validate_signature(Key, IdToken)) |
| 49 | + end. |
| 50 | + |
35 | 51 | -spec validate(binary(), [map()]) ->
|
36 | 52 | {ok, map()} |
|
37 | 53 | {error, invalid_signature | expired | no_public_key_matches}.
|
38 | 54 | validate(IdToken, Keys) ->
|
39 |
| - Protected = jose_jwt:peek_protected(IdToken), |
40 |
| - {_M, #{<<"kid">> := Kid}} = jose_jws:to_map(Protected), |
| 55 | + Kid = extract_kid(IdToken), |
41 | 56 | SearchResult = lists:search(fun(#{<<"kid">> := OtherKid}) ->
|
42 | 57 | OtherKid =:= Kid
|
43 | 58 | end, Keys),
|
@@ -105,6 +120,11 @@ kid(_) -> jose_base64url:encode(crypto:strong_rand_bytes(16)).
|
105 | 120 | iat(#{iat := Iat}) -> Iat;
|
106 | 121 | iat(_) -> erlang:system_time(seconds).
|
107 | 122 |
|
| 123 | +extract_kid(IdToken) -> |
| 124 | + Protected = jose_jwt:peek_protected(IdToken), |
| 125 | + {_M, #{<<"kid">> := Kid}} = jose_jws:to_map(Protected), |
| 126 | + Kid. |
| 127 | + |
108 | 128 | %%%_* Emacs ====================================================================
|
109 | 129 | %%% Local Variables:
|
110 | 130 | %%% allout-layout: t
|
|
0 commit comments