Почему NextJs делает xhr-запрос вместо редиректа на кроссдоменный url?

У меня есть проект, основанный на SSO. основным модулем которого является проект Django (drf), а модули (это отдельные проекты, предварительно спланированные как drf+nextjs) должны аутентифицироваться и авторизироваться, запрашивая этот модуль. Сейчас в dev окружении у меня 3 сервера

  1. Главное приложение (auth_module - Django 14.2.12) localhost:8080
  2. Бэкенд приложения "Магазин" (warehouse_backend - Django 5.1.1) localhost:8082
  3. Фронтенд приложения "Магазин" (warehouse_frontend - Nextjs 14.2.12) localhost:3000

Поток аутентификации происходит следующим образом:

  1. Когда пользователь вводит http://localhost:3000/ warehouse_frontend axios GET запрос к /api/auth/user/ withCredentials=true 2.В /app/api/auth/user/route.js у меня есть код, который запрашивает auth_module http://localhost:8080/api/user/ с cookies, он должен вернуть данные пользователя, если в cookie есть токен доступа.
  2. если в cookie нет токена, то auth_module возвращает 401 неавторизованный ответ и в route.js я должен перенаправить на http://localhost:8080/login?module=http://localhost:3000. auth_module страница входа в систему, которая будет обрабатывать вход с именем пользователя и паролем. Проблема С которой я столкнулся при перенаправлении route.js. Ожидаемое поведение - в браузере изменения на http://localhost:8080/login?module=http://localhost:3000, но он получает url как xhr developer tools screenshot
  3. .
  • /app/layout.js

export default function RootLayout({children}) {

    return (
        <StoreProvider>
            <html lang="en">
            <body>
            <Container maxWidth={'xl'} id={'root'}>
                <Header/>
                <UserFetcher/>
                {children}
            </Container>
            </body>
            </html>
        </StoreProvider>
    )
}

  • UserFetcher.js
useEffect(() => {
        (async () => {
            try {
                console.log('effect')
                const res = await axios('/api/auth/user', {
                    method: 'GET',
                    withCredentials: true,
                    headers: {
                        'Accept': 'application/json',
                        'Content-Type': 'application/json',
                    }
                })
                console.log('res:', res)
                if (res.statusText !== 'OK') {
                    console.log(res.statusText)
                } else {
                    console.log('user:', res.data)
                    const user = res.data
                    if (user) {
                        dispatch(setUser(user))
                    }
                }
            } catch (e) {
                console.log(e)
            }
        })()
    }, []);
  • /app/api/auth/user/route.js
import {redirect} from 'next/navigation';

export async function GET(request) {
        redirect('http://localhost:8080/login?module=http://localhost:3000')
        // tried to different variations 
        // NextResponse.redirect('http://localhost:8080/login?module=http://localhost:3000')
        // return them both and just call
        // all same result 
}

Deepnote: Я пробовал другие домены, такие как https://google.com, он также пытается получить его. Я пробовал перенаправления в next.config.js с тем же результатом

module.exports = {
    async redirects() {
        return [
            {
                source: '/mis/:path*',
                destination: 'http://localhost:8080/login?module=http://localhost:3000',
                permanent: true,
            },
        ]
    },
}

Он работал просто отлично, но я не могу найти, что испортило его во время разработки. И я не могу просто вернуться к предыдущим версиям, я сделал так много изменений в проекте.

РЕДАКТИРОВАТЬ:

Этот блок кода работает в middleware.js, но не в route.js.

        return NextResponse.redirect(MIS_LOGIN_URL)

Вернуться на верх