summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Woodruff <william@yossarian.net>2022-01-24 21:12:53 -0500
committerGitHub <noreply@github.com>2022-01-25 08:12:53 +0600
commita03b36cd9bf067c232f61f8445b09d24e2732ef6 (patch)
tree549e2afc0f31e697c189cce7c770f1ff8c6b1a09
parent77d791681fa3d0ba65a648de42dd3d671138cb95 (diff)
downloadpyjwt-a03b36cd9bf067c232f61f8445b09d24e2732ef6.tar.gz
api_jwk: Add PyJWKSet.__getitem__ (#725)
* api_jwk: Add PyJWKSet.__getitem__ Closes #724. * CHANGELOG: record changes
-rw-r--r--CHANGELOG.rst2
-rw-r--r--jwt/api_jwk.py6
-rw-r--r--tests/test_api_jwk.py23
3 files changed, 31 insertions, 0 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 498a544..06d281c 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -16,6 +16,8 @@ Fixed
Added
~~~~~
+- Add ``PyJWKSet.__getitem__`` for indexing keysets by key ID `#725 <https://github.com/jpadilla/pyjwt/pull/725>`__
+
`v2.3.0 <https://github.com/jpadilla/pyjwt/compare/2.2.0...2.3.0>`__
-----------------------------------------------------------------------
diff --git a/jwt/api_jwk.py b/jwt/api_jwk.py
index a0f6364..f58bae2 100644
--- a/jwt/api_jwk.py
+++ b/jwt/api_jwk.py
@@ -95,3 +95,9 @@ class PyJWKSet:
def from_json(data):
obj = json.loads(data)
return PyJWKSet.from_dict(obj)
+
+ def __getitem__(self, kid):
+ for key in self.keys:
+ if key.key_id == kid:
+ return key
+ raise KeyError("keyset has no key for kid: %s" % kid)
diff --git a/tests/test_api_jwk.py b/tests/test_api_jwk.py
index 53c0547..6f6cb89 100644
--- a/tests/test_api_jwk.py
+++ b/tests/test_api_jwk.py
@@ -252,3 +252,26 @@ class TestPyJWKSet:
assert jwk.key_type == "RSA"
assert jwk.key_id == "keyid-abc123"
assert jwk.public_key_use == "sig"
+
+ @crypto_required
+ def test_keyset_should_index_by_kid(self):
+ algo = RSAAlgorithm(RSAAlgorithm.SHA256)
+
+ with open(key_path("jwk_rsa_pub.json")) as keyfile:
+ pub_key = algo.from_jwk(keyfile.read())
+
+ key_data_str = algo.to_jwk(pub_key)
+ key_data = json.loads(key_data_str)
+
+ # TODO Should `to_jwk` set these?
+ key_data["alg"] = "RS256"
+ key_data["use"] = "sig"
+ key_data["kid"] = "keyid-abc123"
+
+ jwk_set = PyJWKSet.from_dict({"keys": [key_data]})
+
+ jwk = jwk_set.keys[0]
+ assert jwk == jwk_set["keyid-abc123"]
+
+ with pytest.raises(KeyError):
+ jwk_set["this-kid-does-not-exist"]