nsq auth 鉴权(golang 实例过程)
2023-02-05 本文已影响0人
哆啦在这A梦在哪
官方地址:https://nsq.io/components/nsqd.html#auth
注意:官方只有 py 的 golang 的自己写吧 (上面这个地址最上面描述了其他的一些接口和命令,有其他需要的自己看看)
原理解释:
- 鉴权自己去第三方实现(需要实现它固定的几个接口即可)
- 用 http 接口的实现
- 鉴权逻辑自己定
- nsq 开启鉴权后,连接自动会请求你设置的地址对应的接口,从而达到鉴权的目的,所以需要实现上面说的接口
实现例子1
第一步.准备 golang 接口,编译运行
// 接受 nsq 请求过来的参数
type AuthReq struct {
RemoteIP string `json:"remote_ip" form:"remote_ip"`
TLS bool `json:"tls" form:"tls"`
Secret string `json:"secret" form:"secret"`
CommonName string `json:"common_name" form:"common_name"`
}
type Authorization struct {
Topic string `json:"topic"` // 内容需要是符合正则表达式的形势,别问为啥,官方定的
Channels []string `json:"channels"` // 内容需要是符合正则表达式的形势
Permissions []string `json:"permissions"` // 订阅或者发布 subscribe | publish
}
// 反馈给 nsq 的结构,参照官方的例子结构,https://nsq.io/components/nsqd.html#auth
type AuthResp struct {
TTL int `json:"ttl"` // 过期时间
Authorizations []Authorization `json:"authorizations"` // 允许(或者不允许)哪些主体和通道
Identity string `json:"identity"` // 身份
IdentityURL string `json:"identity_url"` // 身份地址,就是提供验证的接口地址,例如这里本地的就是就是 127.0.0.1:1325
Expires time.Time
}
func main() {
g := APIRoute()
g.Run(":1325")
}
func APIRoute() *gin.Engine {
r := gin.Default()
r.GET("/ping", ping)
r.GET("/auth", auth) // 鉴权的接口,nsq 使用了 auth-http-address 参数后,连接到 nsq 会自动请求这个接口
return r
}
func ping(c *gin.Context) { c.JSON(http.StatusOK, "pong") }
// 请求到该接口后,自定义权限逻辑
func auth(c *gin.Context) {
req := &AuthReq{}
err := c.Bind(req)
if err != nil {
log.Println(err)
return
}
// 这里做你自己的密码逻辑判断,这里只是做了一个空值的判断而已
if req.Secret == "" {
c.JSON(http.StatusForbidden, gin.H{
"message": "NOT_AUTH",
})
return
}
res := AuthResp{
TTL: 60,
Identity: "your name",
IdentityURL: "http://127.0.0.1:1325",
Authorizations: []Authorization{
{
Topic: ".*", // 这里设置全部可以,如果指定哪些 Topic 可以,在这里反馈即可,比如指定 “test”,那就该连接只能操作 test 的 topic
Channels: []string{".*"}, // 这个同上
Permissions: []string{
"subscribe",
"publish"},
},
},
}
log.Println("req:", res)
c.JSON(http.StatusOK, res)
}
第二步,准备 nsq(使用 docker )
注意这里的地址,172.17.0.2 可能改成你自己的 lookupd 网段地址,自己进入容器查
docker pull nsqio/nsq
docker run -d --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd
docker run -d --name nsqd -p 4150:4150 -p 4151:4151 nsqio/nsq /nsqd --broadcast-address=172.17.0.2 --lookupd-tcp-address=172.17.0.2:4160 -auth-http-address="192.168.31.35:1325"
docker run -d --name nsqadmin -p 4171:4171 nsqio/nsq /nsqadmin --lookupd-http-address=172.17.0.2:4161
第三步,另外启一个项目,代码加入鉴权连接
func main() {
if _, err := NewNsqCustomer("127.0.0.1:4150", "topic_test", channel_test", &nsqHandler{nsqHandlerID: "three"}); err != nil {
log.Println("err:", err)
return
}
}
func NewNsqCustomer(tcpNsqdAddrr, topic, channel string, handle interface{}) (*nsq.Consumer, error) {
conf := nsq.NewConfig()
conf.AuthSecret = "12345678"
conf.Hostname = "stb"
con, err := nsq.NewConsumer(topic, channel, conf)
if err != nil {
return nil, err
}
// // defer con.Stop()
hd, ok := handle.(nsq.Handler)
if !ok {
return nil, errors.New("handle type error")
}
con.AddHandler(hd)
err = con.ConnectToNSQD(tcpNsqdAddrr)
if err != nil {
return nil, err
}
return con, nil
}
四,编译运行就能看到上面 1325 那边接收到请求了
