授权

例程auth

为了保证安全,只有已授权的客户端可以请求服务。

客户端必须设置一个授权token,可以通过OAuth/OAuth2或者已授权的token获取。

服务器接收到请求,首先检查授权token。服务器拒绝包含非法token的请求。

func main() {
    flag.Parse()
    s := server.NewServer()
    s.RegisterName("Arith", new(example.Arith), "")
    s.AuthFunc = auth
    s.Serve("reuseport", *addr)
}

func auth(ctx context.Context, req *protocol.Message, token string) error {
    if token == "bearer tGzv3JOkF0XG5Qx2TlKWIA" {
    return nil
    }
    return errors.New("invalid token")
}

服务器必须定义一个AuthFunc来检查授权token。在上面的例子中,只有包含token bearer tGzv3JOKF0XG5Qx2TlKWIA的请求是合法的。

客户端必须设置token:

func main() {
    flag.Parse()

    d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")

    option := client.DefaultOption
    option.ReadTimeout = 10 * time.Second

    xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, option)
    defer xclient.Close()


    //xclient.Auth("bearer tGzv3JOkF0XG5Qx2TlKWIA")

    xclient.Auth("bearer abcdefg1234567")

    args := &example.Args{
            A: 10,
            B: 20,
    }

    reply := &example.Reply{}
    ctx := context.WithValue(context.Background(), share.ReqMetaDataKey, make(map[string]string))
    err := xclient.Call(ctx, "Mul", args, reply)    
    if err != nil {
        log.Fatalf("failed to call: %v", err)
    }

    log.Printf("%d * %d = %d", args.A, args.B, reply.C)
}

注意:你必须把share.reqMetaDataKey设置为一个map[string]string否则会报错。

results matching ""

    No results matching ""