nsq auth 鉴权(golang 实例过程)

官方地址:https://nsq.io/components/nsqd.html#auth
注意:官方只有 py 的 golang 的自己写吧 (上面这个地址最上面描述了其他的一些接口和命令,有其他需要的自己看看)

原理解释:

  1. 鉴权自己去第三方实现(需要实现它固定的几个接口即可)
  2. 用 http 接口的实现
  3. 鉴权逻辑自己定
  4. 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 那边接收到请求了

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 概述 NSQ 是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一...
    楚江云阅读 6,862评论 0 10
  • 1. 前言:为什么要使用 MQ 消息队列 随着互联网技术在各行各业的应用高速普及与发展,各层应用之间调用关系越来越...
    热爱coding的稻草阅读 698评论 0 0
  • 1. 开始 开篇罗嗦了一大堆,终于开始进入正题了。golang的优秀源码很多,比如杀手级应用docker,goog...
    kekemuyu阅读 3,050评论 1 4
  • nsq 最初是由 bitly 公司开源出来的一款简单易用的分布式消息中间件,它可用于大规模系统中的实时消息服务,并...
    热爱coding的稻草阅读 1,162评论 1 3
  • Nsq是什么 特征: 分布式的 NSQ提倡没有单点故障的分布式和分散拓扑,支持容错和高可用性,并提供可靠的消息传递...
    第八共同体阅读 2,597评论 0 1

友情链接更多精彩内容