Go语言 GRPC:如何将值从拦截器传递到服务函数

sd2nnvve  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(202)

我有一个一元拦截器,它验证jwt令牌并解析id和role。现在我需要将这些传递给服务函数。
拦截者

func Unary() grpc.UnaryServerInterceptor {
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
    log.Printf("--> unary interceptor: %s ", info.FullMethod)

    if info.FullMethod == "/AntmanServer.AntmanUserRoutes/LoginUser" {
        return handler(ctx, req)
    }

    userId, _, err := authorize(ctx)
    if err != nil {
        return fmt.Sprintf("Error : %s", err), err
    }

    //newCtx := metadata.AppendToOutgoingContext(ctx,"id-key", string(userId), "role-key", roles)

    //header := metadata.Pairs("id-key", string(userId), "role-key", roles)
    //grpc.SendHeader(ctx, header)
    newCtx := context.WithValue(ctx, "id-key", string(userId))
    return handler(newCtx, req)
}

}
我试过了

newCtx := metadata.AppendToOutgoingContext(ctx,"id-key", string(userId), "role-key", roles)

而且这

newCtx := context.WithValue(ctx, "id-key", string(userId))

但是没有一个工作,如何做到这一点。提前感谢。

ippsafx7

ippsafx71#

好了,问题解决了,谢谢大家的评论。我把这个解决方案贴出来给以后来这里的人。

//interceptor
    md, ok := metadata.FromIncomingContext(ctx)
    if ok {
        md.Append("id-key", string(id))
        md.Append("role-key", role)
    }
    newCtx := metadata.NewIncomingContext(ctx, md)
    return handler(newCtx, req)

   //Rpc function
   md, ok := metadata.FromIncomingContext(ctx)
   Userid := md["id-key"]
   role := md["role-key"]
hs1ihplo

hs1ihplo2#

写入客户端:

md := metadata.Pairs("key", "value")
ctx := metadata.NewOutgoingContext(context.Background(), md)

并读入服务器:

md, ok := metadata.FromIncomingContext(ctx)
value := md["key"]

相关问题