Skip to content

Commit 97e13de

Browse files
Add function that resolves expiration tine
1 parent 556f32e commit 97e13de

File tree

5 files changed

+61
-6
lines changed

5 files changed

+61
-6
lines changed

deps/oauth2_client/include/oauth2_client.hrl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@
6666
-record(successful_access_token_response, {
6767
access_token :: binary(),
6868
token_type :: binary(),
69-
refresh_token :: option(binary()),
69+
refresh_token :: option(binary()), % A refresh token SHOULD NOT be included
70+
% .. for client-credentials flow.
71+
% https://www.rfc-editor.org/rfc/rfc6749#section-4.4.3
7072
expires_in :: option(integer())
7173
}).
7274

deps/oauth2_client/src/jwt_helper.erl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
%%
77
-module(jwt_helper).
88

9-
-export([decode/1, get_expiration/1]).
9+
-export([decode/1, get_expiration_time/1]).
1010

1111
-include_lib("jose/include/jose_jwt.hrl").
1212

@@ -18,5 +18,5 @@ decode(Token) ->
1818
{error, {invalid_token, Type, Err, Stacktrace}}
1919
end.
2020

21-
get_expiration(#{<<"exp">> := Exp}) when is_integer(Exp) -> {ok, Exp};
22-
get_expiration(#{}) -> {error, missing_exp_field}.
21+
get_expiration_time(#{<<"exp">> := Exp}) when is_integer(Exp) -> {ok, Exp};
22+
get_expiration_time(#{}) -> {error, missing_exp_field}.

deps/oauth2_client/src/oauth2_client.erl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
%% Copyright (c) 2007-2024 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
66
%%
77
-module(oauth2_client).
8-
-export([get_access_token/2,
8+
-export([get_access_token/2, get_expiration_time/1,
99
refresh_access_token/2,
1010
get_oauth_provider/1, get_oauth_provider/2,
1111
extract_ssl_options_as_list/1
@@ -71,6 +71,14 @@ get_openid_configuration(IssuerURI, OpenIdConfigurationPath, TLSOptions) ->
7171
get_openid_configuration(IssuerURI, TLSOptions) ->
7272
get_openid_configuration(IssuerURI, ?DEFAULT_OPENID_CONFIGURATION_PATH, TLSOptions).
7373

74+
-spec get_expiration_time(successful_access_token_response()) -> {ok, integer()} | {error, missing_exp_field}.
75+
get_expiration_time(#successful_access_token_response{expires_in = ExpiresIn,
76+
access_token = AccessToken}) ->
77+
case ExpiresIn of
78+
undefined -> jwt_helper:get_expiration_time(jwt_helper:decode(AccessToken));
79+
_ -> {ok, ExpiresIn}
80+
end.
81+
7482
update_oauth_provider_endpoints_configuration(OAuthProvider) ->
7583
LockId = lock(),
7684
try do_update_oauth_provider_endpoints_configuration(OAuthProvider) of

deps/oauth2_client/test/oauth2_client_test_util.erl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ expirable_token(Seconds) ->
6666
%% expiration is a timestamp with precision in seconds
6767
TokenPayload#{<<"exp">> := os:system_time(seconds) + Seconds}.
6868

69+
expirable_token_with_expiration_time(ExpiresIn) ->
70+
TokenPayload = fixture_token(),
71+
%% expiration is a timestamp with precision in seconds
72+
TokenPayload#{<<"exp">> := ExpiresIn}.
73+
6974
expired_token() ->
7075
expired_token_with_scopes(full_permission_scopes()).
7176

deps/oauth2_client/test/unit_SUITE.erl

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515

1616
-compile(export_all).
1717

18+
-define(UTIL_MOD, oauth2_client_test_util).
1819

1920
all() ->
2021
[
21-
{group, ssl_options}
22+
{group, ssl_options},
23+
{group, get_expiration_time}
2224
].
2325

2426
groups() ->
@@ -30,6 +32,11 @@ groups() ->
3032
peer_verification_set_to_verify_none,
3133
peer_verification_set_to_verify_peer_with_cacertfile,
3234
verify_set_to_verify_peer_with_cacertfile
35+
]},
36+
{get_expiration_time, [], [
37+
access_token_response_without_expiration_time,
38+
access_token_response_with_expires_in,
39+
access_token_response_with_exp_in_access_token
3340
]}
3441
].
3542

@@ -105,3 +112,36 @@ verify_set_to_verify_peer_with_cacertfile(_) ->
105112
cacertfile => "/tmp",
106113
verify => verify_peer
107114
})).
115+
116+
access_token_response_with_expires_in(_) ->
117+
Jwk = ?UTIL_MOD:fixture_jwk(),
118+
ExpiresIn = os:system_time(seconds),
119+
AccessToken = ?UTIL_MOD:expirable_token_with_expiration_time(ExpiresIn),
120+
{_, EncodedToken} = ?UTIL_MOD:sign_token_hs(AccessToken, Jwk),
121+
AccessTokenResponse = #successful_access_token_response{
122+
access_token = EncodedToken,
123+
expires_in = ExpiresIn
124+
},
125+
?assertEqual({ok, ExpiresIn}, oauth2_client:get_expiration_time(AccessTokenResponse)).
126+
127+
access_token_response_with_exp_in_access_token(_) ->
128+
Jwk = ?UTIL_MOD:fixture_jwk(),
129+
ExpiresIn = os:system_time(seconds),
130+
AccessToken = ?UTIL_MOD:expirable_token_with_expiration_time(ExpiresIn),
131+
{_, EncodedToken} = ?UTIL_MOD:sign_token_hs(AccessToken, Jwk),
132+
AccessTokenResponse = #successful_access_token_response{
133+
access_token = EncodedToken
134+
},
135+
?assertEqual({ok, ExpiresIn}, oauth2_client:get_expiration_time(AccessTokenResponse)).
136+
137+
access_token_response_without_expiration_time(_) ->
138+
Jwk = ?UTIL_MOD:fixture_jwk(),
139+
AccessToken = maps:remove(<<"exp">>, ?UTIL_MOD:fixture_token()),
140+
ct:log("AccesToken ~p", [AccessToken]),
141+
{_, EncodedToken} = ?UTIL_MOD:sign_token_hs(AccessToken, Jwk),
142+
AccessTokenResponse = #successful_access_token_response{
143+
access_token = EncodedToken
144+
},
145+
ct:log("AccessTokenResponse ~p", [AccessTokenResponse]),
146+
?assertEqual({error, missing_exp_field}, oauth2_client:get_expiration_time(AccessTokenResponse)).
147+

0 commit comments

Comments
 (0)