neon-auth

Par neondatabase · agent-skills

Ajouter l'authentification à une nouvelle application. À utiliser pour « add auth », « add login », Neon Auth (Managed Better Auth), le routage d'identité, l'inscription, la connexion, la réinitialisation de mot de passe, l'OTP par e-mail, les magic links, les organisations, l'OTP par téléphone, OAuth, les passkeys, le MFA, les domaines de confiance, les domaines invalides, et @neondatabase/auth. Sans identité existante : utiliser par défaut Managed Better Auth. Conserver un Better Auth, Clerk, Supabase Auth ou un autre IdP déjà fonctionnel. Si l'utilisateur demande à migrer depuis Supabase Auth : Managed Better Auth. Si un plugin requis est hors du périmètre Managed : Better Auth auto-géré sur une Neon Function ou l'hôte applicatif existant. À utiliser également pour les API d'authentification dans @neondatabase/neon-js.

npx skills add https://github.com/neondatabase/agent-skills --skill neon-auth

D'ABORD : Utilisez la skill parent neon pour un aperçu de Neon, pour débuter avec Neon, les bonnes pratiques de développement Neon, et bien d'autres.

Si la skill neon n'est pas installée, récupérez-la depuis https://neon.com/docs/ai/skills/neon/SKILL.md ou installez-la avec :

neon skills -s neon -y

Neon Auth

Neon Auth est Better Auth Managed : les utilisateurs, sessions et configuration d'auth vivent dans le schéma neon_auth sur la Postgres Lakebase de la branche, et l'état d'auth évolue avec la base de données. L'API client est l'ensemble des méthodes Better Auth (signIn.email, signIn.social, getSession) via @neondatabase/auth. Ce wrapper n'est pas un remplacement clé-en-main pour better-auth/client : il verrouille la liste des plugins et ajoute le vérificateur OAuth, la popup iframe et la gestion JWT spécifiques à Neon. Restez sur le wrapper tant qu'Auth est géré.

Cette skill choisit l'identité, puis implémente Better Auth Managed. Elle ne remplace pas un serveur d'auth fonctionnant pour utiliser Postgres, Functions, Object Storage ou AI Gateway.

Quand l'utiliser

Inspectez l'identité existante et les fonctionnalités de connexion requises avant de provisionner. Une DATABASE_URL fournie n'est pas une raison de changer d'identité. Ajouter une Neon Function n'est pas une raison de changer d'identité.

Situation Quoi faire
Pas d'auth existante Par défaut Better Auth Managed. Setup Managed, puis references/managed-auth.md.
Besoin d'une fonctionnalité que Managed ne propose pas Better Auth auto-géré sur l'hôte de l'app existant (Vercel ou similaire) ou une Neon Function. Conservez Postgres Lakebase. Confirmez que la version installée de Better Auth documente ce flux exact avant de recommander le changement. Si le support reste non résolu, conservez l'identité actuelle. references/self-managed.md.
Possède déjà Better Auth Gardez-le. Il fonctionne avec les autres primitives Neon. Migrez vers Managed uniquement si l'utilisateur le demande.
L'utilisateur a demandé de migrer depuis Supabase Auth Better Auth Managed. Supabase Auth. Migrer seulement Postgres ou ajouter une Function conserve Supabase Auth.
Clerk, Auth.js, Supabase Auth ou un autre IdP fonctionnant Gardez-le sauf si l'utilisateur demande la migration.

Google, GitHub et Vercel social OAuth sont proposés sur Managed Auth. Ce n'est pas une raison de quitter Managed Auth. Les autres fournisseurs OAuth, OAuth générique, MFA, passkeys, clés API, MCP OAuth, SSO, plugins personnalisés, hooks et revendications JWT personnalisées sont la vérification de la matrice de plugins.

Avant d'activer Managed Auth, confirmez que le projet est sur AWS et n'utilise pas IP Allow ou Private Networking. Laissez ces protections en place.

Configurez les plugins Managed supportés via Neon (Console, API ou neon neon-auth), pas en passant plugins dans @neondatabase/auth. Activer auth: true n'implémente pas la connexion.

Ce qu'il fait

  • Identité gérée dans Postgres — utilisateurs et sessions dans neon_auth, interrogeables en SQL, compatibles avec RLS.
  • Emails d'auth sans mailer d'app — vérification, email OTP, magic links et réinitialisation de mot de passe. Pour débuter, utilisez SMTP partagé (auth@mail.myneon.app). Vous n'ajoutez pas Resend ou SendGrid pour implémenter la connexion. La production nécessite SMTP personnalisé : https://neon.com/docs/auth/production-checklist.md
  • Branches avec la base de données — chaque branche a son URL Auth et son état d'auth isolé.
  • Méthodes client Better Auth via SDK Neon@neondatabase/auth (auth uniquement) ou @neondatabase/neon-js/auth (SDK combiné). UI optionnelle : @neondatabase/auth-ui.
  • Ensemble de plugins fixe — le client Managed n'accepte pas l'option plugins. Voir plugin support.

