Skip to content

Commit 181bf82

Browse files
committed
Implement verification for the PKCE flow
1 parent c6272a0 commit 181bf82

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

tests/idp/validator.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
import base64
2+
import hashlib
3+
14
from oauthlib.oauth2 import Client
25
from oauthlib.oauth2 import RequestValidator
36

47

58
class TestValidator(RequestValidator):
9+
pkce_codes = {}
10+
611
def validate_client_id(self, client_id, request, *args, **kwargs):
712
return True
813

@@ -23,12 +28,30 @@ def confirm_redirect_uri(self, client_id, code, redirect_uri, client, request, *
2328
return True
2429

2530
def validate_code(self, client_id, code, client, request, *args, **kwargs):
26-
return True
31+
stored_challenge = self.pkce_codes.get(code)
32+
if not stored_challenge:
33+
return False
34+
35+
code_verifier = request.code_verifier
36+
code_challenge = stored_challenge.get("code_challenge")
37+
code_challenge_method = stored_challenge.get("code_challenge_method")
38+
39+
computed_challenge = code_verifier
40+
if code_challenge_method == "S256":
41+
sha256 = hashlib.sha256()
42+
sha256.update(code_verifier.encode("utf-8"))
43+
computed_challenge = base64.urlsafe_b64encode(sha256.digest()).decode("utf-8").replace("=", "")
44+
45+
return computed_challenge == code_challenge
2746

2847
def validate_scopes(self, client_id, scopes, client, request, *args, **kwargs):
2948
return True
3049

3150
def save_authorization_code(self, client_id, code, request, *args, **kwargs):
51+
self.pkce_codes[code.get("code")] = dict(
52+
code_challenge=request.code_challenge,
53+
code_challenge_method=request.code_challenge_method,
54+
)
3255
return True
3356

3457
def validate_response_type(self, client_id, response_type, client, request, *args, **kwargs):

0 commit comments

Comments
 (0)