返回 DeepSeek-Reasonix
oauth_helpers.go
根目录 / internal / plugin / oauth_helpers.go
1 package plugin
2
3 import (
4 "fmt"
5 "net/url"
6 "strings"
7 )
8
9 func oauthResourceAndIssuer(metadata protectedResourceMetadata, endpoint *url.URL) (string, *url.URL, error) {
10 resource := strings.TrimSpace(metadata.Resource)
11 if resource == "" {
12 resource = endpoint.String()
13 }
14 if !sameCanonicalResource(resource, endpoint.String()) {
15 return "", nil, fmt.Errorf("MCP OAuth: protected resource %q does not match configured endpoint %q", resource, endpoint.String())
16 }
17 if len(metadata.AuthorizationServers) == 0 {
18 return "", nil, fmt.Errorf("MCP OAuth: protected resource metadata has no authorization_servers")
19 }
20 issuer, err := parseSecureOAuthURL(metadata.AuthorizationServers[0], true)
21 if err != nil {
22 return "", nil, fmt.Errorf("MCP OAuth authorization server: %w", err)
23 }
24 return resource, issuer, nil
25 }
26
27 func skipAuthSeparators(raw string, i int) int {
28 for i < len(raw) && (raw[i] == ' ' || raw[i] == '\t' || raw[i] == ',') {
29 i++
30 }
31 return i
32 }
33
34 func skipAuthWhitespace(raw string, i int) int {
35 for i < len(raw) && (raw[i] == ' ' || raw[i] == '\t') {
36 i++
37 }
38 return i
39 }
40
41 func scanAuthToken(raw string, i int) int {
42 for i < len(raw) && (raw[i] == '-' || raw[i] == '_' || raw[i] >= '0' && raw[i] <= '9' || raw[i] >= 'a' && raw[i] <= 'z' || raw[i] >= 'A' && raw[i] <= 'Z') {
43 i++
44 }
45 return i
46 }
47
48 func parseAuthParamValue(raw string, i int) (string, int) {
49 var value strings.Builder
50 if i < len(raw) && raw[i] == '"' {
51 for i++; i < len(raw) && raw[i] != '"'; i++ {
52 if raw[i] == '\\' && i+1 < len(raw) {
53 i++
54 }
55 value.WriteByte(raw[i])
56 }
57 if i < len(raw) {
58 i++
59 }
60 return value.String(), i
61 }
62 for i < len(raw) && raw[i] != ',' && raw[i] != ' ' && raw[i] != '\t' {
63 value.WriteByte(raw[i])
64 i++
65 }
66 return value.String(), i
67 }
68
68 lines GO