2026-09-19 16:45:24 +02:00
|
|
|
package security
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/http/httptest"
|
|
|
|
|
"testing"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func requestWithHeader(name, value string) *http.Request {
|
|
|
|
|
r := httptest.NewRequest(http.MethodGet, "/", nil)
|
|
|
|
|
r.Header.Set(name, value)
|
|
|
|
|
return r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSSOTokenVerifierRequiresProxyHeader(t *testing.T) {
|
|
|
|
|
v := NewSSOTokenVerifier("X-SSO-Token", "", "")
|
|
|
|
|
if v.Authenticated(httptest.NewRequest(http.MethodGet, "/", nil)) {
|
|
|
|
|
t.Fatal("request without proxy header must stay anonymous")
|
|
|
|
|
}
|
|
|
|
|
if !v.Authenticated(requestWithHeader("X-SSO-Token", "oauth2-access-token")) {
|
|
|
|
|
t.Fatal("request with proxy header must be authenticated")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSSOTokenVerifierChecksExpectedToken(t *testing.T) {
|
|
|
|
|
v := NewSSOTokenVerifier("X-SSO-Token", "secret", "")
|
|
|
|
|
if v.Authenticated(requestWithHeader("X-SSO-Token", "other")) {
|
|
|
|
|
t.Fatal("mismatching token must stay anonymous")
|
|
|
|
|
}
|
|
|
|
|
if !v.Authenticated(requestWithHeader("X-SSO-Token", "Bearer secret")) {
|
|
|
|
|
t.Fatal("bearer-prefixed token must be authenticated")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestSSOTokenVerifierCookieFallback(t *testing.T) {
|
2026-10-03 04:41:31 +02:00
|
|
|
v := NewSSOTokenVerifier("X-SSO-Token", "", "go_tell_session")
|
2026-09-19 16:45:24 +02:00
|
|
|
r := httptest.NewRequest(http.MethodGet, "/", nil)
|
2026-10-03 04:41:31 +02:00
|
|
|
r.AddCookie(&http.Cookie{Name: "go_tell_session", Value: "cookie-token"})
|
2026-09-19 16:45:24 +02:00
|
|
|
if !v.Authenticated(r) {
|
|
|
|
|
t.Fatal("cookie token must be authenticated")
|
|
|
|
|
}
|
|
|
|
|
}
|