Skip to content

Commit 97ac0fc

Browse files
committed
Merge pull request #4 from okeuday/master
Fix tests.
2 parents e0b110d + 780090f commit 97ac0fc

File tree

2 files changed

+51
-34
lines changed

2 files changed

+51
-34
lines changed

src/jwt.erl

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,37 @@ encode(Algorithm, Payload, Secret, HeaderExtra) ->
2222
{ok, <<DataEncoded/binary, $., SignatureEncoded/binary>>}.
2323

2424
decode(Data, Secret) when is_binary(Data) ->
25-
try binary:split(Data, [<<".">>], [global]) of
26-
[HeaderEncoded, PayloadEncoded, SignatureEncoded] ->
27-
Header = jsx:decode(base64url:decode(HeaderEncoded)),
28-
Type = proplists:get_value(<<"typ">>, Header),
29-
AlgorithmStr = proplists:get_value(<<"alg">>, Header),
30-
Expiration = proplists:get_value(<<"exp">>, Header, noexp),
31-
Algorithm = algorithm_to_atom(AlgorithmStr),
32-
DataEncoded = <<HeaderEncoded/binary, $., PayloadEncoded/binary>>,
33-
ActualSignature = get_signature(Algorithm, DataEncoded, Secret),
34-
Signature = base64url:decode(SignatureEncoded),
35-
Payload = jsx:decode(base64url:decode(PayloadEncoded)),
36-
Jwt = #jwt{typ=Type, body=Payload, alg=Algorithm,
37-
sig=Signature, actual_sig=ActualSignature},
38-
if
39-
Signature =:= ActualSignature ->
40-
% TODO: leeway
41-
NowSecs = now_secs(),
42-
if
43-
Expiration == noexp orelse Expiration > NowSecs ->
44-
{ok, Jwt};
45-
true ->
46-
{error, {expired, Expiration}}
47-
end;
48-
true ->
49-
{error, {badsig, Jwt}}
50-
end;
51-
_ ->
52-
{error, badtoken}
25+
try
26+
case binary:split(Data, [<<".">>], [global]) of
27+
[HeaderEncoded, PayloadEncoded, SignatureEncoded] ->
28+
Header = jsx:decode(base64url:decode(HeaderEncoded)),
29+
Type = proplists:get_value(<<"typ">>, Header),
30+
AlgorithmStr = proplists:get_value(<<"alg">>, Header),
31+
Expiration = proplists:get_value(<<"exp">>, Header, noexp),
32+
Algorithm = algorithm_to_atom(AlgorithmStr),
33+
DataEncoded = <<HeaderEncoded/binary, $.,
34+
PayloadEncoded/binary>>,
35+
ActualSignature = get_signature(Algorithm, DataEncoded, Secret),
36+
Signature = base64url:decode(SignatureEncoded),
37+
Payload = base64url:decode(PayloadEncoded),
38+
Jwt = #jwt{typ=Type, body=Payload, alg=Algorithm,
39+
sig=Signature, actual_sig=ActualSignature},
40+
if
41+
Signature =:= ActualSignature ->
42+
% TODO: leeway
43+
NowSecs = now_secs(),
44+
if
45+
Expiration == noexp orelse Expiration > NowSecs ->
46+
{ok, Jwt};
47+
true ->
48+
{error, {expired, Expiration}}
49+
end;
50+
true ->
51+
{error, {badsig, Jwt}}
52+
end;
53+
_ ->
54+
{error, badtoken}
55+
end
5356
catch
5457
error:E ->
5558
{error, E}

test/jwt_SUITE.erl

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
-module(jwt_SUITE).
22
-compile(export_all).
33

4-
-include("include/jwt.hrl").
4+
-include("jwt.hrl").
55

66
all() ->
77
[encode_decode, decode_with_bad_secret, decode_empty_token,
8-
decode_bad_token, decode_bad_token_3_parts, decode_good,
8+
decode_bad_token, decode_bad_token_3_parts, decode_bad_sig,
99
decode_expired].
1010

1111
init_per_suite(Config) ->
@@ -31,10 +31,24 @@ decode_with_bad_secret(_) ->
3131
{ok, Jwt} = jwt:encode(hs256, [{name, <<"bob">>}, {age, 29}], <<"secret">>),
3232
{error, {badsig, _Decoded}} = jwt:decode(Jwt, <<"notsecret">>).
3333

34-
decode_good(_) ->
35-
{ok, Jwt} = jwt:decode(<<"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1IjoiYWRtaW4ifQ.KS4+DGuMMuJTcsDApSmmB11TR+O1FkeUu8ByL2qVUlk">>, <<"changeme">>),
36-
Body = jsx:decode(Jwt#jwt.body),
37-
<<"admin">> = proplists:get_value(<<"u">>, Body).
34+
decode_bad_sig(_) ->
35+
Encoded = <<"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9."
36+
"eyJ1IjoiYWRtaW4ifQ."
37+
"KS4+DGuMMuJTcsDApSmmB11TR+O1FkeUu8ByL2qVUlk">>,
38+
Signature = <<41,46,62,12,107,140,50,226,83,114,192,192,165,41,
39+
166,7,93,83,71,227,181,22,71,148,187,192,114,47,
40+
106,149,82,89>>,
41+
ActualSignature = <<210,21,116,4,249,201,17,92,117,190,215,176,
42+
22,187,0,69,214,249,100,119,220,25,108,132,
43+
138,80,4,37,248,30,15,80>>,
44+
{error,
45+
{badsig,
46+
#jwt{typ = <<"JWT">>,
47+
body = <<"{\"u\":\"admin\"}">>,
48+
alg = hs256,
49+
sig = Signature,
50+
actual_sig = ActualSignature}}} = jwt:decode(Encoded,
51+
<<"changeme">>).
3852

3953
decode_empty_token(_) ->
4054
{error, badtoken} = jwt:decode(<<"">>, <<"secret">>).

0 commit comments

Comments
 (0)