@@ -47,44 +47,74 @@ def _extract_params(self):
4747 self .params ["password" ] = self .request .POST .get ("password" , "" )
4848
4949 def validate_params (self ):
50+ log_extra = {
51+ "client_id" : self .params ["client_id" ],
52+ "redirecT_uri" : self .params ["redirect_uri" ],
53+ "grant_type" : self .params ["grant_type" ],
54+ "scope" : self .params ["scope" ],
55+ }
5056 try :
5157 self .client = Client .objects .get (client_id = self .params ["client_id" ])
5258 except Client .DoesNotExist :
53- logger .debug ("[Token] Client does not exist: %s" , self .params ["client_id" ])
59+ logger .info (
60+ "[Token] Client does not exist: %s" ,
61+ self .params ["client_id" ],
62+ extra = log_extra ,
63+ )
5464 raise TokenError ("invalid_client" )
5565
5666 if self .client .client_type == "confidential" :
5767 if not (self .client .client_secret == self .params ["client_secret" ]):
58- logger .debug (
68+ logger .info (
5969 "[Token] Invalid client secret: client %s do not have secret %s" ,
6070 self .client .client_id ,
6171 self .client .client_secret ,
72+ extra = log_extra ,
6273 )
6374 raise TokenError ("invalid_client" )
6475
6576 if self .params ["grant_type" ] == "authorization_code" :
6677 if self .params ["redirect_uri" ] not in self .client .redirect_uris :
67- logger .debug ("[Token] Invalid redirect uri: %s" , self .params ["redirect_uri" ])
78+ logger .info (
79+ "[Token] Invalid redirect uri: %s" ,
80+ self .params ["redirect_uri" ],
81+ extra = log_extra ,
82+ )
6883 raise TokenError ("invalid_client" )
6984
7085 try :
7186 self .code = Code .objects .select_for_update (nowait = True ).get (
7287 code = self .params ["code" ]
7388 )
7489 except DatabaseError :
75- logger .debug ("[Token] Code cannot be reused: %s" , self .params ["code" ])
90+ logger .info (
91+ "[Token] Code cannot be reused: %s" ,
92+ self .params ["code" ],
93+ extra = log_extra ,
94+ )
7695 raise TokenError ("invalid_grant" )
7796 except Code .DoesNotExist :
78- logger .debug ("[Token] Code does not exist: %s" , self .params ["code" ])
97+ logger .info (
98+ "[Token] Code does not exist: %s" ,
99+ self .params ["code" ],
100+ extra = log_extra ,
101+ )
79102 raise TokenError ("invalid_grant" )
80103
104+ # Log the id instead of the code itself to reduce leak risk. We can look it up.
105+ log_extra ["code_id" ] = self .code .id
106+
81107 if not (self .code .client == self .client ) or self .code .has_expired ():
82- logger .debug ("[Token] Invalid code: invalid client or code has expired" )
108+ logger .info (
109+ "[Token] Invalid code: invalid client or code has expired" ,
110+ extra = log_extra ,
111+ )
83112 raise TokenError ("invalid_grant" )
84113
85114 # Validate PKCE parameters.
86115 if self .code .code_challenge :
87116 if self .params ["code_verifier" ] is None :
117+ logger .info ("[Token] Missing code_verifier" , extra = log_extra )
88118 raise TokenError ("invalid_grant" )
89119
90120 if self .code .code_challenge_method == "S256" :
@@ -100,6 +130,10 @@ def validate_params(self):
100130
101131 # TODO: We should explain the error.
102132 if not (new_code_challenge == self .code .code_challenge ):
133+ logger .info (
134+ "[Token] code verifier did not match code challenge" ,
135+ extra = log_extra ,
136+ )
103137 raise TokenError ("invalid_grant" )
104138
105139 elif self .params ["grant_type" ] == "password" :
@@ -123,7 +157,7 @@ def validate_params(self):
123157
124158 elif self .params ["grant_type" ] == "refresh_token" :
125159 if not self .params ["refresh_token" ]:
126- logger .debug ("[Token] Missing refresh token" )
160+ logger .info ("[Token] Missing refresh token" )
127161 raise TokenError ("invalid_grant" )
128162
129163 try :
@@ -132,16 +166,16 @@ def validate_params(self):
132166 )
133167
134168 except Token .DoesNotExist :
135- logger .debug (
169+ logger .info (
136170 "[Token] Refresh token does not exist: %s" , self .params ["refresh_token" ]
137171 )
138172 raise TokenError ("invalid_grant" )
139173 elif self .params ["grant_type" ] == "client_credentials" :
140174 if not self .client ._scope :
141- logger .debug ("[Token] Client using client credentials with empty scope" )
175+ logger .info ("[Token] Client using client credentials with empty scope" )
142176 raise TokenError ("invalid_scope" )
143177 else :
144- logger .debug ("[Token] Invalid grant type: %s" , self .params ["grant_type" ])
178+ logger .info ("[Token] Invalid grant type: %s" , self .params ["grant_type" ])
145179 raise TokenError ("unsupported_grant_type" )
146180
147181 def validate_requested_scopes (self ):
0 commit comments