Auth.js : fournisseur OIDC personnalisé, exemple Next.js

Il vous faut trois valeurs de la console développeurs : l’ID client, le secret client (applications serveur web uniquement) et l’URI de redirection que vous avez enregistrée. Le reste se trouve dans le document de découverte à l’adresse https://identity.dazr.eu/.well-known/openid-configuration.

Auth.js / NextAuth

Auth.js (NextAuth.js v5) accepte un objet fournisseur OpenID Connect personnalisé. Enregistrez une application serveur web, définissez AUTH_SECRET, AUTH_DAZR_ID et AUTH_DAZR_SECRET, et utilisez cette URL de callback comme URI de redirection : https://app.example.eu/api/auth/callback/dazr.

// auth.ts
import NextAuth from "next-auth"

export const { handlers, auth, signIn, signOut } = NextAuth({
  providers: [
    {
      id: "dazr",
      name: "Dazr Identity",
      type: "oidc",
      issuer: "https://identity.dazr.eu",
      clientId: process.env.AUTH_DAZR_ID,
      clientSecret: process.env.AUTH_DAZR_SECRET,
      authorization: { params: { scope: "openid profile email" } },
      checks: ["pkce", "state", "nonce"],
      client: { id_token_signed_response_alg: "ES256" },
    },
  ],
})

NextAuth.js v4 fonctionne de la même façon, avec type: "oauth" et l’URL de discovery :

// pages/api/auth/[...nextauth].ts (NextAuth.js v4), in providers: [ ... ]
{
  id: "dazr",
  name: "Dazr Identity",
  type: "oauth",
  wellKnown: "https://identity.dazr.eu/.well-known/openid-configuration",
  clientId: process.env.DAZR_CLIENT_ID,
  clientSecret: process.env.DAZR_CLIENT_SECRET,
  authorization: { params: { scope: "openid profile email" } },
  idToken: true,
  checks: ["pkce", "state"],
  client: { id_token_signed_response_alg: "ES256" },
  profile(profile) {
    return { id: profile.sub, name: profile.name ?? null, email: profile.email }
  },
}

Next.js App Router

Avec le fichier auth.ts ci-dessus, ajoutez le route handler et un bouton de connexion qui exécute une server action.

// app/api/auth/[...nextauth]/route.ts
import { handlers } from "@/auth"
export const { GET, POST } = handlers

// app/page.tsx
import { auth, signIn, signOut } from "@/auth"

export default async function Page() {
  const session = await auth()
  if (session?.user) {
    return (
      <form action={async () => { "use server"; await signOut() }}>
        <p>Signed in as {session.user.email}</p>
        <button type="submit">Sign out</button>
      </form>
    )
  }
  return (
    <form action={async () => { "use server"; await signIn("dazr") }}>
      <button type="submit" className="dazr-signin">Sign in with Dazr Identity</button>
    </form>
  )
}

Donnez au bouton le style présenté dans Le bouton. Dans les callbacks, le sub Dazr est account.providerAccountId.

Plus pour les développeurs