猿问

Go中如何通过HTTP对RPC服务器和客户端进行认证?

我是 GO 的新手,我正在关注https://parthdesai.me/articles/2016/05/20/go-rpc-server/来构建一个简单的 RPC 服务器和客户端。在这篇文章中,它说

这种方法 (HTTP) 的好处是,您可以在允许 RPC 之前使用 HTTP 支持的任何身份验证方法轻松地执行客户端身份验证。

但是页面上的示例似乎没有执行它。我在 StackOverflow 上搜索过它,发现使用 JSON-RPC 调用传递身份验证详细信息

有两种方法可以完成您想要的事情:要么实现一个 HTTP-speakingio.ReadWriteCloser并像您的示例中那样使用,要么实现一个rpc.ClientCodec执行 HTTP 基本身份验证并与rpc.NewClientWithCodec.

但是,我仍然不知道该怎么做。我可以有一些示例代码(可能是Basic Authentication方法)吗?


翻翻过去那场雪
浏览 245回答 1
1回答

万千封印

在 gRPC 中间件中使用转码和检查身份验证对于使用gRPC 网关的gRPC 上的 http 服务器更好。https://cloud.google.com/endpoints/docs/grpc/transcoding要在标头中获得授权,请使用 gRPC 中间件并使用 gRPC MD 从上下文中获取。srv := grpc.NewServer(exampleJwtMiddleware())func exampleJwtMiddleware() grpc.UnaryServerInterceptor {    return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {        token, err := extractHeaderFromContext(ctx, "Authorization")        // do sometings...        return handler(ctx, req)    }}func extractHeaderFromContext(ctx context.Context, header string) ([]string, error) {    md, ok := metadata.FromIncomingContext(ctx)    if !ok {        return nil, ERROR_NO_HEADER_IN_REQUEST    }    foundedHeaders, ok := md[header]    if !ok {        return nil, ERROR_NO_HEADER_IN_REQUEST    }    return foundedHeaders, nil}
随时随地看视频慕课网APP

相关分类

Go
我要回答