Skip to content
This repository was archived by the owner on Jun 23, 2023. It is now read-only.

Commit 9eb577b

Browse files
authored
Merge pull request #128 from nsklikas/feature-grant-types-fix
Don't issue refresh token if not configured
2 parents 1f16205 + 5228f17 commit 9eb577b

3 files changed

Lines changed: 25 additions & 21 deletions

File tree

src/oidcop/oauth2/token.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,16 @@ def process_request(self, req: Union[Message, dict], **kwargs):
118118
return self.error_cls(error="invalid_request", error_description="Missing code")
119119

120120
_session_info = _mngr.get_session_info_by_token(_access_code, grant=True)
121-
if _session_info["client_id"] != req["client_id"]:
122-
logger.debug("{} owner of token".format(_session_info["client_id"]))
121+
client_id = _session_info["client_id"]
122+
if client_id != req["client_id"]:
123+
logger.debug("{} owner of token".format(client_id))
123124
logger.warning("Client using token it was not given")
124125
return self.error_cls(error="invalid_grant", error_description="Wrong client")
125126

127+
if "grant_types_supported" in _context.cdb[client_id]:
128+
grant_types_supported = _context.cdb[client_id].get("grant_types_supported")
129+
else:
130+
grant_types_supported = _context.provider_info["grant_types_supported"]
126131
grant = _session_info["grant"]
127132

128133
_based_on = grant.get_token(_access_code)
@@ -162,7 +167,11 @@ def process_request(self, req: Union[Message, dict], **kwargs):
162167
if token.expires_at:
163168
_response["expires_in"] = token.expires_at - utc_time_sans_frac()
164169

165-
if issue_refresh and "refresh_token" in _supports_minting:
170+
if (
171+
issue_refresh
172+
and "refresh_token" in _supports_minting
173+
and "refresh_token" in grant_types_supported
174+
):
166175
try:
167176
refresh_token = self._mint_token(
168177
token_class="refresh_token",

src/oidcop/oidc/token.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,16 @@ def process_request(self, req: Union[Message, dict], **kwargs):
4545
_session_info = _mngr.get_session_info_by_token(_access_code, grant=True)
4646
logger.debug(f"Session info: {_session_info}")
4747

48-
if _session_info["client_id"] != req["client_id"]:
49-
logger.debug("{} owner of token".format(_session_info["client_id"]))
48+
client_id = _session_info["client_id"]
49+
if client_id != req["client_id"]:
50+
logger.debug("{} owner of token".format(client_id))
5051
logger.warning("{} using token it was not given".format(req["client_id"]))
5152
return self.error_cls(error="invalid_grant", error_description="Wrong client")
5253

54+
if "grant_types_supported" in _context.cdb[client_id]:
55+
grant_types_supported = _context.cdb[client_id].get("grant_types_supported")
56+
else:
57+
grant_types_supported = _context.provider_info["grant_types_supported"]
5358
grant = _session_info["grant"]
5459

5560
token_type = "Bearer"
@@ -110,7 +115,11 @@ def process_request(self, req: Union[Message, dict], **kwargs):
110115
if token.expires_at:
111116
_response["expires_in"] = token.expires_at - utc_time_sans_frac()
112117

113-
if issue_refresh and "refresh_token" in _supports_minting:
118+
if (
119+
issue_refresh
120+
and "refresh_token" in _supports_minting
121+
and "refresh_token" in grant_types_supported
122+
):
114123
try:
115124
refresh_token = self._mint_token(
116125
token_class="refresh_token",

tests/test_24_oauth2_token_endpoint.py

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -374,21 +374,7 @@ def test_refresh_grant_disallowed_per_client(self):
374374
_req = self.token_endpoint.parse_request(_token_request)
375375
_resp = self.token_endpoint.process_request(request=_req, issue_refresh=True)
376376

377-
_request = REFRESH_TOKEN_REQ.copy()
378-
_request["refresh_token"] = _resp["response_args"]["refresh_token"]
379-
380-
_token_value = _resp["response_args"]["refresh_token"]
381-
_session_info = self.session_manager.get_session_info_by_token(_token_value)
382-
_token = self.session_manager.find_token(_session_info["session_id"], _token_value)
383-
_token.usage_rules["supports_minting"] = ["access_token", "refresh_token"]
384-
385-
_req = self.token_endpoint.parse_request(_request.to_json())
386-
387-
assert isinstance(_req, TokenErrorResponse)
388-
assert _req.to_dict() == {
389-
"error": "invalid_request",
390-
"error_description": "Unsupported grant_type: refresh_token",
391-
}
377+
assert "refresh_token" not in _resp
392378

393379
def test_do_2nd_refresh_access_token(self):
394380
areq = AUTH_REQ.copy()

0 commit comments

Comments
 (0)