Skip to content

Commit 373d4d8

Browse files
authored
Validate claims if configured and verify_signature is not. (jpadilla#608)
* Validate claims if configured. * Remove secret and algorithm since we don't validate the signature. * Add changelog.
1 parent cda3ef1 commit 373d4d8

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ This project adheres to `Semantic Versioning <https://semver.org/>`__.
1010
Changed
1111
~~~~~~~
1212

13+
- Allow claims validation without making JWT signature validation mandatory. `#608 <https://github.com/jpadilla/pyjwt/pull/608>`__
14+
1315
Fixed
1416
~~~~~
1517

jwt/api_jwt.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ def decode_complete(
7575
else:
7676
options.setdefault("verify_signature", True)
7777

78+
if not options["verify_signature"]:
79+
options.setdefault("verify_exp", False)
80+
options.setdefault("verify_nbf", False)
81+
options.setdefault("verify_iat", False)
82+
options.setdefault("verify_aud", False)
83+
options.setdefault("verify_iss", False)
84+
7885
if options["verify_signature"] and not algorithms:
7986
raise DecodeError(
8087
'It is required that you pass in a value for the "algorithms" argument when calling decode().'
@@ -95,9 +102,8 @@ def decode_complete(
95102
if not isinstance(payload, dict):
96103
raise DecodeError("Invalid payload string: must be a json object")
97104

98-
if options["verify_signature"]:
99-
merged_options = {**self.options, **options}
100-
self._validate_claims(payload, merged_options, **kwargs)
105+
merged_options = {**self.options, **options}
106+
self._validate_claims(payload, merged_options, **kwargs)
101107

102108
decoded["payload"] = payload
103109
return decoded

tests/test_api_jwt.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,22 @@ def test_decode_with_verify_exp_option(self, jwt, payload):
579579
options={"verify_exp": True},
580580
)
581581

582+
def test_decode_with_verify_exp_option_and_signature_off(self, jwt, payload):
583+
payload["exp"] = utc_timestamp() - 1
584+
secret = "secret"
585+
jwt_message = jwt.encode(payload, secret)
586+
587+
jwt.decode(
588+
jwt_message,
589+
options={"verify_signature": False},
590+
)
591+
592+
with pytest.raises(ExpiredSignatureError):
593+
jwt.decode(
594+
jwt_message,
595+
options={"verify_signature": False, "verify_exp": True},
596+
)
597+
582598
def test_decode_with_optional_algorithms(self, jwt, payload):
583599
secret = "secret"
584600
jwt_message = jwt.encode(payload, secret)

0 commit comments

Comments
 (0)