Skip to content

Commit 15c8705

Browse files
authored
Merge pull request #17 from oreillymedia/UA-4502
UA-4502 | Log token endpoint errors
2 parents eb93f89 + 6b3a960 commit 15c8705

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
lines changed

oidc_provider/lib/endpoints/token.py

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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):

oidc_provider/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.8.3+orm.2'
1+
__version__ = "0.8.3+orm.3"

0 commit comments

Comments
 (0)