#next.js #middleware
Вопрос:
Я создаю Next.js
приложение, которое предназначено исключительно для аутентификации пользователей через JWT, а затем перенаправляет их в наше основное веб-приложение. До выпуска Next.js
версии 12 я использовал next-connect для запуска одной функции промежуточного программного обеспечения при каждом запросе api для десериализации пользователя из маркера или обновления маркера доступа, если срок действия маркера обновления истек. Теперь я хотел перейти next-connect
к новомупромежуточное программное обеспечение api, но, прежде всего, я не уверен, как эти функции будут выполняться в среде с самостоятельным размещением, потому что с помощью Vercel они будут развернуты как пограничные функции, но как они работают в среде с самостоятельным размещением? Так же, как обычное промежуточное программное обеспечение express, или вообще нет?
Я также получаю ошибку eval not allowed in Middleware pages/api/_middleware
, потому что стандартный пакет jsonwebtoken не разрешен в пограничных функциях. В этой проблеме говорится , что мне придется использовать облегченный пакет @tsndr/cloudflare-worker-jwt
, хотя я не планирую использовать функции edge, а скорее разверну приложение самостоятельно.
Это промежуточное программное обеспечение, которое я пытаюсь запустить через _middleware
файл при каждом запросе api:
export async function middleware(req: NextApiRequestWithUser) {
const { access_token, refresh_token } = req.cookies;
if (!access_token) {
return NextResponse.next();
}
try {
// Verify token
const { payload, expired } = verifyAccessToken(access_token);
if (payload) {
if (!payload.userId) {
return new Response("User id is missing in JWT payload.", {
status: 401,
});
}
const currentUser = await User.findById(payload.userId).lean();
if (!currentUser) {
return new Response(
"The user belonging to this token no longer exist.",
{
status: 401,
}
);
}
req.user = currentUser;
}
const { payload: refreshPayload } = verifyRefreshToken(refresh_token);
if (!refreshPayload) return NextResponse.next();
const user = await User.findOne({ _id: refreshPayload.userId });
if (user?.refreshToken === refresh_token amp;amp; expired) {
console.log("Refreshing access token");
const newAccessToken = generateAccessToken(refreshPayload.userId);
NextResponse.next().cookie(access_token, newAccessToken, {
domain: "localhost",
httpOnly: true,
secure: process.env.NODE_ENV === "production",
path: "/",
});
return NextResponse.next();
}
return NextResponse.next();
} catch (error) {
console.log(error);
return NextResponse.next();
}
}
Ответ №1:
Да, ты можешь бежать Next.js промежуточное программное обеспечение в автономной среде. И та eval not allowed
ошибка, на которую вы ссылаетесь, на самом деле просто предупреждение. Более подробную информацию об этом можно найти в этом выпуске Github. Пользователь gustavo-dev
дал подробное объяснение разницы между пограничными функциями и промежуточным программным обеспечением:
Функции Edge аналогичны функциям CDN (но отличаются).
CDN (Сеть доставки контента) используется для быстрого обслуживания статического контента. Поэтому они должны быть расположены близко к клиенту. Недостатком такого подхода является невозможность доставки пользовательского контента различным клиентам, например, в зависимости от их местоположения.
Другим методом, который мог бы решить эту проблему, была бы обработка каждого запроса на сервере (SSR). Однако недостатком сейчас является скорость, поскольку сервер, обрабатывающий эти запросы, не обязательно находится рядом с вашим конечным пользователем.
Вот тут-то и появляются функции Edge! Они работают так же, как CDN, но они позволяют вам запускать логику на стороне сервера на границе, близко к вашему клиенту, что позволяет нам достигать как скорости, так и динамичности.
С другой стороны, промежуточное программное обеспечение-это функция, которая запускается до завершения запроса. Если вы раньше использовали ExpressJS, вы должны быть знакомы с этой концепцией. Они могут изменять объекты запроса/ответа и, помимо прочего, полезны для аутентификации.
Следовательно, промежуточные программы не обязательно являются граничными функциями, а Граничные функции не обязательно являются промежуточными. Однако при развертывании в Vercel промежуточное программное обеспечение является единственным кодом, который выполняется в пограничных функциях.