diff --git a/.changeset/twelve-wombats-chew.md b/.changeset/twelve-wombats-chew.md new file mode 100644 index 000000000..4d0e936bf --- /dev/null +++ b/.changeset/twelve-wombats-chew.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +fix(converters): Ensure x-forwarded-proto is set to http when running locally diff --git a/packages/open-next/src/overrides/converters/edge.ts b/packages/open-next/src/overrides/converters/edge.ts index 7cd6d8aed..792270501 100644 --- a/packages/open-next/src/overrides/converters/edge.ts +++ b/packages/open-next/src/overrides/converters/edge.ts @@ -36,6 +36,12 @@ const converter: Converter = { ? (cookieParser.parse(cookieHeader) as Record) : {}; + // This is to make libraries (e.g. next-auth) that rely on this header to work out of the box in `opennextjs-cloudflare preview`. + // See https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/lib/utils/env.ts#L95-L96 + if (url.hostname === "localhost") { + headers["x-forwarded-proto"] = url.protocol.slice(0, -1); // Remove the trailing ':' + } + return { type: "core", method, diff --git a/packages/open-next/src/overrides/wrappers/express-dev.ts b/packages/open-next/src/overrides/wrappers/express-dev.ts index ae2fcd6b4..14bc9fc91 100644 --- a/packages/open-next/src/overrides/wrappers/express-dev.ts +++ b/packages/open-next/src/overrides/wrappers/express-dev.ts @@ -34,6 +34,12 @@ const wrapper: WrapperHandler = async (handler, converter) => { }); app.all("*paths", async (req, res) => { + if (req.protocol === "http" && req.hostname === "localhost") { + // This is used internally by Next.js during redirects in server actions. We need to set it to the origin of the request. + process.env.__NEXT_PRIVATE_ORIGIN = `${req.protocol}://${req.hostname}`; + // This is to make `next-auth` and other libraries that rely on this header to work locally out of the box. + req.headers["x-forwarded-proto"] = req.protocol; + } const internalEvent = await converter.convertFrom(req); const streamCreator: StreamCreator = { writeHeaders: (prelude) => {