登录
首页 >  Golang >  Go问答

针对Go中的RPC服务器端和客户端,如何使用HTTP进行身份验证?

来源:stackoverflow

时间:2024-02-09 15:24:26 270浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《针对Go中的RPC服务器端和客户端,如何使用HTTP进行身份验证?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

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

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

但是页面上的示例似乎没有执行它。我在 StackOverflow 上搜索过它,发现 PassingauthenticationdetailswithaJSON-RPCcall 说

有两种方法可以实现您想要的:要么实现 HTTP 语言 io.ReadWriteCloser 并在示例中使用,要么实现 rpc.ClientCodec 执行 HTTP 基本身份验证并与 rpc.NewClientWithCodec 结合使用。

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


正确答案


在 grpc 中间件中使用转码和检查身份验证对于使用 gRPC gateway 的 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
}

今天关于《针对Go中的RPC服务器端和客户端,如何使用HTTP进行身份验证?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>