美文网首页
nsq auth 鉴权(golang 实例过程)

nsq auth 鉴权(golang 实例过程)

作者: 哆啦在这A梦在哪 | 来源:发表于2023-02-05 18:02 被阅读0次

官方地址: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

相关文章

  • nsq auth 鉴权(golang 实例过程)

    官方地址:https://nsq.io/components/nsqd.html#auth[https://nsq...

  • 8-SIM数据交互之-88(AUTH)

    88-AUTH 鉴权是使SIM卡能够上网的关键步骤,运营商需要验证该用户的合法性,才允许其上网。 鉴权过程 我们以...

  • 前端鉴权和缓存相关收藏

    Auth2鉴权 JWT cookie-session 缓存相关

  • 微服务鉴权

    我们在讲鉴权之前需要注意 先介绍一下 常见的认证方法 http basic auth cookie auth O...

  • Spring Security实践

    Spring Security提供Basic Auth的鉴权方式,在一些涉及敏感信息的场景,例如应用监控等,可引入...

  • golang nsq

    1.安装 https://nsq.io/deployment/installing.html 2.快速入门 在一个...

  • golang jwt鉴权分析

    技术栈 gin+jwt 鉴权流程:调用token生成方法GenerateToken生成token, 请求api...

  • 基于AOP鉴权

    基于AOP的简单鉴权: 注解Auth: 返回类型RoleEnum数组;注解可以在类上页可以在具体方法上,优先方法注...

  • 谈谈鉴权与授权

    目录 鉴权场景实现 授权场景实现 鉴权 鉴权(authentication): 你是谁 场景 实现 关于鉴权的示例...

  • golang使用Nsq

    为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯。一开始想到用zeromq,但在...

网友评论

      本文标题:nsq auth 鉴权(golang 实例过程)

      本文链接:https://www.haomeiwen.com/subject/hgiihdtx.html