Log identity_id on every authenticated request

Add a single info log line in each authn middleware once an identity is
resolved, so every authenticated request emits a record that ties the
request back to its user and credential:

- Cookie session middleware logs "session authenticated" with
  identity_id and session_id.
- API key middleware logs "api key authenticated" with identity_id and
  api_key_id.
- OAuth2 access token middleware logs "access token authenticated"
  with identity_id and access_token_id.

The credential IDs are row identifiers (GIDs), not the secret token
values, so they're safe to log and let operators correlate a request
back to the specific credential used. The log lines use the
request-scoped logger from httpserver.LoggerFromContext so they
inherit http_request_id and any other middleware-attached attributes.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2026-05-13 15:16:17 +02:00
parent 7b9090a9f1
commit 9eed0d71c8
3 changed files with 25 additions and 0 deletions

View File

@@ -22,6 +22,7 @@ import (
"github.com/99designs/gqlgen/graphql"
"github.com/vektah/gqlparser/v2/gqlerror"
"go.gearno.de/kit/httpserver"
"go.gearno.de/kit/log"
"go.probo.inc/probo/pkg/gid"
"go.probo.inc/probo/pkg/iam"
"go.probo.inc/probo/pkg/securetoken"
@@ -87,6 +88,13 @@ func NewAPIKeyMiddleware(svc *iam.Service, tokenSecret string) func(next http.Ha
ctx = ContextWithAPIKey(ctx, apiKey)
ctx = ContextWithIdentity(ctx, identity)
httpserver.LoggerFromContext(ctx).InfoCtx(
ctx,
"api key authenticated",
log.String("identity_id", identity.ID.String()),
log.String("api_key_id", apiKey.ID.String()),
)
next.ServeHTTP(w, r.WithContext(ctx))
},
)

View File

@@ -18,6 +18,8 @@ import (
"fmt"
"net/http"
"go.gearno.de/kit/httpserver"
"go.gearno.de/kit/log"
"go.probo.inc/probo/pkg/bearertoken"
"go.probo.inc/probo/pkg/iam"
)
@@ -52,6 +54,13 @@ func NewOAuth2AccessTokenMiddleware(svc *iam.Service) func(next http.Handler) ht
ctx = ContextWithIdentity(ctx, identity)
httpserver.LoggerFromContext(ctx).InfoCtx(
ctx,
"access token authenticated",
log.String("identity_id", identity.ID.String()),
log.String("access_token_id", accessToken.ID.String()),
)
next.ServeHTTP(w, r.WithContext(ctx))
},
)

View File

@@ -23,6 +23,7 @@ import (
"github.com/99designs/gqlgen/graphql"
"github.com/vektah/gqlparser/v2/gqlerror"
"go.gearno.de/kit/httpserver"
"go.gearno.de/kit/log"
"go.probo.inc/probo/pkg/gid"
"go.probo.inc/probo/pkg/iam"
"go.probo.inc/probo/pkg/securecookie"
@@ -105,6 +106,13 @@ func NewSessionMiddleware(svc *iam.Service, cookieConfig securecookie.Config) fu
ctx = ContextWithSession(ctx, session)
ctx = ContextWithIdentity(ctx, identity)
httpserver.LoggerFromContext(ctx).InfoCtx(
ctx,
"session authenticated",
log.String("identity_id", identity.ID.String()),
log.String("session_id", session.ID.String()),
)
next.ServeHTTP(w, r.WithContext(ctx))
err = svc.SessionService.UpdateSessionData(ctx, session.ID, session.Data)