微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用带有 grpc-web 和 authboss 的服务器流,调用保持挂起状态并且不起作用

如何解决使用带有 grpc-web 和 authboss 的服务器流,调用保持挂起状态并且不起作用

我将 authbossgrpc-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 分钟。之后,我将所有消息记录在控制台中。

image

如果我改变这一行:

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 举报,一经查实,本站将立刻删除。