about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-05-06 07:31:42 +0300
committerFrederick Muriuki Muriithi2024-05-06 07:31:42 +0300
commitab04428463518d05594491ca159f5ab0d7575721 (patch)
treef541a058e057320f4065e189b315cc9e0b2952dd
parent51e3a545d7380e5b1983b0a1e8b5088a88efe522 (diff)
downloadgn-auth-ab04428463518d05594491ca159f5ab0d7575721.tar.gz
Add `jti` claim
Have each JWT token have a `jti` claim (JWT ID) to help with tracking
refreshes, and therefore validity of the JWTs.

If a refresh token is used more than once, then that refresh token,
and all its progeny/descendants are considered invalid, since that
token could have been stolen.
-rw-r--r--gn_auth/auth/authentication/oauth2/grants/jwt_bearer_grant.py10
1 files changed, 9 insertions, 1 deletions
diff --git a/gn_auth/auth/authentication/oauth2/grants/jwt_bearer_grant.py b/gn_auth/auth/authentication/oauth2/grants/jwt_bearer_grant.py
index 8e2f082..5e12575 100644
--- a/gn_auth/auth/authentication/oauth2/grants/jwt_bearer_grant.py
+++ b/gn_auth/auth/authentication/oauth2/grants/jwt_bearer_grant.py
@@ -1,4 +1,6 @@
 """JWT as Authorisation Grant"""
+import uuid
+
 from flask import current_app as app
 
 from authlib.common.security import generate_token
@@ -28,7 +30,9 @@ class JWTBearerTokenGenerator(_JWTBearerTokenGenerator):
                 key: str(value) if key.endswith("_id") else value
                 for key, value in tokendata.items()
             },
-            "sub": str(tokendata["sub"])}
+            "sub": str(tokendata["sub"]),
+            "jti": str(uuid.uuid4())
+        }
 
 
     def __call__(self, grant_type, client, user=None, scope=None,
@@ -54,6 +58,10 @@ class JWTBearerGrant(_JWTBearerGrant):
     """Implement JWT as Authorisation Grant."""
 
     TOKEN_ENDPOINT_AUTH_METHODS = ["client_secret_post", "client_secret_jwt"]
+    CLAIMS_OPTIONS = {
+        **_JWTBearerGrant.CLAIMS_OPTIONS,
+        "jti": {"essential": True}
+    }
 
 
     def resolve_issuer_client(self, issuer):