Untitled

 avatar
unknown
plain_text
16 days ago
2.8 kB
4
Indexable
import NextAuth from "next-auth"
import CredentialsProvider from "next-auth/providers/credentials"

const handler = NextAuth({
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        usernameOrEmail: { label: "Email", type: "text" },
        password: { label: "Password", type: "password" },
        loginType: { label: "Login Type", type: "text" }
        //refreshToken: { label: "Refresh Token", type: "text" }
      },
      async authorize(credentials) {
        try {
          // Google Login
          if (credentials?.loginType === 'google') {
            const tokenData = JSON.parse(atob(credentials.accessToken.split('.')[1]));
            const expirationTime = tokenData.exp * 1000
            return {
              id: '1',
              accessToken: credentials.accessToken,
              //refreshToken: credentials.refreshToken,
              expiration: new Date(expirationTime).toISOString()
            };
          }
          
          // Regular Login
          const res = await fetch(`${process.env.NEXT_PUBLIC_BACKEND_API_URL}/api/auth/login`, {
            method: 'POST',
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
              username: credentials?.usernameOrEmail,
              password: credentials?.password,
            })
          });

          const data = await res.json();

          if (data.status) {
            const tokenData = JSON.parse(atob(data.data.accessToken.split('.')[1]));
            const expirationTime = tokenData.exp * 1000;

            return {
              id: credentials?.usernameOrEmail || '1',
              accessToken: data.accessToken,
              //refreshToken: data.data.refreshToken,
              expiration: new Date(expirationTime).toISOString()
            };
          }
          return null;
        } catch (error) {
          console.error("Auth error:", error);
          return null;
        }
      }
    })
  ],
  callbacks: {
    async jwt({ token, user }) {
      if (user) {
        token.accessToken = user.accessToken;
        //token.refreshToken = user.refreshToken;
        token.expiration = user.expiration;
      }
      return token;
    },
    async session({ session, token }) {
      if (session.user) {
        session.user.accessToken = token.accessToken;
        //session.user.refreshToken = token.refreshToken;
        session.user.expiration = token.expiration;
      }
      if (token.expiration && new Date(token.expiration) < new Date()) {
        return null; // Force re-authentication
      }
      return session;
    }
  },
  pages: {
    signIn: '/signin',
    error: '/error'
  },
  debug: process.env.NODE_ENV === 'development'
});

export { handler as GET, handler as POST };
Editor is loading...
Leave a Comment