Skip to content

Commit 29d391d

Browse files
committed
fix: jwt encode and decode methods only works for JWS by default
MUST provide JWERegistry to encode and decode JWT.
1 parent 2470d72 commit 29d391d

3 files changed

Lines changed: 15 additions & 20 deletions

File tree

docs/guide/jwt.rst

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,18 +147,20 @@ The ``JWTClaimsRegistry`` has built-in validators for timing related fields:
147147
JWS & JWE
148148
---------
149149

150-
JWT is built on top of JWS and JWE, all of the above examples are in JWS. Here
151-
is an example of JWE:
150+
JWT is built on top of JWS and JWE, all of the above examples are in JWS. By default
151+
``jwt.encode`` and ``jwt.decode`` work for **JWS**. To use **JWE**, you need to specify
152+
a ``registry`` parameter with ``JWERegistry``. Here is an example of JWE:
152153

153154
.. code-block:: python
154155
155-
from joserfc import jwt
156+
from joserfc import jwt, jwe
156157
from joserfc.jwk import OctKey
157158
158159
header = {"alg": "A128KW", "enc": "A128GCM"}
159160
claims = {"iss": "https://authlib.org"}
160161
key = OctKey.generate_key(128) # the algorithm requires key of 128 bit size
161-
jwt.encode(header, claims, key)
162+
registry = jwe.JWERegistry() # YOU MUST USE A JWERegistry
163+
jwt.encode(header, claims, key, registry=registry)
162164
163165
The JWE formatted result contains 5 parts, while JWS only contains 3 parts,
164166
a JWE example would be something like this (line breaks for display only):

src/joserfc/jwt.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,9 @@ def encode(
6060
# add ``typ`` in header
6161
_header = {"typ": "JWT", **header}
6262
payload = convert_claims(claims)
63-
if "enc" in _header:
64-
if registry is not None:
65-
assert isinstance(registry, JWERegistry)
63+
if isinstance(registry, JWERegistry):
6664
return encrypt_compact(_header, payload, key, algorithms, registry)
6765
else:
68-
if registry is not None:
69-
assert isinstance(registry, JWSRegistry)
7066
return serialize_compact(_header, payload, key, algorithms, registry)
7167

7268

@@ -87,13 +83,9 @@ def decode(
8783
_value = to_bytes(value)
8884
header: Header
8985
payload: bytes
90-
if _value.count(b".") == 4:
91-
if registry is not None:
92-
assert isinstance(registry, JWERegistry)
86+
if isinstance(registry, JWERegistry):
9387
header, payload = _decode_jwe(_value, key, algorithms, registry)
9488
else:
95-
if registry is not None:
96-
assert isinstance(registry, JWSRegistry)
9789
header, payload = _decode_jws(_value, key, algorithms, registry)
9890

9991
try:

tests/jwt/test_jwt.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ def test_jwe_format(self):
3232
header = {"alg": "A128KW", "enc": "A128GCM"}
3333
claims = {"iss": "https://authlib.org"}
3434
key = OctKey.generate_key(128)
35-
result = jwt.encode(header, claims, key)
35+
registry = jwe.JWERegistry()
36+
result = jwt.encode(header, claims, key, registry=registry)
3637
self.assertEqual(result.count('.'), 4)
3738

38-
token = jwt.decode(result, key)
39+
token = jwt.decode(result, key, registry=registry)
3940
self.assertEqual(token.claims, claims)
4041

4142
def test_using_registry(self):
@@ -54,26 +55,26 @@ def test_using_registry(self):
5455
jwt.decode(value2, key, registry=jwe.JWERegistry())
5556

5657
self.assertRaises(
57-
AssertionError,
58+
KeyError,
5859
jwt.encode,
5960
{"alg": "HS256"},
6061
{"sub": "a"},
6162
key, registry=jwe.JWERegistry(),
6263
)
6364
self.assertRaises(
64-
AssertionError,
65+
ValueError,
6566
jwt.encode,
6667
{"alg": "A128KW", "enc": "A128GCM"},
6768
{"sub": "a"},
6869
key, registry=jws.JWSRegistry(),
6970
)
7071
self.assertRaises(
71-
AssertionError,
72+
ValueError,
7273
jwt.decode,
7374
value1, key, registry=jwe.JWERegistry(),
7475
)
7576
self.assertRaises(
76-
AssertionError,
77+
ValueError,
7778
jwt.decode,
7879
value2, key, registry=jws.JWSRegistry(),
7980
)

0 commit comments

Comments
 (0)