mcp: add optional issuer validator for pre-registered client validation (SEP-2352) (#946)

Fixes #978
This commit is contained in:
Guglielmo Colombo 2026-05-29 14:46:34 +02:00 • committed by GitHub
commit dfb45f1e11
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 190 additions and 5 deletions

13
internal/authutil/util.go Normal file
View file

@ -0,0 +1,13 @@
// Copyright 2026 The Go MCP SDK Authors. All rights reserved.
// Use of this source code is governed by the license
// that can be found in the LICENSE file.
package authutil
import "strings"
// IssuersEqual reports whether two OAuth 2.0 authorization server issuer
// identifiers refer to the same server comparing them without the final trailing slash.
func IssuersEqual(a, b string) bool {
return strings.TrimSuffix(a, "/") == strings.TrimSuffix(b, "/")
}

View file

@ -0,0 +1,29 @@
// Copyright 2026 The Go MCP SDK Authors. All rights reserved.
// Use of this source code is governed by the license
// that can be found in the LICENSE file.
package authutil
import "testing"
func TestIssuersEqual(t *testing.T) {
tests := []struct {
a, b string
want bool
}{
{"https://issuer.example.com", "https://issuer.example.com", true},
{"https://issuer.example.com/", "https://issuer.example.com", true},
{"https://issuer.example.com", "https://issuer.example.com/", true},
{"https://issuer.example.com/", "https://issuer.example.com/", true},
{"https://issuer.example.com/tenant", "https://issuer.example.com/tenant", true},
{"https://issuer.example.com/tenant/", "https://issuer.example.com/tenant", true},
{"https://issuer.example.com", "https://other.example.com", false},
{"https://issuer.example.com/a", "https://issuer.example.com/b", false},
{"", "", true},
}
for _, tt := range tests {
if got := IssuersEqual(tt.a, tt.b); got != tt.want {
t.Errorf("IssuersEqual(%q, %q) = %v, want %v", tt.a, tt.b, got, tt.want)
}
}
}