为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
翻翻过去那场雪 2023-02-28 21:15:50
我是 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方法)吗?
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

在 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

}


查看完整回答
反对 回复 2023-02-28
  • 1 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号