تایپاسکریپت - هدایت در afterCallback با استفاده از nextjs-auth0
من چندین مورد برای مدیریت دارم تا کاربر را بر اساس فیلدها و ادعاهای سفارشی مختلف در توکن کاربر هدایت کنم (این کمی پیچیده است با بلوکهای if/else)
با گرفتن اولین و سادهترین مثال برای هدایت کاربر به /email-verification اگر user.email_verified نادرست باشد
const afterCallback = async (req: any, session: any, state: any) => {
// const router = useRouter()
const res = new NextResponse()
if (session.user) {
// check email
if (!session.user.email_verified) {
// router.push("/auth/email-verification")
// redirect("/auth/email-verification", RedirectType.replace)
return Response.redirect(
"http://localhost:3000/auth/email-verification",
308 // just for testing
)
} else {
// MULTI LEVELS IF-ELSE BLOCKS WITH REDIRECTION
}
return session
export const GET = handleAuth({
login: handleLogin({
returnTo: "/",
}),
callback: async (req: any, res: any) => {
const callback = await handleCallback(req, res, { afterCallback })
console.log("callback", callback)
return callback;
},
})
من همیشه به http://localhost:3000 هدایت میشوم بدون هیچ دادهی کاربری، علاوه بر این با لاگ گرفتن از callback، وضعیت ثابت شده که 302 است و نه 308 که من استفاده میکنم
پاسخ شماره ۱
به جای آن سعی کنید state.returnTo را تغییر دهید.
import type { NextRequest } from 'next/server'
import { handleAuth, handleCallback, Session } from '@auth0/nextjs-auth0'
export const GET = handleAuth({
callback: handleCallback({
afterCallback(req: NextRequest, session: Session, state: any) {
state.returnTo = '/redirectpage'
return session
}
})
})
Auth0 باید هم در کیفیت کتابخانه و هم در پشتیبانی مشتری بهبود یابد.
پاسخ شماره ۲
طبق مستندات SDK شرکت Auth0.
// app/api/auth/[auth0]/route.js
import { handleAuth, handleCallback } from '@auth0/nextjs-auth0';
import { redirect } from 'next/navigation';
const afterCallback = (req, session, state) => {
if (session.user.isAdmin) {
return session;
} else {
redirect('/unauthorized');
}
};
export default handleAuth({
callback: handleCallback({ afterCallback })
});
کد SDK کار نمیکند: مدیریتکننده بازخوانی (Callback) شکست خورد. علت: NEXT_REDIRECT.
من روشهای مختلفی را امتحان کردم اما نتوانستم afterCallback یا handleCallback را با ارجاع و داشتن دادههای جلسه در همان زمان کار کنم. در handleCallback، جلسه با استفاده از getSession در دسترس نیست.
توصیه من این است که از مسیریاب صفحه استفاده کنید.
//pages/api/auth/[...auth0].ts
const afterCallback = (req, res) => {
if (!session.user.email_verified) {
return session;
} else {
res.setHeader('location', '/verified');
}
};
export default handleAuth({
async callback(req: NextApiRequest, res: NextApiResponse) {
try {
await handleCallback(req, res, { afterCallback});
} catch (error) {
console.log(error);
res.redirect('/');
}
},
});
علاوه بر این میتوانم اضافه کنم که بر اساس تجربه من، فراخوانی handleCallback از ناوبری عقب پشتیبانی نمیکند. بنابراین بهتر است که try-catch را همانطور که در کد خودتان دارید نگه دارید و در صورت بروز خطا هدایت مجدد انجام دهید. در غیر این صورت کاربران شما هنگام بازگشت به صفحه قبلی با صفحهای خالی یا پیام خطا مواجه خواهند شد.
