@@ -47,44 +47,74 @@ def _extract_params(self):
47
47
self .params ["password" ] = self .request .POST .get ("password" , "" )
48
48
49
49
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
+ }
50
56
try :
51
57
self .client = Client .objects .get (client_id = self .params ["client_id" ])
52
58
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
+ )
54
64
raise TokenError ("invalid_client" )
55
65
56
66
if self .client .client_type == "confidential" :
57
67
if not (self .client .client_secret == self .params ["client_secret" ]):
58
- logger .debug (
68
+ logger .info (
59
69
"[Token] Invalid client secret: client %s do not have secret %s" ,
60
70
self .client .client_id ,
61
71
self .client .client_secret ,
72
+ extra = log_extra ,
62
73
)
63
74
raise TokenError ("invalid_client" )
64
75
65
76
if self .params ["grant_type" ] == "authorization_code" :
66
77
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
+ )
68
83
raise TokenError ("invalid_client" )
69
84
70
85
try :
71
86
self .code = Code .objects .select_for_update (nowait = True ).get (
72
87
code = self .params ["code" ]
73
88
)
74
89
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
+ )
76
95
raise TokenError ("invalid_grant" )
77
96
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
+ )
79
102
raise TokenError ("invalid_grant" )
80
103
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
+
81
107
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
+ )
83
112
raise TokenError ("invalid_grant" )
84
113
85
114
# Validate PKCE parameters.
86
115
if self .code .code_challenge :
87
116
if self .params ["code_verifier" ] is None :
117
+ logger .info ("[Token] Missing code_verifier" , extra = log_extra )
88
118
raise TokenError ("invalid_grant" )
89
119
90
120
if self .code .code_challenge_method == "S256" :
@@ -100,6 +130,10 @@ def validate_params(self):
100
130
101
131
# TODO: We should explain the error.
102
132
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
+ )
103
137
raise TokenError ("invalid_grant" )
104
138
105
139
elif self .params ["grant_type" ] == "password" :
@@ -123,7 +157,7 @@ def validate_params(self):
123
157
124
158
elif self .params ["grant_type" ] == "refresh_token" :
125
159
if not self .params ["refresh_token" ]:
126
- logger .debug ("[Token] Missing refresh token" )
160
+ logger .info ("[Token] Missing refresh token" )
127
161
raise TokenError ("invalid_grant" )
128
162
129
163
try :
@@ -132,16 +166,16 @@ def validate_params(self):
132
166
)
133
167
134
168
except Token .DoesNotExist :
135
- logger .debug (
169
+ logger .info (
136
170
"[Token] Refresh token does not exist: %s" , self .params ["refresh_token" ]
137
171
)
138
172
raise TokenError ("invalid_grant" )
139
173
elif self .params ["grant_type" ] == "client_credentials" :
140
174
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" )
142
176
raise TokenError ("invalid_scope" )
143
177
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" ])
145
179
raise TokenError ("unsupported_grant_type" )
146
180
147
181
def validate_requested_scopes (self ):
0 commit comments