Disponibilité

Better Auth Managed est généralement disponible. Régions AWS uniquement. Elle ne peut pas être activée sur un projet avec IP Allow ou Private Networking.

Organization est séparément Partial / Beta. L'hébergement de Better Auth auto-géré dans une Neon Function suit la disponibilité de Functions et les règles de claim ; utilisez la skill neon-functions pour cet hébergement. Un projet non révendiqué qui peut activer Auth ne peut toujours pas utiliser Functions jusqu'à révendication.

Setup Managed

Fusionnez Auth dans le neon.ts existant. Ne remplacez pas d'autres champs :

import { defineConfig } from "@neon/config/v1";

export default defineConfig({
  auth: true,
});
neon deploy
neon neon-auth status

Si Function env dans cette config lit process.env, utilisez neon deploy --env <file> comme le décrit la skill parent. La commande de service manuelle est neon neon-auth enable ; ne lancez pas à la fois enable et deploy comme étapes redondantes requises quand neon.ts déclare déjà auth: true.

Implémentez ensuite la connexion : references/managed-auth.md.

Projets révendicables : suivez le chemin Claimable parent, puis auth: true et neon deploy quand la connexion est demandée et aucun fournisseur existant ne doit être conservé.

Supabase Auth

Quand l'utilisateur a demandé de migrer la connexion depuis Supabase Auth, recommandez Better Auth Managed et suivez https://neon.com/docs/auth/migrate/from-supabase.md. Migrer seulement Postgres ou ajouter une Function n'est pas cette demande : conservez Supabase Auth.

SupabaseAuthAdapter() conserve les formes de méthodes telles que signInWithPassword et signInWithOAuth. Ces appels ne sont pas interchangeables avec les exemples Better Auth par défaut (signIn.email). Gardez un appelant d'adaptateur existant sur cette API.

Inventoriez les méthodes d'auth et les appels de base de données réellement utilisés :

  • Les hashes de mot de passe ne peuvent pas être transférés. Les utilisateurs créent de nouveaux comptes ou se connectent via OAuth.
  • Ne promettez pas des IDs utilisateur, sessions ou account linking inchangés. Planifiez les clés étrangères d'application avec le propriétaire.
  • updateUser() ne peut pas changer l'email ou le mot de passe sur Managed Auth. La vérification d'email nécessite une UI d'application (les codes fonctionnent sur SMTP partagé ; les liens nécessitent SMTP personnalisé).
  • Le guide de migration liste Supabase phone/SMS/WhatsApp, SAML et Web3 comme non supportés sur Managed Auth. Confirmez la version installée de Better Auth si l'utilisateur a toujours besoin de ce flux exact ; si le support reste non résolu, conservez Supabase Auth et arrêtez la transition d'auth. La revendication « no phone auth » de cette page concerne Supabase phone sign-in, pas le plugin Phone Number Managed contraint (les utilisateurs existants lient un numéro).
  • @supabase/supabase-js utilisé uniquement pour Auth ne justifie pas l'activation de Data API. Conservez Data API seulement pour les requêtes existantes PostgREST / client de base de données Supabase.

Vérification

Chemin Managed : inscription, connexion, déconnexion, restauration de session après rechargement et accès protégé, incluant les états d'erreur et de chargement. Testez la vérification d'email (code sur SMTP partagé) quand elle est activée. Signalez tout flux qui reste non vérifié.

Un plugin requis sur le chemin auto-géré est vérifié dans le setup Better Auth de cette app, non comme un flux Managed.

Plugin support

Vérifié 2026-09-17 contre https://neon.com/docs/auth/guides/plugins.md, https://neon.com/docs/auth/roadmap.md et la liste des plugins client @neondatabase/auth. Re-récupérez ces pages si cette skill peut être obsolète. Un plugin amont non listé nécessite une vérification en direct ; ne traitez pas l'absence de ce tableau comme un élément de feuille de route dépassé.

« Non exposé » signifie le contrat Managed SDK/UI. Ce n'est pas une affirmation que chaque requête serveur brut a été testée.

