基本使用
中间件可以按照matcher去匹配可以生效的文件路径,中断api调用或静态文件。
在src根目录定义中间件middleware.js
(个人理解:next-auth是将各种认证的函数通过callback的形式定义,并最终转化成api路径下的实际router,也就是说NextAuth所暴露的auth/signIn/signOut只是调用框架的必要接口,而实际的功能都是在callback api中实现的)
创建authConfig配置文件
该文件需要和authjs中的配置文件进行合并(略)才能让callback真正生效,authorized:此回调在用户需要授权时被调用,通常在使用中间件时。你可以通过返回自定义响应来覆盖默认行为。
为auth增加用户信息以完善跳转逻辑
在jwt回调中为token丰富用户信息
在session回调中通过token增加session信息
在authorized中判断是否可以通过认证,如果未通过认证则跳转至login
export const authConfig = {
pages: {
signIn: "/login",
},
providers: [],
callbacks: {
// FOR MORE DETAIL ABOUT CALLBACK FUNCTIONS CHECK https://next-auth.js.org/configuration/callbacks
async jwt({ token, user }) {
if (user) {
token.id = user.id;
token.isAdmin = user.isAdmin;
}
return token;
},
async session({ session, token }) {
if (token) {
session.user.id = token.id;
session.user.isAdmin = token.isAdmin;
}
return session;
},
authorized({ auth, request }) {
const user = auth?.user;
const isOnAdminPanel = request.nextUrl?.pathname.startsWith("/admin");
const isOnBlogPage = request.nextUrl?.pathname.startsWith("/blog");
const isOnLoginPage = request.nextUrl?.pathname.startsWith("/login");
// ONLY ADMIN CAN REACH THE ADMIN DASHBOARD
if (isOnAdminPanel && !user?.isAdmin) {
return false;
}
// ONLY AUTHENTICATED USERS CAN REACH THE BLOG PAGE
if (isOnBlogPage && !user) {
return false;
}
// ONLY UNAUTHENTICATED USERS CAN REACH THE LOGIN PAGE
if (isOnLoginPage && user) {
return Response.redirect(new URL("/", request.nextUrl));
}
return true
},
},
};