fix(server): include auth challenge on typed 401 (#26455)

This commit is contained in:
Kit Langton
2026-05-09 00:15:20 -04:00
committed by GitHub
parent 82359c4b1b
commit 8cbc43fbb0
2 changed files with 9 additions and 2 deletions

View File

@@ -1,6 +1,6 @@
import { ServerAuth } from "@/server/auth"
import { Effect, Encoding, Layer, Redacted } from "effect"
import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
import { HttpEffect, HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
import { HttpApiError, HttpApiMiddleware } from "effect/unstable/httpapi"
import { hasPtyConnectTicketURL } from "@/server/shared/pty-ticket"
import { isPublicUIPath } from "@/server/shared/public-ui"
@@ -33,7 +33,12 @@ function validateCredential<A, E, R>(
) {
return Effect.gen(function* () {
if (!ServerAuth.required(config)) return yield* effect
if (!ServerAuth.authorized(credential, config)) return yield* new HttpApiError.Unauthorized({})
if (!ServerAuth.authorized(credential, config)) {
yield* HttpEffect.appendPreResponseHandler((_request, response) =>
Effect.succeed(HttpServerResponse.setHeader(response, "www-authenticate", WWW_AUTHENTICATE)),
)
return yield* new HttpApiError.Unauthorized({})
}
return yield* effect
})
}

View File

@@ -72,7 +72,9 @@ describe("HttpApi authorization middleware", () => {
)
expect(missing.status).toBe(401)
expect(missing.headers["www-authenticate"] ?? "").toContain("Basic")
expect(badPassword.status).toBe(401)
expect(badPassword.headers["www-authenticate"] ?? "").toContain("Basic")
expect(good.status).toBe(200)
}),
)