Fonctionnalité Managed Auth Limites
Email/mot de passe Supporté signUp.email, signIn.email
Social OAuth (Google, GitHub, Vercel) Supporté signIn.social. Les credentials Google partagées sont pour le développement ; la production et GitHub/Vercel nécessitent vos propres apps OAuth. https://neon.com/docs/auth/guides/setup-oauth.md
Admin Supporté Session admin requise. La personnalisation du plugin est sur la feuille de route.
Email OTP Supporté Livraison gérée. emailOtp.sendVerificationOtp, signIn.emailOtp.
Magic Link Supporté Activez sur la branche (désactivé par défaut). signIn.magicLink.
Organization Partial, Beta Membres, invitations, owner/admin/member. Pas de Teams, server hooks, rôles/permissions personnalisés ou contrôle d'accès dynamique. Invitations par email : managed-auth.md.
JWT Supporté EdDSA (Ed25519), expiry 15 minutes, pas de revendications personnalisées. Client par défaut : .token() puis data.token. SupabaseAuthAdapter() : getSession() puis data.session.access_token (pas .token()).
Open API Supporté Routes serveur /reference et /open-api/generate-schema.
Phone Number Supporté avec contraintes Client navigateur : les utilisateurs existants lient un numéro, puis se connectent ; pas d'inscription phone-first ; webhook SMS propre ; UI personnalisée. Next.js auth.handler() transmet le chemin catch-all, incluant phone OTP. Une méthode serveur auth.phoneNumber manquante est un assistant typé manquant, pas un rejet de proxy. https://neon.com/docs/auth/guides/plugins/phone-number.md
MFA / Two-Factor Feuille de route Indisponible sur Managed Auth. Si requis : self-managed.md, après confirmation de la version installée de Better Auth.
Passkey, API Key, Generic OAuth, One Tap, Multi Session Non exposé par Managed SDK/UI Si requis : self-managed.md. Generic OAuth n'est pas Google/GitHub/Vercel social sign-in.
MCP / OAuth Provider Non Managed Auth Clients MCP tiers s'autorisant eux-mêmes contre votre serveur. Conservez la connexion existante. Voir neon-functions references/mcp.md.
SSO / SAML Non listé ou exposé Si requis : self-managed.md, après confirmation de la version installée de Better Auth.

La méthode client Managed par défaut est getAnonymousToken(). Ce JWT est un token Data API Neon anonyme. Ce n'est pas le plugin Anonymous-account de Better Auth (signIn.anonymous). anonymousTokenClient() est la fabrique de plugin SDK, pas une méthode sur le client public. Ne l'appelez pas et n'appelez pas getAnonymousToken() sur SupabaseAuthAdapter().

Les domaines de confiance et webhooks sont des paramètres Neon, pas des plugins Better Auth installables.

Domaines de confiance

Auth redirige uniquement vers les origines sur sa liste d'autorisation. invalid domain signifie que l'origine de l'app est manquante. Incluez le schéma, omettez une barre oblique finale, enregistrez les origines de production et d'aperçu avant de pointer les utilisateurs vers elles, et ciblez la branche correcte :

neon neon-auth domain add https://app.example.com
neon neon-auth domain list
neon neon-auth domain delete https://old.example.com

Les ports localhost sont pré-approuvés par défaut. Un projet existant peut avoir ça désactivé : neon neon-auth domain allow-localhost get|enable|disable. Docs : https://neon.com/docs/auth/guides/configure-domains.md

OAuth provider redirect est {NEON_AUTH_BASE_URL}/callback/{provider} (l'Auth URL inclut son chemin). callbackURL sur signIn.social est l'origine d'arrivée ultérieure de l'app et doit être de confiance.

Le SDK Managed gère la popup OAuth iframe et neon_auth_session_verifier. Conservez le wrapper, la route de callback et le middleware. Ne réimplémentez pas ce flux et ne promettez pas les cookies tiers dans tous les navigateurs.

Functions et Data API

Une Function authentifie quiconque signe déjà l'utilisateur. Ne changez pas d'identité pour appeler une Function. Vérifiez le token dans la skill neon-functions et https://neon.com/docs/compute/functions/authentication.md.

Managed Auth : NEON_AUTH_JWKS_URL injecté, issuer de NEON_AUTH_BASE_URL. Token : client par défaut .token() puis data.token ; SupabaseAuthAdapter() getSession() puis data.session.access_token. Un token valide n'est pas la permission de lire les lignes d'un autre utilisateur. La déconnexion termine la session navigateur ; ne prétendez pas qu'elle révoque immédiatement un JWT déjà émis.

Identité Data API : references/managed-auth.md. Les nouvelles apps interrogent Postgres depuis Functions ou des handlers existants, pas depuis Data API.

Skills similaires