تایپاسکریپت - هدایت در 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 را همانطور که در کد خودتان دارید نگه دارید و در صورت بروز خطا هدایت مجدد انجام دهید. در غیر این صورت کاربران شما هنگام بازگشت به صفحه قبلی با صفحهای خالی یا پیام خطا مواجه خواهند شد.