Monibuca / engine

Monibuca 核心引擎,包含流媒体核心转发逻辑,需要配合功能插件一起组合运行
MIT License
937 stars 199 forks source link

新版本鉴权接口的疑问 #64

Closed sapceman closed 1 year ago

sapceman commented 1 year ago

参照官方文档,我的全局鉴权插件代码如下: `package auth import ( "errors" . "m7s.live/engine/v4" "m7s.live/engine/v4/util" )

type AuthConfig struct { Publish bool Salt string }

type AuthPublisher struct { Publisher Auth *AuthConfig }

var plugin = InstallPlugin(&AuthConfig{ Publish: true, Salt: "1EC96355", })

func init() { plugin.Warn("Publisher Auth init") OnAuthPub = func(p util.Promise[IPublisher]) error { var puber = p.Value switch v := puber.(type) { case AuthPublisher: // do auth if v.Auth.Publish { args := v.Args sign := args.Get("sign") auth := v.Auth.verifyAuth(v.Stream.Path, sign) if !auth { return errors.New("error! Unauthorized") } } return nil } return nil } }

func (a AuthConfig) OnEvent(event any) { switch event.(type) { case FirstConfig: plugin.Info("Auth start with", zap.String("Salt", a.Salt)) } } func (a AuthConfig) verifyAuth(path string, sign string) bool { return true }`

但我发现代码运行不到// do auth部分,OnAuthPub返回的应该是nil,推流依然失败,请问大神,代码问题在哪?

langhuihui commented 1 year ago

你可以调试一下看看是否进入OnAuthPub,如果没有进入,看一下engine中调用OnAuthPub的地方,进一步看为啥没有进入

sapceman commented 1 year ago

调试进入OnAuthPub了,没case到 *AuthPublisher:,返回nil,obs推流rtmp失败。engine中调用OnAuthPub的地方没看。

langhuihui commented 1 year ago

不要case *AuthPublisher。 因为你用rtmp推流,所以你接受到的是一个rtmp的publisher,用IPublisher

langhuihui commented 1 year ago

你用全局鉴权,就不需要自定义Publisher

sapceman commented 1 year ago

感谢大神指导,改用IPublisher后能case到了,return nil,obs推流rtmp还是失败。

langhuihui commented 1 year ago

光return nil不行,return nil的话就依赖Promise的结果,需要对Promise调用Resolve来完成鉴权