Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support pass metadata via jsonrpc 2.0 #443

Closed
Lonenso opened this issue Apr 10, 2020 · 8 comments
Closed

support pass metadata via jsonrpc 2.0 #443

Lonenso opened this issue Apr 10, 2020 · 8 comments
Assignees

Comments

@Lonenso
Copy link
Contributor

Lonenso commented Apr 10, 2020

  1. 客户端使用ReqMetaDataKey, 请求额外带元数据
  2. jsonrpc里没有这个元数据

没想好怎么改, 从params中ReqMetaDataKey么?

  1. AuthFunc的ctx不是来自客户端的ctx #391
  2. https://github.com/smallnest/rpcx/blob/master/server/jsonrpc2.go#L77
@smallnest
Copy link
Owner

不明白的需求场景。你的需求是什么,有什么问题?

rpcx实现的标准rpcjspn2.0协议,除了认证外没有其他扩展

@Lonenso
Copy link
Contributor Author

Lonenso commented Apr 10, 2020

正常的情况我能这么做, 使用jsonrpc不行

// 服务端的AuthFunc
func auth(ctx context.Context, req *protocol.Message, token string) error {
	reqMeta := req.Metadata
	if reqMeta == nil{
		return errors.New("invalid token")
	}
	if reqMeta["hostname"] == ""{
		return errors.New("invalid token")
	}
	if reqMeta["deviceID"] == ""{
		return errors.New("invalid token")
	}

	if token == "bearer tGzv3JOkF0XG5Qx2TlKWIA" {
		return nil
	}

	return errors.New("invalid token")
}
// 客户端的ReqMetaDataKey
// 
xclient.Auth("bearer abcdefg1234567")
ctx := context.WithValue(context.Background(), share.ReqMetaDataKey, map[string]string{"hostname": "test", "device_id": "test"})

@smallnest
Copy link
Owner

你的jsonrpc是怎么写的?
jsonrpc在http header中加上 Authorization: bearer abcdefg1234567

@Lonenso
Copy link
Contributor Author

Lonenso commented Apr 10, 2020

抱歉, 我以为你特别熟悉只说了一些关键部分, 应该直接贴复现demo的
server.go

package main

import (
	"context"
	"errors"
	"flag"

	example "github.com/rpcx-ecosystem/rpcx-examples3"
	"github.com/smallnest/rpcx/protocol"
	"github.com/smallnest/rpcx/server"
)

var (
	addr = flag.String("addr", "localhost:8972", "server address")
)

func main() {
	flag.Parse()

	s := server.NewServer()
	s.RegisterName("Arith", new(example.Arith), "")
	s.AuthFunc = auth
	s.Serve("tcp", *addr)
}

func auth(ctx context.Context, req *protocol.Message, token string) error {
	reqMeta := req.Metadata
	if reqMeta["hostname"] != "test"{
		return errors.New("invalid hostname")
	}
	if reqMeta["deviceID"] != "test"{
		return errors.New("invalid deviceID")
	}

	if token == "bearer abcdefg1234567" {
		return nil
	}

	return errors.New("invalid token")
}

client.go

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"github.com/smallnest/rpcx/share"

	example "github.com/rpcx-ecosystem/rpcx-examples3"
	"github.com/smallnest/rpcx/client"
)

var (
	addr = flag.String("addr", "localhost:8972", "server address")
)

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, map[string]string{"hostname": "test", "deviceID": "test"})
	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)

}

client.sh

curl --header "X-JSONRPC-2.0: true" --header "Authorization: bearer abcdefg1234567" "http://localhost:8972/" -d '{"jsonrpc": "2.0", "method": "Arith.Mul", "params": {"A": 10, "B": 20}, "id": 3}'

client.sh
image

client.go
image

@smallnest
Copy link
Owner

目前没有办法通过jsonrpc 2.0传递额外的数据,正入你client.sh脚本中没有设置hostname 等额外信息一样。

但是我觉得rpcx可以扩展一下jsonrpc2.0, 让客户端传入meta信息,这个特性考虑加上

@smallnest smallnest self-assigned this Apr 10, 2020
@smallnest smallnest changed the title jsonrpc 缺乏 AuthFunc里需要的req.Metadata support pass metadata via jsonrpc 2.0 Apr 10, 2020
@smallnest
Copy link
Owner

smallnest commented Apr 10, 2020

拉取最新的代码试试。

client.sh

curl --header "X-JSONRPC-2.0: true" --header "Authorization: bearer abcdefg1234567"  --header "X-RPCX-Meta: hostname=test&deviceID=test" "http://localhost:8972/" -d '{"jsonrpc": "2.0", "method": "Arith.Mul", "params": {"A": 10, "B": 20}, "id": 3}'

@Lonenso
Copy link
Contributor Author

Lonenso commented Apr 10, 2020

嗯 可以了. 另外问一下 如果想帮忙更新文档 应该怎么操作

@smallnest
Copy link
Owner

提交文档的pr就可以。

英文文档: https://github.com/smallnest/rpcx-programming
中文文档:https://github.com/smallnest/go-rpc-programming-guide

@Lonenso Lonenso closed this as completed Apr 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants