diff --git a/auth_jwt/__manifest__.py b/auth_jwt/__manifest__.py
index 8a311e5bdf..1acd7340a6 100644
--- a/auth_jwt/__manifest__.py
+++ b/auth_jwt/__manifest__.py
@@ -5,7 +5,7 @@
"name": "Auth JWT",
"summary": """
JWT bearer token authentication.""",
- "version": "18.0.1.0.0",
+ "version": "18.0.1.1.0",
"license": "LGPL-3",
"author": "ACSONE SA/NV,Odoo Community Association (OCA)",
"maintainers": ["sbidoul"],
diff --git a/auth_jwt/models/auth_jwt_validator.py b/auth_jwt/models/auth_jwt_validator.py
index 13649adad2..a75adb256b 100644
--- a/auth_jwt/models/auth_jwt_validator.py
+++ b/auth_jwt/models/auth_jwt_validator.py
@@ -64,8 +64,19 @@ class AuthJwtValidator(models.Model):
],
default="RS256",
)
+ audience_type = fields.Selection(
+ [
+ ("aud", "Audience"),
+ ("group", "Group"),
+ ("scope", "Scope"),
+ ("custom", "Custom"),
+ ],
+ required=True,
+ default="aud",
+ )
+ audience_type_custom = fields.Char(required=False, help="payload key to validate")
audience = fields.Char(
- required=True, help="Comma separated list of audiences, to validate aud."
+ required=True, help="Comma separated list of attribute needed."
)
issuer = fields.Char(required=True, help="To validate iss.")
user_id_strategy = fields.Selection(
@@ -160,7 +171,7 @@ def _get_validator_by_name(self, validator_name):
@tools.ormcache("self.public_key_jwk_uri", "kid")
def _get_key(self, kid):
- jwks_client = PyJWKClient(self.public_key_jwk_uri, cache_keys=False)
+ jwks_client = PyJWKClient(self.public_key_jwk_uri)
return jwks_client.get_signing_key(kid).key
def _encode(self, payload, secret, expire):
@@ -195,19 +206,29 @@ def _decode(self, token, secret=None):
key = self._get_key(header.get("kid"))
algorithm = self.public_key_algorithm
try:
+ aud = self.audience if self.audience_type == "aud" else None
payload = jwt.decode(
token,
key=key,
algorithms=[algorithm],
options=dict(
- require=["exp", "aud", "iss"],
+ require=["exp", "iss"],
verify_exp=True,
- verify_aud=True,
verify_iss=True,
),
- audience=self.audience.split(","),
+ audience=aud,
issuer=self.issuer,
)
+ payload_key = (
+ self.audience_type_custom
+ if self.audience_type == "custom"
+ else self.audience_type
+ )
+ if len((self.audience).split(",") or []) > 0:
+ for key_value in (self.audience).split(","):
+ if key_value in (payload.get(payload_key)).split(" "):
+ return payload
+ raise UnauthorizedInvalidToken()
except Exception as e:
_logger.info("Invalid token: %s", e)
raise UnauthorizedInvalidToken() from e
diff --git a/auth_jwt/views/auth_jwt_validator_views.xml b/auth_jwt/views/auth_jwt_validator_views.xml
index 8aac0f500f..fcdcac1846 100644
--- a/auth_jwt/views/auth_jwt_validator_views.xml
+++ b/auth_jwt/views/auth_jwt_validator_views.xml
@@ -12,8 +12,8 @@
+
-