如何使用NextAuth和调用特定API路由添加多个登录页面

idfiyjo8  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(208)

我正在做一个项目,我需要使用NextAuth实现一个多登录页面,并根据登录路由调用特定的API路由。我一直在探索NextAuth的特性,但还没有找到一个简单的解决方案来满足这个需求。
这就是我想要达到的目标:
当用户从/owner/login路由登录时,我希望调用/API/owner路由,并在成功验证后导航到另一个特定路由。
类似地,如果用户从/user/login路由登录,我想调用/API/user路由,并在成功验证后导航到另一个路由。
我试过在NextAuth中使用signIn回调,但它似乎只允许我为所有登录场景传递相同的API路由。
如果任何人遇到类似的情况或有任何关于如何处理这一点的想法,我将非常感谢您的见解。先谢谢你了!

kadbb459

kadbb4591#

我正面临着一个类似的情况,你,我需要实现两个不同的登录页面。我的客户希望根据访问网站的用户类型在页面上显示不同的品牌。但除此之外,我使用的是同一个身份验证提供程序,用户通过身份验证提供程序维护的角色进行区分。
在浏览完文档后,我没有看到允许我指定不同的auth API的东西,但这是我计划解决这个问题的方式:

  • 提供两个不同的登录页面,它们具有基本相同的表单组件,只是品牌不同。在用户尝试登录并具有有效凭据后,这两种类型的用户将被定向到同一页。
  • 在下一页中,我将在服务器端属性中检索会话,并检查它的用户类型。根据用户的类型,我会将他们重定向到适当的目的地。
// snippet from my [...nextauth].js config file
export default NextAuth({
  secret: process.env.NEXTAUTH_SECRET_KEY,
  providers: [
    CredentialsProvider({
      id: 'login',
      name: 'Login',
      credentials: {
        email: {
          label: 'Email',
          type: 'email',
          placeholder: 'Enter Email'
        },
        password: {
          label: 'Password',
          type: 'password',
          placeholder: 'Enter Password'
        }
      },
      async authorize(credentials) {
        let loginResult = await myAuthProvider.loginWithEmailPassword({
          password: credentials?.password,
          email: credentials?.email,
        });

        // The loginResult is going to be returned which will then be added to the session. We'll be able to use
        // this loginResult from the session to be able to verify the user's identity in followup requests to the
        // server.
        return loginResult?.data;
      }
    }),
  ],
  callbacks: {
    jwt: ({
      token,
      user,
      account
    }) => {
      // See: https://next-auth.js.org/configuration/callbacks#jwt-callback

      if (user) {
        token.provider = account ? .provider;
        token.user = user.member;
      }

      return token;
    },
    session: ({
      session,
      token
    }) => {
      // See: https://next-auth.js.org/configuration/callbacks#session-callback

      if (token) {
        session.id = token.id;
        session.provider = token.provider;
        session.token = token;
        session.user = token.user;
      }

      return session;
    }
  },
  session: {
    strategy: 'jwt',
    maxAge: Number(process.env.JWT_TIMEOUT)
  },
  jwt: {
    secret: process.env.JWT_SECRET
  },
});
// in my intermediate "post login" page
import {
  useSession,
  getSession,
  signIn,
  signOut
} from "next-auth/react"

export async function getServerSideProps(context) {
  let session = await getSession(context);
  let destination = "/";

  switch (session.user.role) {
    case "owner":
      destination = "/owner/dashboard";
      break;
    case "user":
      destination = "/user/dashboard";
      break;
  }

  if (session) {
    // if the user is already signed in and they navigate here, redirect them back to their appropriate dashboard.
    return {
      redirect: {
        destination: destination,
        permanent: false,
      },
    };
  }

  return {
    props: {},
  };
}

我是Next.JS的新手,也许有一个更完美的解决方案,但我可以证明这个实现对我很有效。

相关问题