fix(console): testMode auth — X-Auth-Token accepted as sub v0.8.1
This commit is contained in:
+27
-12
@@ -10,12 +10,12 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"go/parser"
|
||||||
|
"go/token"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"go/parser"
|
|
||||||
"go/token"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"regexp"
|
"regexp"
|
||||||
@@ -174,8 +174,11 @@ func main() {
|
|||||||
|
|
||||||
if s.testMode {
|
if s.testMode {
|
||||||
// TEST_MODE: deck API не вызывается.
|
// TEST_MODE: deck API не вызывается.
|
||||||
// X-Test-Sub задаёт произвольный sub → разные namespace-ы для тестирования.
|
// X-Test-Sub или X-Auth-Token задают sub → разные namespace-ы для тестирования.
|
||||||
sub := strings.TrimSpace(r.Header.Get("X-Test-Sub"))
|
sub := strings.TrimSpace(r.Header.Get("X-Test-Sub"))
|
||||||
|
if sub == "" {
|
||||||
|
sub = strings.TrimSpace(r.Header.Get("X-Auth-Token"))
|
||||||
|
}
|
||||||
if sub == "" {
|
if sub == "" {
|
||||||
writeJSONError(w, http.StatusUnauthorized, "test mode: X-Test-Sub required")
|
writeJSONError(w, http.StatusUnauthorized, "test mode: X-Test-Sub required")
|
||||||
return
|
return
|
||||||
@@ -1450,14 +1453,24 @@ func (s *server) handleAuth(w http.ResponseWriter, r *http.Request) {
|
|||||||
if _, ok := deckAPIs[env]; !ok {
|
if _, ok := deckAPIs[env]; !ok {
|
||||||
env = "test"
|
env = "test"
|
||||||
}
|
}
|
||||||
if err := s.validateDeckToken(body.Token, env); err != nil {
|
var ns string
|
||||||
writeJSONError(w, http.StatusUnauthorized, "invalid token")
|
if s.testMode {
|
||||||
return
|
// testMode: токен — это sub (email), Deck не вызывается
|
||||||
}
|
ns = func() string {
|
||||||
ns, err := namespaceFromJWT(body.Token)
|
h32 := sha256.Sum256([]byte(body.Token))
|
||||||
if err != nil {
|
return "fission-" + hex.EncodeToString(h32[:8])
|
||||||
log.Printf("handleAuth: namespaceFromJWT: %v", err)
|
}()
|
||||||
ns = s.ns
|
} else {
|
||||||
|
if err := s.validateDeckToken(body.Token, env); err != nil {
|
||||||
|
writeJSONError(w, http.StatusUnauthorized, "invalid token")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
ns, err = namespaceFromJWT(body.Token)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("handleAuth: namespaceFromJWT: %v", err)
|
||||||
|
ns = s.ns
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second)
|
ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
@@ -1966,7 +1979,9 @@ func (s *server) handleAIAsk(w http.ResponseWriter, r *http.Request) {
|
|||||||
Content string `json:"content"`
|
Content string `json:"content"`
|
||||||
} `json:"message"`
|
} `json:"message"`
|
||||||
} `json:"choices"`
|
} `json:"choices"`
|
||||||
Error *struct{ Message string `json:"message"` } `json:"error"`
|
Error *struct {
|
||||||
|
Message string `json:"message"`
|
||||||
|
} `json:"error"`
|
||||||
}
|
}
|
||||||
if err := json.NewDecoder(io.LimitReader(resp.Body, 64*1024)).Decode(&llmResp); err != nil {
|
if err := json.NewDecoder(io.LimitReader(resp.Body, 64*1024)).Decode(&llmResp); err != nil {
|
||||||
writeJSONError(w, http.StatusBadGateway, "parse error: "+err.Error())
|
writeJSONError(w, http.StatusBadGateway, "parse error: "+err.Error())
|
||||||
|
|||||||
Reference in New Issue
Block a user