我们已经实施了 StreamingHttpServiceFilter
它对每个请求执行身份验证。
在身份验证失败时,我们使用以下代码返回401 unauthorized error:
private StreamingHttpResponse createUnauthorizedResponse(final StreamingHttpResponseFactory responseFactory) {
return responseFactory.unauthorized();
}
当过滤器返回一个错误时,在客户端我们得到以下消息
grpcstatus{code=internal,cause=null,description='http status code:401 unauthorized invalid content type:null headers:nettyh2headerstohttpheaders[transfer encoding:]'}
如您所见,grpcstatus code=INTERNAL
,这意味着客户端需要解析 description
,并找出错误代码。
在准备来自筛选器的响应时,是否可以添加任何其他元数据,以便可以删除代码 UNAUTHENTICATED
或者是否有任何客户端util可以读取描述并转换为http状态码?
1条答案
按热度按时间vqlkdk9b1#
grpc协议通常不太关注http响应状态码
200 OK
. 其他状态代码将Map到INTERNAL
grpc代码。相反,它依赖于grpc-status
以及grpc-message
作为http/2响应消息的尾部(或者在没有有效负载主体的情况下作为头)出现。参见grpc over http2 doc中的回复部分。当您处于http级别并编写
StreamingHttpServiceFilter
,您负责根据grpc协议生成响应。最小的React是Trailers-Only
并包含HTTP-Status Content-Type Status [Status-Message] *Custom-Metadata
.对于所描述的用例,手动生成适当的响应应该很容易。
另一种方法是
GrpcStatusException
从grpc级别:从服务端点或从grpc筛选器。然后servicetalk将把这个异常Map到一个适当的http/2响应,其中包含所有必需的头字段。但是,在您的情况下,从中传输身份验证信息可能会有额外的复杂性
StreamingHttpServiceFilter
液位至grpc过滤器AsyncContext
. 可能不值得。