Auth.js: vlastní poskytovatel OIDC a příklad pro Next.js

Potřebujete tři hodnoty z vývojářské konzole: ID klienta, tajný klíč klienta (jen u webových serverových aplikací) a URI přesměrování, které jste zaregistrovali. Vše ostatní je v dokumentu discovery na adrese https://identity.dazr.eu/.well-known/openid-configuration.

Auth.js / NextAuth

Auth.js (NextAuth.js v5) přijímá vlastní objekt poskytovatele OpenID Connect. Zaregistrujte webovou serverovou aplikaci, nastavte AUTH_SECRET, AUTH_DAZR_ID a AUTH_DAZR_SECRET a jako URI pro přesměrování použijte tuto URL zpětného volání: 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 používá stejný princip s type: "oauth" a discovery URL:

// 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

Se souborem auth.ts výše přidejte obsluhu trasy a přihlašovací tlačítko, které spustí serverovou akci.

// 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>
  )
}

Tlačítko nastylujte podle části Tlačítko. V callbackech je Dazr sub hodnotou account.providerAccountId.

Další informace pro vývojáře