DEV Community

Cover image for Adding Next Auth on Website
Mohammad Ezzeddin Pratama
Mohammad Ezzeddin Pratama

Posted on • Edited on

2 1 1 1 1

Adding Next Auth on Website

Implementing Authentication in Next.js

To add authentication to your Next.js application, grasp these core concepts:

Key Concepts

  1. Authentication: Verifies user identity (e.g., username/password or via Google).
  2. Session Management: Tracks user's state across requests.
  3. Authorization: Controls access to different parts of the app.

Authentication Strategies

  • OAuth/OpenID Connect (OIDC): Ideal for social logins and Single Sign-On (SSO).
  • Email + Password: Common and straightforward, requires strong security.
  • Passwordless: Uses email magic links or SMS codes, reducing password fatigue.
  • Passkeys/WebAuthn: High-security cryptographic credentials, complex to implement.

Implementing Email-Password Authentication

Here’s how to add basic email-password authentication to a Next.js app:

Login Form

Create a login form in app/login/page.tsx:

import { authenticate } from '@/app/lib/actions';

export default function Page() {
  return (
    <form action={authenticate}>
      <input type="email" name="email" placeholder="Email" required />
      <input type="password" name="password" placeholder="Password" required />
      <button type="submit">Login</button>
    </form>
  );
}
Enter fullscreen mode Exit fullscreen mode

Authentication Logic

Handle authentication in app/lib/actions.ts:

'use server';
import { signIn } from '@/auth';

export async function authenticate(formData: FormData) {
  try {
    await signIn('credentials', formData);
  } catch (error) {
    if (error) {
      switch (error.type) {
        case 'CredentialsSignin':
          return 'Invalid credentials.';
        default:
          return 'Something went wrong.';
      }
    }
    throw error;
  }
}
Enter fullscreen mode Exit fullscreen mode

Form Handling

Manage form state and handle errors in app/login/page.tsx:

'use client';
import { authenticate } from '@/app/lib/actions';
import { useFormState, useFormStatus } from 'react-dom';

export default function Page() {
  const [errorMessage, dispatch] = useFormState(authenticate, undefined);

  return (
    <form action={dispatch}>
      <input type="email" name="email" placeholder="Email" required />
      <input type="password" name="password" placeholder="Password" required />
      {errorMessage && <p>{errorMessage}</p>}
      <LoginButton />
    </form>
  );
}

function LoginButton() {
  const { pending } = useFormStatus();

  return (
    <button aria-disabled={pending} type="submit">
      Login
    </button>
  );
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

This setup provides a basic email-password authentication flow. For enhanced security and multiple login options, consider integrating OAuth or passwordless authentication methods.

Sentry blog image

How to reduce TTFB

In the past few years in the web dev world, we’ve seen a significant push towards rendering our websites on the server. Doing so is better for SEO and performs better on low-powered devices, but one thing we had to sacrifice is TTFB.

In this article, we’ll see how we can identify what makes our TTFB high so we can fix it.

Read more

Top comments (1)

Cloudinary image

Zoom pan, gen fill, restore, overlay, upscale, crop, resize...

Chain advanced transformations through a set of image and video APIs while optimizing assets by 90%.

Explore