我用的是next-auth@4.18.7
&next@13.1.1
和中间件。在我做了许多改动之后,它突然停止工作了。
middleware.ts
import { withAuth } from "next-auth/middleware";
export default withAuth({
callbacks: {
authorized({ req, token }) {
const { pathname } = req.nextUrl;
console.log(token, pathname); // this log never comes
if (pathname.startsWith("/admin")) {
return token?.roleLabel === "ADMIN" || token?.userRole === "admin";
}
// `/me` only requires the user to be logged in
return !!token;
},
},
});
export const config = {
matcher: ["/admin/:path*", "/c/:path*", "/me"],
};
next.config.js
const { i18n } = require("./next-i18next.config");
const { PHASE_DEVELOPMENT_SERVER } = require("next/constants");
module.exports = (phase) => {
let extensions = ['page.tsx', 'page.ts', 'page.jsx', 'page.js', 'api.ts', 'api.js']
if (phase === PHASE_DEVELOPMENT_SERVER) extensions.push('doc.tsx')
return {
i18n,
pageExtensions: extensions,
images: {
domains: ['domain.com'],
},
}
};
我应该重命名我的中间件吗?是到middleware.page.ts吗?这说不通啊。我试过了,但没有用。它已经在我的根/文件夹中,我尝试移动到pages/,但没有成功。
Auth在React端工作得很好,但我不能用这个中间件拦截所有受保护的页面。D:
我想分享一下我的解决方案。
在尝试了一堆东西之后,我发现next.config.js
自定义页面扩展是bug背后的原因。
似乎pagextensions配置将中间件计数为页面,因此在我的情况下将其重命名为middleware.page.ts
或middleware.api.ts
后使其工作。我告诉过你这说不通,但实际上是行得通的。我之前测试的时候可能漏掉了一些东西。
只要提醒middleware
文件必须在根文件夹。