如何解决使用带有 grpc-web 和 authboss 的服务器流,调用保持挂起状态并且不起作用
我将 authboss 与 grpc-web server 一起使用。
今天我不得不测试 gRPC 服务器流,经过数小时的尝试后,我意识到是 authboss 导致了下面描述的奇怪问题:
- main.go:
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.)
我该如何解决?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。