NextAuth.js over Clerk
Tags: nextjs, nextauth, clerk, javascript
Published: 2024-04-24 09:30:00

The [prior article](https://njabulomajozi.com/blogs/auth-with-clerk) examined how Clerk may simplify user authentication for Next.js applications. Clerk provides a handy managed service option, but it's wise to weigh your options before making a choice. Today, we'll examine and contrast Clerk and NextAuth.js, two more well-liked authentication libraries for Next.js, to help you decide which is ideal for your project.

**Why Next Auth instead of Clerk?**

- **Control and Flexibility**
    - **Self-Hosted vs. Managed Service:** NextAuth enables you to fully self-host the authentication flow, giving you more control over user data and security procedures. Conversely, Clerk is a managed service, meaning that its servers hold your user data.
    - **Customization:** NextAuth provides more flexibility, such as customizing the authentication procedure using callbacks, which are flexible enough to adjust to your unique requirements. The clerk's experience is more preconfigured, but you can still get some flexibility using webhooks
- **Community and Support:**
    - **Larger Community:** NextAuth benefits from a larger and more active developer community. You'll find more resources, tutorials, and support online if you encounter issues. Clerk, a relatively newer service, might have a smaller support pool.
    - **Integration Flexibility:** NextAuth integrates seamlessly with various social providers and other authentication services. You can leverage existing libraries and solutions within your development stack.
- **Cost:**
    - **Open-Source vs. Freemium:** NextAuth is an open-source library with no direct cost for its basic functionalities. Clerk offers a free tier with limitations and paid plans for additional features and user management capabilities.

**Setting Up Next Auth in Next.js**

- Install NextAuth
    
    ```bash
    npm install next-auth
    ```
    
- Configure NextAuth
    - Server
        
        NextAuth.js will handle all queries to /api/auth/* (signIn, callback, signOut, etc.) automatically.
        
        ```tsx
        import NextAuth from "next-auth";
        import GoogleProvider from 'next-auth/providers/google';
        
        export const authOptions = {
          providers: [
            GoogleProvider({
              clientId: process.env.GOOGLE_CLIENT_ID,
              clientSecret: process.env.GOOGLE_CLIENT_SECRET
            })
          ]
        }
        
        export default NextAuth(authOptions)
        ```
        
    - Client
        - Provider
            
            ```tsx
            import { SessionProvider } from "next-auth/react"
            
            export default function App({
              Component, pageProps: { session, ...pageProps }
            }) {
              return (
                <SessionProvider session={session}>
                  <Component {...pageProps}/>
                </SessionProvider>
              )
            }
            ```
            
        - Consumer
            
            ```tsx
            import { useSession, signIn, signOut } from "next-auth/react"
            
            export default function Component() {
              const { data: session } = useSession()
              if(session) {
                return <>
                  Signed in as {session.user.email} <br/>
                  <button onClick={() => signOut()}>Sign out</button>
                </>
              }
              return <>
                Not signed in <br/>
                <button onClick={() => signIn()}>Sign in</button>
              </>
            }
            ```
            
    
    NextAuth.js is a compelling alternative to Clerk, offering developers greater control, flexibility, and cost-effectiveness. Its open-source nature, extensive community support, and seamless integration capabilities make it an attractive choice for Next.js applications. Whether you're looking for a self-hosted solution or prefer a managed service, NextAuth.js provides a robust and customizable authentication framework to meet your project's needs.