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

时间:2021-07-06 11:48:25

标签: go streaming grpc middleware grpc-web

我将 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.

我该如何解决?

0 个答案:

没有答案