fix(grpc): return 401 for unauthenticated v1 gateway errors (#11786)

Fixes #11730

The v1 gRPC middleware can return native gRPC status errors such as
`codes.Unauthenticated` when the auth header is missing.

Those errors were being passed through the generic gRPC error converter,
which only handled ZITADEL errors and downgraded raw gRPC statuses to
`codes.Unknown`.

Through grpc-gateway that caused `/auth/v1/users/me` to return HTTP 500
instead of HTTP 401.

So this change preserves native gRPC status errors in
`ZITADELToGRPCError`, keeps `ExtractZITADELError` aligned with those
transport codes for activity reporting, and adds regression coverage for
the converter, middleware, and gateway HTTP behavior.

---------

Co-authored-by: Gayathri Vijayan <[email protected]>
This commit is contained in:
Oluwatobi Mustapha
2026-04-10 12:22:40 +00:00
committed by GitHub
co-authored by Gayathri Vijayan
parent 035ac4b9a2
commit fbd43ced6e
4 changed files with 80 additions and 0 deletions
@@ -43,6 +43,18 @@ func Test_toGRPCError(t *testing.T) {
want: nil,
wantCode: codes.FailedPrecondition,
},
{
name: "grpc status error",
args: args{
ctx: context.Background(),
req: &mockReq{},
handler: func(context.Context, any) (any, error) {
return nil, status.Error(codes.Unauthenticated, "auth header missing")
},
},
want: nil,
wantCode: codes.Unauthenticated,
},
{
name: "panic with string",
args: args{