Почему NextJs делает xhr-запрос вместо редиректа на кроссдоменный url?
У меня есть проект, основанный на SSO. основным модулем которого является проект Django (drf), а модули (это отдельные проекты, предварительно спланированные как drf+nextjs) должны аутентифицироваться и авторизироваться, запрашивая этот модуль. Сейчас в dev окружении у меня 3 сервера
- Главное приложение (auth_module - Django 14.2.12) localhost:8080
- Бэкенд приложения "Магазин" (warehouse_backend - Django 5.1.1) localhost:8082
- Фронтенд приложения "Магазин" (warehouse_frontend - Nextjs 14.2.12) localhost:3000
Поток аутентификации происходит следующим образом:
- Когда пользователь вводит 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 есть токен доступа.
- если в 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 .
- /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)