【发布时间】:2019-06-23 12:59:15
【问题描述】:
我从事 go grpc 服务并实施授权。从字面上看,必须根据 JWT 声明允许或禁止访问 gprc 方法。
我在 grpc.UnaryServerInterceptor 级别进行 JWT 解析 - 提取声明并使用值填充上下文,如果没有 jwt 或它不正确,则未经身份验证。
func (s *Server) GetSomething(ctx context.Context, req *GetSomething Request) (*GetSomething Response, error) {
if hasAccessTo(ctx, req.ID) {
//some work here
}
}
func hasAccessTo(ctx context.Context, string id) {
value := ctx.Value(ctxKey).(MyStruct)
//some work here
}
所以我想知道是否有一些常见的授权/身份验证做法来避免每个 grpc 服务器方法中的样板代码?
【问题讨论】:
-
也许go-kit 的架构可以帮助您构建服务。
-
我见过类似的东西,样板被放在一个库中,为处理函数提供一个包装函数。然后是一种策略系统,每个端点都定义了所需的权限,这些权限被映射到一个角色(基于来自 JWT 的身份声明)。
-
如果您要保护每个呼叫,那么可以使用
UnaryInterceptor。如果您需要一个可行的示例,我可以提供一个示例 -
@Varcorb 如果你能发布它会很好
-
这里有一个 oauth 示例可能会有所帮助:github.com/grpc/grpc-go/tree/master/examples/features/…
标签: authentication go authorization jwt grpc