codelynx.dev
🇫🇷🇬🇧

Retour 08/01/2024

NextAuth VS BetterAuth : Quelle authentification utiliser avec NextJS

Écris par Melvyn Malherbe le 08/01/2024


AuthJS (anciennement NextAuth) est la librairie la plus populaire pour gérer l'authentification dans les applications NextJS.

Pourtant ce n'est pas la seule solution et j'ai récemment migré toutes mes applications sur Better-Auth, qui je te le promets, une fois testée te fera l'utiliser à vie.

Chaque titre va comparer une fonctionnalité qui m'a fait switch.

Installation et setup

Sur Better-Auth, l'installation est très simple, il suffit de suivre leur tutoriel et d'installer chaque librairie.

Ce qui est magique, c'est que pour gérer ta database ils proposent un CLI qui met à jour ton schéma automatiquement. Par exemple tu setup Prisma :

TSX
import { betterAuth } from 'better-auth';
import { prismaAdapter } from 'better-auth/adapters/prisma';
import { PrismaClient } from '~/generated/client';

const prisma = new PrismaClient();
export const auth = betterAuth({
  database: prismaAdapter(prisma, {
    provider: 'sqlite', // or "mysql", "postgresql", ...etc
  }),
});

Puis il te suffit de lancer npx @better-auth/cli generate pour que Better-Auth mette automatiquement à jour ton schéma Prisma avec les nouvelles données.

Pourquoi ce CLI ? Car Better-Auth propose des plugins et par exemple en ajoutant le plugin username tu vas pouvoir relancer la commande pour qu'il ajoute automatiquement les champs username dans Prisma.

Ça offre une expérience de développeur bien plus agréable.

Email / Password

Avec AuthJS, l'e-mail et password était une vraie galère à setup à tel point qu'il fallait faire du code soi-même pour le faire comme je l'explique dans mon article sur le sujet..

Avec Better-Auth, il suffit d'ajouter ceci :

TSX
import { betterAuth } from 'better-auth';

export const auth = betterAuth({
  emailAndPassword: {
    enabled: true,
  },
});

Et c'est tout, tu peux déjà commencer à tester.

DX du Client

Pour interagir avec Better-Auth, tu as ce qu'ils appellent le "client" qui est appelable côté client et qui te permet d'interagir avec Better-Auth. Par exemple pour signUp :

TSX
authClient.signUp.email({
  email: values.email,
  password: values.password,
  name: values.name,
  image: values.image,
});

Juste en faisant cette commande, tu viens de créer un nouvel utilisateur avec e-mail et password. Il gère automatiquement le setup de cookie, la gestion du hash du password etc...

Features avancées

Tu as besoin de Reset Password ? Validation de l'e-mail ou même Social Login ?

Tu peux tout gérer avec la configuration et la documentation est super bien expliquée. Par exemple pour reset le password tu ajoutes ceci dans ta config auth.ts :

TSX
import { betterAuth } from 'better-auth';

export const auth = betterAuth({
  emailAndPassword: {
    enabled: true,
    async sendResetPassword({ user, url }) {
      await sendEmail({
        to: user.email,
        subject: 'Reset your password',
        text: `Hello, clique here to reset your password : ${url}`,
      });
    },
  },
});

Juste en faisant ça, on a activé le reset password. Ensuite il te suffit d'appeler les méthodes du client :

TSX
authClient.forgetPassword({
  email: values.email,
  redirectTo: '/auth/reset-password',
});

De créer une page /auth/reset-password qui récupère le token et le nouveau password et le met à jour avec cette méthode :

TSX
authClient.resetPassword({
  token: token,
  newPassword: values.password,
});

Trop simple pour être vrai ? Oui. C'est vraiment fantastique.

Pour préciser, AuthJS n'avait tout simplement aucune des fonctionnalités

  • Verify email = ❌
  • Reset Password = ❌
  • Changer l'email = ❌

Donc c'est incomparable car avec Better-Auth tu peux tout faire simplement.

Plugins et customization

Better-Auth a été créé avec un système qui peut avoir autant de plugins que tu veux pour tout faire. La communauté peut créer des plugins et better-auth crée aussi des super plugins comme Organization et Stripe.

La documentation est top et c'est simple à setup.

Avec ça, on peut avoir une organisation, manager les permissions, les rôles très simplement.

J'ai setup tout ça dans NOW.TS pour toi et ça le fait en vraiment peu de code.

Personnellement je suis totalement fan de ce système et ça permet de faire une infinité de choses.

Conclusion

Je n'ai même pas parlé d'AuthJS à quel point AuthJS est pauvre en fonctionnalités. C'est comme comparer un vieux Nokia 3310 à un iPhone.

L'iPhone peut tout faire, tu peux installer des applications quand le Nokia peut juste... téléphoner.

En l'occurrence le seul usage de NextAuth c'est le social sign in et le magic link. Tout le reste est impossible et il faut tout faire manuellement, jusqu'à la gestion de la session token.

En résumé je déconseille vivement l'utilisation de NextAuth.

Et je te recommande vivement d'utiliser Better-Auth.

Tu peux retrouver une formation FullStack ici.