Skip to content

Commit 241dd45

Browse files
authored
feat: add error reason to OAuth2TokenExchangeError event (#3971)
1 parent 80f67e8 commit 241dd45

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

oauth2/handler.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,7 +1172,7 @@ func (h *Handler) oauth2TokenExchange(w http.ResponseWriter, r *http.Request) {
11721172
if err != nil {
11731173
h.logOrAudit(err, r)
11741174
h.r.OAuth2Provider().WriteAccessError(ctx, w, accessRequest, err)
1175-
events.Trace(ctx, events.TokenExchangeError)
1175+
events.Trace(ctx, events.TokenExchangeError, events.WithError(err))
11761176
return
11771177
}
11781178

@@ -1185,7 +1185,7 @@ func (h *Handler) oauth2TokenExchange(w http.ResponseWriter, r *http.Request) {
11851185
if err != nil {
11861186
h.logOrAudit(err, r)
11871187
h.r.OAuth2Provider().WriteAccessError(ctx, w, accessRequest, err)
1188-
events.Trace(ctx, events.TokenExchangeError, events.WithRequest(accessRequest))
1188+
events.Trace(ctx, events.TokenExchangeError, events.WithRequest(accessRequest), events.WithError(err))
11891189
return
11901190
}
11911191
}
@@ -1234,23 +1234,22 @@ func (h *Handler) oauth2TokenExchange(w http.ResponseWriter, r *http.Request) {
12341234
}
12351235

12361236
for _, hook := range h.r.AccessRequestHooks() {
1237-
if err = hook(ctx, accessRequest); err != nil {
1237+
if err := hook(ctx, accessRequest); err != nil {
12381238
h.logOrAudit(err, r)
12391239
h.r.OAuth2Provider().WriteAccessError(ctx, w, accessRequest, err)
1240-
events.Trace(ctx, events.TokenExchangeError, events.WithRequest(accessRequest))
1240+
events.Trace(ctx, events.TokenExchangeError, events.WithRequest(accessRequest), events.WithError(err))
12411241
return
12421242
}
12431243
}
12441244

12451245
var accessResponse fosite.AccessResponder
1246-
if err := h.r.Persister().Transaction(ctx, func(ctx context.Context, _ *pop.Connection) error {
1247-
var err error
1246+
if err := h.r.Persister().Transaction(ctx, func(ctx context.Context, _ *pop.Connection) (err error) {
12481247
accessResponse, err = h.r.OAuth2Provider().NewAccessResponse(ctx, accessRequest)
12491248
return err
12501249
}); err != nil {
12511250
h.logOrAudit(err, r)
12521251
h.r.OAuth2Provider().WriteAccessError(ctx, w, accessRequest, err)
1253-
events.Trace(ctx, events.TokenExchangeError, events.WithRequest(accessRequest))
1252+
events.Trace(ctx, events.TokenExchangeError, events.WithRequest(accessRequest), events.WithError(err))
12541253
return
12551254
}
12561255

x/events/events.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ package events
55

66
import (
77
"context"
8+
"errors"
89

910
otelattr "go.opentelemetry.io/otel/attribute"
1011
"go.opentelemetry.io/otel/trace"
1112

1213
"github.com/ory/fosite"
14+
"github.com/ory/herodot"
1315
"github.com/ory/x/otelx/semconv"
1416
)
1517

@@ -68,6 +70,7 @@ const (
6870
attributeKeyOAuth2TokenFormat = "OAuth2TokenFormat" //nolint:gosec
6971
attributeKeyOAuth2RefreshTokenSignature = "OAuth2RefreshTokenSignature" //nolint:gosec
7072
attributeKeyOAuth2AccessTokenSignature = "OAuth2AccessTokenSignature" //nolint:gosec
73+
attributeKeyErrorReason = "ErrorReason"
7174
)
7275

7376
// WithTokenFormat emits the token format as part of the event.
@@ -129,6 +132,17 @@ func WithRequest(request fosite.Requester) trace.EventOption {
129132
return trace.WithAttributes(attributes...)
130133
}
131134

135+
// WithError sets the Reason attribute according to the error given.
136+
func WithError(err error) trace.EventOption {
137+
if err == nil {
138+
return trace.WithAttributes()
139+
}
140+
if rc := herodot.ReasonCarrier(nil); errors.As(err, &rc) && rc.Reason() != "" { // also works for fosite.RFC6749Error
141+
return trace.WithAttributes(otelattr.String(attributeKeyErrorReason, rc.Reason()))
142+
}
143+
return trace.WithAttributes(otelattr.String(attributeKeyErrorReason, err.Error()))
144+
}
145+
132146
// Trace emits an event with the given attributes.
133147
func Trace(ctx context.Context, event semconv.Event, opts ...trace.EventOption) {
134148
allOpts := append([]trace.EventOption{trace.WithAttributes(semconv.AttributesFromContext(ctx)...)}, opts...)

0 commit comments

Comments
 (0)