我将 authboss 与 grpc-web server 一起使用。
今天我不得不测试 gRPC 服务器流,经过数小时的尝试后,我意识到是 authboss 导致了下面描述的奇怪问题:
package main
import (
"github.com/volatiletech/authboss/v3/remember"
"net/http"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
_ "github.com/volatiletech/authboss/v3/auth"
_ "github.com/volatiletech/authboss/v3/logout"
)
func main() {
// ... get config and db
authb := InitAuthboss(config, db)
chiRouter := chi.NewRouter()
grpcwebServer := grpcweb.WrapServer(grpc.NewServer())
chiRouter.Use(authb.LoadClientStateMiddleware, remember.Middleware(authb))
chiRouter.Group(func(r chi.Router) {
r.Use(authboss.Middleware2(authb, authboss.RequireNone, authboss.RespondUnauthorized))
r.Post("/grpc", grpcWebServer.ServeHTTP)
})
chiRouter.Group(func(r chi.Router) {
r.Mount(config.AuthURL, http.StripPrefix(config.AuthURL, authb.Config.Core.Router))
})
// ... startServer
}
func InitAuthboss(config *Config, dbPG *DB) *authboss.Authboss {
var (
ab = authboss.New()
database = newDBStorer(config, dbPG)
cookieStoreKey, _ = base64.StdEncoding.DecodeString(config.CookieStoreKey)
sessionStoreKey, _ = base64.StdEncoding.DecodeString(config.SessionStoreKey)
cookieStore = abclientstate.NewCookieStorer(cookieStoreKey, nil)
sessionStore = abclientstate.NewSessionStorer(config.ProjectName, sessionStoreKey, nil)
cstore = sessionStore.Store.(*sessions.CookieStore)
)
cookieStore.HTTPOnly = true
cookieStore.Secure = config.IsProduction
cookieStore.Domain = config.CookiesDomain
cookieStore.SameSite = http.SameSiteStrictMode
cookieStore.MaxAge = int(config.CookiesRemembermeMaxageTime.Seconds())
cstore.Options.HttpOnly = true
cstore.Options.Secure = config.IsProduction
cstore.Options.Domain = config.CookiesDomain
cstore.Options.SameSite = http.SameSiteStrictMode
cstore.Options.MaxAge = int(config.CookiesSessionMaxageTime.Seconds())
ab.Config.Paths.RootURL = config.SiteURL
ab.Config.Storage.Server = database
ab.Config.Storage.SessionState = sessionStore
ab.Config.Storage.CookieState = cookieStore
ab.Config.Modules.LogoutMethod = "GET"
ab.Config.Core.ViewRenderer = defaults.JSONRenderer{}
defaults.SetCore(&ab.Config, true, false)
ab.Config.Core.Redirector = &defaults.Redirector{Renderer: &defaults.JSONRenderer{}, CorceRedirectTo200: true}
err := ab.Init()
if err != nil {
panic(err)
}
return ab
}
我正在尝试使用 protobuf-ts,但在连接关闭之前我没有从服务器收到消息。
我像这样使用 Svelte 3:
<script lang="ts">
import { onDestroy, onMount } from "svelte";
const transport = new GrpcWebFetchTransport({
baseUrl: "/",
format: "binary",
});
const service = new EventServiceClient(transport);
const abortController = new AbortController();
onMount(async () => {
const call = service.flow({}, { abort: abortController.signal });
for await (const response of call.responses) {
console.log("got another response!", response);
}
});
onDestroy(() => abortController.abort());
</script>
呼叫处于挂起状态约 2.2 分钟。之后,我将所有消息记录在控制台中。
如果我改变这一行:
chiRouter.Use(authb.LoadClientStateMiddleware, remember.Middleware(authb))
到:
chiRouter.Use(remember.Middleware(authb))
(删除 authb.LoadClientStateMiddleware
)有效!
(这是该中间件的代码:https://github.com/volatiletech/authboss/blob/master/client_state.go#L123.)
我该如何解决?