I am running a Next.js app and was able to get the user
object from useUser()
but had trouble getting page protection and logouts. After switching to using withMiddlewareAuthRequired()
to middleware.ts
, logins and logouts work fine, but now useUser()
returns undefined
for:
user
objecterror.message
error.cause
I also notice that after I successfully login, with either Google or Apple, I get an 502 (Bad gateway)
error in Chrome’s console logs.
As an example, here is how I am console logging user
and error
in my main app’s page.tsx
:
/* src/app/page.tsx */
'use client'
// Externals
import { useLayoutEffect } from 'react'
import { useUser } from '@auth0/nextjs-auth0/client'
// Locals
import MainPortal from '@/sections/main-portal'
export default function Home() {
const { user, error, isLoading } = useUser()
useLayoutEffect(() => {
if (!isLoading) {
console.log(
`[${new Date().toLocaleString()} --filepath="src/app/page.tsx" --function="useLayoutEffect()"]: user: `,
user
)
console.log(
`[${new Date().toLocaleString()} --filepath="src/app/page.tsx" --function="useLayoutEffect()"]: error: `,
error
)
console.log(
`[${new Date().toLocaleString()} --filepath="src/app/page.tsx" --function="useLayoutEffect()"]: error.name: `,
error?.name
)
console.log(
`[${new Date().toLocaleString()} --filepath="src/app/page.tsx" --function="useLayoutEffect()"]: error.message: `,
error?.message
)
console.log(
`[${new Date().toLocaleString()} --filepath="src/app/page.tsx" --function="useLayoutEffect()"]: error.cause: `,
error?.cause
)
}
}, [ user, error, isLoading ])
return (
<>
<main>
<MainPortal />
</main>
</>
)
}
To further debug this issue, I also console log the user
object in my middleware.ts
file, on the server.:
/* middleware.ts */
import { withMiddlewareAuthRequired, getSession } from '@auth0/nextjs-auth0/edge'
import { NextResponse } from 'next/server'
import { COOKIE_NAME } from './utils'
export default withMiddlewareAuthRequired(async function middleware(req) {
const res = NextResponse.next()
const user = await getSession(req, res)
console.log(
`[${ new Date().toLocaleString() } --filepath="src/middleware.ts" --function="middleware()"]: user: `,
user
)
// res.cookies.set(COOKIE_NAME, user?.user as any)
return res
})
The user
object is fully returned here, so I am not sure how this issue is manifesting on the client.
I can set the user object in the cookie as a stringified object and then do JSON.parse()
on the client, but I would prefer to just use Auth0’s native useUser()
hook to retrieve the user
object client-side.
Why might this issue be happening?