Skip to content

Commit 2c99173

Browse files
committed
Fix discovery handler to decode base64url tokens
The broker base64url-encodes tokens for binary safety, but the discovery handler was passing the encoded token directly to the OIDC validator. This caused "malformed jwt" errors since the validator expected a raw JWT. Add base64url decoding in discovery handler to match the policy handler behavior. Update tests to use properly encoded tokens.
1 parent 4849e06 commit 2c99173

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-5
lines changed

pkg/policyserver/discovery.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package policyserver
22

33
import (
4+
"encoding/base64"
45
"encoding/json"
56
"net/http"
67
"strings"
@@ -65,8 +66,15 @@ func (h *discoveryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
6566
return
6667
}
6768

69+
// Decode base64url-encoded token (broker encodes tokens for binary safety)
70+
decodedToken, err := base64.RawURLEncoding.DecodeString(token)
71+
if err != nil {
72+
h.writeError(w, http.StatusBadRequest, "Invalid token encoding")
73+
return
74+
}
75+
6876
// Validate token (we don't need the identity for discovery, just auth)
69-
if _, err := h.config.Validator.ValidateAndExtractIdentity(token); err != nil {
77+
if _, err := h.config.Validator.ValidateAndExtractIdentity(string(decodedToken)); err != nil {
7078
h.writeError(w, http.StatusUnauthorized, err.Error())
7179
return
7280
}

pkg/policyserver/discovery_test.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package policyserver_test
22

33
import (
4+
"encoding/base64"
45
"errors"
56
"net/http"
67
"net/http/httptest"
@@ -17,8 +18,10 @@ func TestDiscoveryHandler_Success(t *testing.T) {
1718
Hash: "abc123",
1819
})
1920

21+
// Token must be base64url-encoded (as broker encodes tokens)
22+
encodedToken := base64.RawURLEncoding.EncodeToString([]byte("test-token"))
2023
req := httptest.NewRequest(http.MethodGet, "/d/abc123", nil)
21-
req.Header.Set("Authorization", "Bearer test-token")
24+
req.Header.Set("Authorization", "Bearer "+encodedToken)
2225
w := httptest.NewRecorder()
2326

2427
handler(w, req)
@@ -73,8 +76,10 @@ func TestDiscoveryHandler_InvalidToken(t *testing.T) {
7376
Hash: "abc123",
7477
})
7578

79+
// Token must be base64url-encoded (as broker encodes tokens)
80+
encodedToken := base64.RawURLEncoding.EncodeToString([]byte("invalid-token"))
7681
req := httptest.NewRequest(http.MethodGet, "/d/abc123", nil)
77-
req.Header.Set("Authorization", "Bearer invalid-token")
82+
req.Header.Set("Authorization", "Bearer "+encodedToken)
7883
w := httptest.NewRecorder()
7984

8085
handler(w, req)
@@ -92,8 +97,10 @@ func TestDiscoveryHandler_MethodNotAllowed(t *testing.T) {
9297
Hash: "abc123",
9398
})
9499

100+
// Token must be base64url-encoded (as broker encodes tokens)
101+
encodedToken := base64.RawURLEncoding.EncodeToString([]byte("test-token"))
95102
req := httptest.NewRequest(http.MethodPost, "/d/abc123", nil)
96-
req.Header.Set("Authorization", "Bearer test-token")
103+
req.Header.Set("Authorization", "Bearer "+encodedToken)
97104
w := httptest.NewRecorder()
98105

99106
handler(w, req)
@@ -149,8 +156,10 @@ func TestDiscoveryHandler_EmptyPatterns(t *testing.T) {
149156
Hash: "abc123",
150157
})
151158

159+
// Token must be base64url-encoded (as broker encodes tokens)
160+
encodedToken := base64.RawURLEncoding.EncodeToString([]byte("test-token"))
152161
req := httptest.NewRequest(http.MethodGet, "/d/abc123", nil)
153-
req.Header.Set("Authorization", "Bearer test-token")
162+
req.Header.Set("Authorization", "Bearer "+encodedToken)
154163
w := httptest.NewRecorder()
155164

156165
handler(w, req)

0 commit comments

Comments
 (0)