reactjs - Furnizori Next-Auth cu o eroare Typescript


Am încercat să implementez Next-Auth cu Typescript și un furnizor OAuth, cum ar fi Auth0. După ce am urmat documentația, problema a apărut, și chiar după ce am vizionat o mulțime de videoclipuri și am făcut exact ce au făcut alți oameni, eroarea persistă. Iată fragmentul de cod pentru api/auth/[...nextauth.tsx]:

import NextAuth from "next-auth/next";
import Auth0 from "next-auth/providers/auth0";

export default NextAuth({
    providers: [
        Auth0({
            clientId: process.env.AUTH0_ID,
            clientSecret: process.env.AUTH0_SECRET,
            domain: process.env.AUTH0_DOMAIN,
        }),
    ],
});

Eroarea pe care o primesc apare atât în clientId, cât și în clientSecret și este descrisă mai jos:

Ceea ce nu înțeleg, totuși, este că atunci când mă uit la oauth.d.ts descopăr că ambele acceptă fie string, fie undefined:

Aș aprecia cu adevărat orice ajutor în această problemă.

Răspuns #1

Dacă te uiți cu adevărat la declarație, este astfel:

export type OAuthUserConfig<P>
Alias for:
Omit<Partial<OAuthConfig<P>>, "options" | "type"> & Required<Pick<OAuthConfig<P>, "clientId" | "clientSecret">>

Motivul din spatele acestui lucru cred că este că, fără clientId și clientSecret, OAuth nu va funcționa niciodată corect.

Două moduri posibile de a-l rezolva:

  • cea mai leneșă (și nu foarte bună) metodă ar fi să îl convertești pur și simplu într-un șir de caractere
import NextAuth from "next-auth/next";
import Auth0 from "next-auth/providers/auth0";

export default NextAuth({
    providers: [
        Auth0({
            clientId: process.env.AUTH0_ID as string,
            clientSecret: process.env.AUTH0_SECRET as string,
            domain: process.env.AUTH0_DOMAIN,
        }),
    ],
});
  • puțin mai puțin leneș, și poți adăuga manual avertismente dacă valorile sunt goale
import NextAuth from "next-auth/next";
import Auth0 from "next-auth/providers/auth0";

const { AUTH0_ID = '', AUTH0_SECRET = '', AUTH0_DOMAIN = '' } = process.env;

// potential console.error here to warn yourself you forgot to set the env values

export default NextAuth({
    providers: [
        Auth0({
          clientId: AUTH0_ID,
          clientSecret: AUTH0_SECRET,
          domain: AUTH0_DOMAIN,
        }),
    ],
});

Răspunsul #2

Ca în exemplul NextAuth.js TypeScript, ai putea crea un fișier process.d.ts care conține următoarele:

declare namespace NodeJS {
  export interface ProcessEnv {
    AUTH0_ID: string
    AUTH0_SECRET: string
    AUTH0-DOMAIN: string
  }
}