Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
0092915
feat(platform): add comprehensive DPoP (RFC 9449) support (DSPX-3397)
dmihalcik-virtru Jun 8, 2026
6101ae8
feat(platform): add DPoP well-known fields, opentdf-dpop KC client, n…
dmihalcik-virtru Jun 9, 2026
dade8b3
fix(platform): well-known []string→[]any + KC26 admin-fine-grained-authz
dmihalcik-virtru Jun 9, 2026
30bb7ee
fix(auth): address DPoP nonce race condition and Connect header propa…
dmihalcik-virtru Jun 10, 2026
397034a
fix(auth): address DPoP PR review findings
dmihalcik-virtru Jun 10, 2026
8baa38b
fix(auth): refactor DPoP nonce manager to use atomic.Pointer and fix …
dmihalcik-virtru Jun 11, 2026
8e5f20f
feat(auth): warn when DPoP-bound token sent under Bearer scheme
dmihalcik-virtru Jun 11, 2026
e4ba978
fixup test static analysis fixes
dmihalcik-virtru Jun 15, 2026
5e16d2c
fix(auth): use full URL for DPoP htu validation in ConnectRPC interce…
dmihalcik-virtru Jun 16, 2026
d3045e2
feat(auth): add strict_htu flag to DPoP htu validation
dmihalcik-virtru Jun 16, 2026
e508bb7
fix(auth): use actual HTTP method for DPoP htm validation in Connect …
dmihalcik-virtru Jun 17, 2026
e136b36
chore(auth): add debug logs for DPoP htm value
dmihalcik-virtru Jun 17, 2026
d87f1cc
fix(kas): return 403 for routine PDP denials in rewrap
dmihalcik-virtru Jun 17, 2026
f892539
fixup: context clarifications
dmihalcik-virtru Jun 18, 2026
17cb018
test: address PR review comments on DPoP HTU determinism and platform…
dmihalcik-virtru Jun 18, 2026
5d56daa
test: keep pinned feat-kc26-dpop tag in start-up action
dmihalcik-virtru Jun 18, 2026
ceeba07
test: gate Keycloak 26.2 behind dpop-challenge-enabled
dmihalcik-virtru Jun 18, 2026
e48c139
fixup: revert action wrong curl change
dmihalcik-virtru Jun 18, 2026
c9f0014
fixup yaml typo
dmihalcik-virtru Jun 18, 2026
e3489bf
feat(auth): add DPoP jti replay protection and address review comments
dmihalcik-virtru Jun 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions sdk/auth/oauth/oauth.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,12 @@ func getDPoPAssertion(dpopJWK jwk.Key, method string, endpoint string, nonce str
panic(err)
}

slog.Debug(
"building dpop assertion",
slog.String("htm", method),
slog.String("htu", endpoint),
slog.Bool("with_nonce", nonce != ""),
)
tokenBuilder := jwt.NewBuilder().
Claim("jti", uuid.NewString()).
Claim("htm", method).
Expand Down
16 changes: 16 additions & 0 deletions sdk/auth/token_adding_interceptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ func (i TokenAddingInterceptor) AddCredentials(
return status.Error(codes.Unauthenticated, err.Error())
Comment thread
elizabethhealy marked this conversation as resolved.
}

slog.DebugContext(
ctx, "preparing dpop for grpc request",
slog.String("grpc_method", method),
slog.String("dpop_htm", http.MethodPost),
)
dpopTok, err := i.GetDPoPToken(method, http.MethodPost, string(accessToken))
if err == nil {
newMetadata = append(newMetadata, "DPoP", dpopTok)
Expand Down Expand Up @@ -99,6 +104,12 @@ func (i TokenAddingInterceptor) AddCredentialsConnect() connect.UnaryInterceptor
req.Header().Set("Authorization", fmt.Sprintf("DPoP %s", accessToken))

// Add DPoP header if possible
slog.DebugContext(
ctx, "preparing dpop for connect request",
slog.String("procedure", req.Spec().Procedure),
slog.String("dpop_htm", http.MethodPost),
slog.Any("stream_type", req.Spec().StreamType),
)
dpopTok, err := i.GetDPoPToken(req.Spec().Procedure, http.MethodPost, string(accessToken))
if err == nil {
req.Header().Set("DPoP", dpopTok)
Expand Down Expand Up @@ -146,6 +157,11 @@ func (i TokenAddingInterceptor) GetDPoPToken(path, method, accessToken string) (
h.Write([]byte(accessToken))
ath := h.Sum(nil)

slog.Debug(
"building dpop token",
slog.String("htm", method),
slog.String("htu", path),
)
dpopTok, err := jwt.NewBuilder().
Claim("htu", path).
Claim("htm", method).
Expand Down
13 changes: 13 additions & 0 deletions service/cmd/keycloak_data.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,19 @@ realms:
sa_realm_roles:
- opentdf-admin
copies: 10
- client:
clientID: opentdf-dpop
enabled: true
name: opentdf-dpop
serviceAccountsEnabled: true
clientAuthenticatorType: client-secret
secret: secret
attributes:
dpop.bound.access.tokens: "true"
protocolMappers:
- *customAudMapper
sa_realm_roles:
- opentdf-admin
- client:
clientID: opentdf-sdk
enabled: true
Expand Down
Loading
Loading