跳至內容
從 NextAuth.js v4 遷移?請閱讀 我們的遷移指南.
API 參考next-auth

next-auth

如果您想要從 v4 遷移,請訪問升級指南 (v5)

安裝

npm install next-auth@beta

環境變數推斷

自 v4 以來,已推斷出 NEXTAUTH_URLNEXTAUTH_SECRET

由於 NextAuth.js v5 也可以自動推斷以 AUTH_ 為字首的環境變數。

例如,AUTH_GITHUB_IDAUTH_GITHUB_SECRET 將會被用作 GitHub 供應商的 clientIdclientSecret 選項。

💡

環境變數名稱推斷針對 OAuth 供應商具有以下格式:AUTH_{PROVIDER}_{ID|SECRET}

PROVIDER 是供應商 ID 的大寫蛇形命名法版本,後面接著 IDSECRET

為了保持一致性,AUTH_SECRETAUTH_URL 也分別為 NEXTAUTH_SECRETNEXTAUTH_URL 的別名。

若要將社群登入新增到您的應用程式,組態會變成

auth.ts
import NextAuth from "next-auth"
import GitHub from "next-auth/providers/github"
export const { handlers, auth } = NextAuth({ providers: [ GitHub ] })

以及 .env.local 檔案

.env.local
AUTH_GITHUB_ID=...
AUTH_GITHUB_SECRET=...
AUTH_SECRET=...
💡

在生產環境中,AUTH_SECRET 是必填的環境變數 - 如果未設定,NextAuth.js 將會拋出錯誤。如需更多詳細資訊,請參閱 MissingSecretError

如果您需要覆寫供應商的預設值,您仍然可以像以前一樣將其作為函式 GitHub({...}) 呼叫。

延遲初始化

您也可以延遲初始化 NextAuth.js(先前稱為進階初始化),這讓您可以在某些情況下存取組態中的請求內容,例如在路由處理常式、中介軟體、API 路由或 getServerSideProps 中。上述範例會變成

auth.ts
import NextAuth from "next-auth"
import GitHub from "next-auth/providers/github"
export const { handlers, auth } = NextAuth(req => {
 if (req) {
  console.log(req) // do something with the request
 }
 return { providers: [ GitHub ] }
})
💡

如果您想要根據請求自訂組態,例如在暫存/開發環境中新增不同的供應商,這會很有用。

AuthError

所有 Auth.js 錯誤的基本錯誤類別。它經過最佳化,可以透過 logger.error 選項以格式良好的方式在伺服器記錄中列印。

繼承

建構函式

new AuthError(message, errorOptions)

new AuthError(message?, errorOptions?): AuthError
參數
參數類型
message?string | ErrorOptions
errorOptions?ErrorOptions
回傳值

AuthError

覆寫

Error.constructor

屬性

cause?

optional cause: Record<string, unknown> & {
  err: Error;
};
類型宣告
err?
optional err: Error;
覆寫

Error.cause

message

message: string;
繼承自

Error.message

name

name: string;
繼承自

Error.name

stack?

optional stack: string;
繼承自

Error.stack

type

type: ErrorType;

錯誤類型。用於在記錄中識別錯誤。

prepareStackTrace()?

static optional prepareStackTrace: (err, stackTraces) => any;

堆疊追蹤格式化的可選覆寫

參見

https://v8.dev.org.tw/docs/stack-trace-api#customizing-stack-traces

參數
參數類型
errError
stackTracesCallSite[]
返回值

any

繼承自

Error.prepareStackTrace

stackTraceLimit

static stackTraceLimit: number;
繼承自

Error.stackTraceLimit

方法

captureStackTrace()

static captureStackTrace(targetObject, constructorOpt?): void

在目標物件上建立 .stack 屬性

參數
參數類型
targetObjectobject
constructorOpt?Function
返回值

void

繼承自

Error.captureStackTrace


CredentialsSignin

可以從 Credentials 提供者的 authorize 回調中拋出。當 authorize 回調期間發生錯誤時,可能會發生兩種情況

  1. 使用者會被重新導向至登入頁面,網址中會帶有 error=CredentialsSignin&code=credentialscode 是可設定的。
  2. 如果您在伺服器端處理表單動作的框架中拋出此錯誤,則會拋出此錯誤,而不是重新導向使用者,因此您需要進行處理。

繼承自

建構子

new CredentialsSignin(message, errorOptions)

new CredentialsSignin(message?, errorOptions?): CredentialsSignin
參數
參數類型
message?string | ErrorOptions
errorOptions?ErrorOptions
返回值

CredentialsSignin

繼承自

SignInError.constructor

屬性

cause?

optional cause: Record<string, unknown> & {
  err: Error;
};
類型宣告
err?
optional err: Error;
繼承自

SignInError.cause

code

code: string;

錯誤代碼,會設定在重新導向 URL 的 code 查詢參數中。

⚠ 注意:此屬性將會包含在 URL 中,請確保它不會暗示敏感錯誤。

如果您需要除錯,完整的錯誤始終會記錄在伺服器上。

一般而言,我們不建議明確提示使用者是否輸入了錯誤的使用者名稱或密碼,請嘗試使用類似「無效的憑證」之類的提示。

message

message: string;
繼承自

SignInError.message

name

name: string;
繼承自

SignInError.name

stack?

optional stack: string;
繼承自

SignInError.stack

type

type: ErrorType;

錯誤類型。用於在記錄中識別錯誤。

繼承自

SignInError.type

kind

static kind: string;
繼承自

SignInError.kind

prepareStackTrace()?

static optional prepareStackTrace: (err, stackTraces) => any;

堆疊追蹤格式化的可選覆寫

參見

https://v8.dev.org.tw/docs/stack-trace-api#customizing-stack-traces

參數
參數類型
errError
stackTracesCallSite[]
返回值

any

繼承自

SignInError.prepareStackTrace

stackTraceLimit

static stackTraceLimit: number;
繼承自

SignInError.stackTraceLimit

type

static type: string;

方法

captureStackTrace()

static captureStackTrace(targetObject, constructorOpt?): void

在目標物件上建立 .stack 屬性

參數
參數類型
targetObjectobject
constructorOpt?Function
返回值

void

繼承自

SignInError.captureStackTrace


帳戶

通常包含有關所使用提供者的資訊,並且還擴展了 TokenSet,這是在 OAuth 提供者返回的不同令牌。

繼承自

屬性

access_token?

optional readonly access_token: string;
繼承自

Partial.access_token

authorization_details?

optional readonly authorization_details: AuthorizationDetails[];
繼承自

Partial.authorization_details

expires_at?

optional expires_at: number;

根據 TokenEndpointResponse.expires_in 計算的值。

這是 TokenEndpointResponse.access_token 過期的絕對時間戳記(以秒為單位)。

此值可用於與 TokenEndpointResponse.refresh_token 一起實作令牌輪換。

參見

expires_in?

optional readonly expires_in: number;
繼承自

Partial.expires_in

id_token?

optional readonly id_token: string;
繼承自

Partial.id_token

provider

provider: string;

此帳戶的提供者 ID。例如「google」。請參閱 https://authjs.dev.org.tw/reference/core/providers 的完整清單

providerAccountId

providerAccountId: string;

此值取決於用於建立帳戶的提供者類型。

  • oauth/oidc:OAuth 帳戶的 ID,從 profile() 回調中返回。
  • email:使用者的電子郵件地址。
  • credentials: 從 authorize() 回調中返回的 id

refresh_token?

optional readonly refresh_token: string;
繼承自

Partial.refresh_token

scope?

optional readonly scope: string;
繼承自

Partial.scope

token_type?

optional readonly token_type: Lowercase<string>;

注意:因為值不區分大小寫,所以總是會以小寫形式返回

繼承自

Partial.token_type

type

type: ProviderType;

此帳戶的供應商類型

userId?

optional userId: string;

此帳戶所屬使用者的 ID

參見

https://authjs.dev.org.tw/reference/core/adapters#adapteruser


DefaultSession

擴展自

屬性

expires

expires: string;

user?

optional user: User;

NextAuthConfig

設定 NextAuth.js。

擴展自

屬性

adapter?

optional adapter: Adapter;

您可以使用 adapter 選項傳入您的資料庫轉接器。

繼承自

Omit.adapter

basePath?

optional basePath: string;

Auth.js API 端點的基本路徑。

預設值
"/api/auth" in "next-auth"; "/auth" with all other frameworks
繼承自

Omit.basePath

callbacks?

optional callbacks: {
  jwt: (params) => Awaitable<null | JWT>;
  redirect: (params) => Awaitable<string>;
  session: (params) => Awaitable<Session | DefaultSession>;
  signIn: (params) => Awaitable<string | boolean>;
  } & {
  authorized: (params) => any;
};

回呼是異步函式,您可以使用它們來控制執行與驗證相關的動作時會發生什麼。回呼允許您在沒有資料庫的情況下實作存取控制與外部資料庫或 API 整合

類型宣告
jwt()?
optional jwt: (params) => Awaitable<null | JWT>;

每當建立 JSON Web Token (即在登入時) 或更新 (即每當在用戶端存取工作階段時) 時,都會呼叫此回呼。您在這裡返回的任何內容都會儲存在 JWT 中,並轉發到工作階段回呼。您可以在那裡控制應返回給用戶端的內容。任何其他內容都會從您的前端保留。JWT 預設會透過您的 AUTH_SECRET 環境變數加密。

session 回呼

參數
參數類型描述
params物件-
params.account?null | Account包含有關用於登入的提供者的資訊。
還包含 TokenSet

注意
trigger"signIn""signUp" 時可用
params.isNewUser?布林值已棄用
改用 trigger === "signUp"
params.profile?Profile從您的提供者返回的 OAuth 設定檔。
(如果為 OIDC,它將是已解碼的 ID Token 或 /userinfo 回應)

注意
trigger"signIn" 時可用。
params.session?any當使用 AuthConfig.session strategy: "jwt" 時,這是資料
從用戶端透過 useSession().update 方法傳送。

⚠ 注意,您應該在使用此資料之前驗證它。
params.tokenJWTtrigger"signIn""signUp" 時,它將是 JWT 的子集,
將會包含 nameemailimage

否則,對於後續呼叫,它將是完整的 JWT
params.trigger?"signIn" | "update" | "signUp"檢查為何叫用 jwt 回呼。可能的原因是
- 使用者登入:第一次叫用回呼時,將會存在 userprofileaccount
- 使用者註冊:第一次在資料庫中建立使用者 (當 AuthConfig.session.strategy 設定為 "database" 時)
- 更新事件:由 useSession().update 方法觸發。
如果屬於後者,則 trigger 將會是 undefined
params.userAdapterUser | UserOAuthConfig.profile 或 CredentialsConfig.authorize 回呼的結果。

注意
trigger"signIn""signUp" 時可用。

資源
- 憑證提供者
- 使用者資料庫模型
傳回值

Awaitable<null | JWT>

redirect()?
optional redirect: (params) => Awaitable<string>;

每當使用者被重新導向至回呼 URL 時 (例如,在登入或登出時),就會呼叫此回呼。預設情況下,僅允許與來源位於同一主機上的 URL。您可以使用此回呼來自訂該行為。

文件

範例
callbacks: {
  async redirect({ url, baseUrl }) {
    // Allows relative callback URLs
    if (url.startsWith("/")) return `${baseUrl}${url}`
 
    // Allows callback URLs on the same origin
    if (new URL(url).origin === baseUrl) return url
 
    return baseUrl
  }
}
參數
參數類型描述
params物件-
params.baseUrl字串網站的預設基本 URL (可用作備用)
params.url字串用戶端作為回呼 URL 提供的 URL
傳回值

Awaitable<string>

session()?
optional session: (params) => Awaitable<Session | DefaultSession>;

每當檢查工作階段時 (即,當叫用 /api/session 端點、使用 useSessiongetSession 時),就會呼叫此回呼。傳回值將會公開給用戶端,因此請小心您在此處傳回的內容!如果您想將您透過 JWT 回呼新增至 Token 的任何內容提供給用戶端,您也必須在此處明確傳回它。

⚠ 預設情況下,為了提高安全性,只會返回 Token 的子集 (電子郵件、姓名、影像)。

token 引數僅在使用 jwt 工作階段策略時可用,而 user 引數僅在使用資料庫工作階段策略時可用。

jwt 回呼

範例
callbacks: {
  async session({ session, token, user }) {
    // Send properties to the client, like an access_token from a provider.
    session.accessToken = token.accessToken
 
    return session
  }
}
參數
參數類型
params{ session: { user: AdapterUser; } & AdapterSession; user: AdapterUser; } & { session: Session; token: JWT; } & { newSession: any; trigger: "update"; }
傳回值

Awaitable<Session | DefaultSession>

signIn()?
optional signIn: (params) => Awaitable<string | boolean>;

控制是否允許使用者登入。返回 true 會繼續登入流程。返回 false 或擲回錯誤會停止登入流程,並將使用者重新導向至錯誤頁面。返回字串會將使用者重新導向至指定的 URL。

未處理的錯誤會擲回 AccessDenied,且訊息設定為原始錯誤。

AccessDenied

範例
callbacks: {
 async signIn({ profile }) {
  // Only allow sign in for users with email addresses ending with "yourdomain.com"
  return profile?.email?.endsWith("@yourdomain.com")
}
參數
參數類型描述
params物件-
params.account?null | Account-
params.credentials?Record<string, CredentialInput>如果使用憑證提供者,則包含使用者憑證
params.email?物件如果使用電子郵件提供者,則在第一次呼叫時,它會包含一個
verificationRequest: true 屬性,以指示它正在驗證請求流程中觸發。
當在使用者按一下登入連結後叫用回呼時,
此屬性將不會存在。您可以檢查 verificationRequest 屬性
避免將電子郵件發送到黑名單上的地址或網域,或僅明確產生允許列表中的電子郵件
適用於允許列表中的電子郵件地址。
params.email.verificationRequest?布林值-
params.profile?Profile如果使用 OAuth 提供者,則包含完整的
由您的提供者傳回的 OAuth 設定檔。
params.userAdapterUser | User-
傳回

Awaitable<string | boolean>

類型宣告
authorized()?
optional authorized: (params) => any;

當使用者需要授權時,使用 中介層 時會調用。

您可以透過傳回 NextResponse 來覆寫此行為。

範例
app/auth.ts
async authorized({ request, auth }) {
  const url = request.nextUrl
 
  if(request.method === "POST") {
    const { authToken } = (await request.json()) ?? {}
    // If the request has a valid auth token, it is authorized
    const valid = await validateAuthToken(authToken)
    if(valid) return true
    return NextResponse.json("Invalid auth token", { status: 401 })
  }
 
  // Logged in users are authenticated, otherwise redirect to login page
  return !!auth.user
}
⚠️

如果您要傳回重新導向回應,請確保您要重新導向的頁面不受此回呼保護,否則您可能會陷入無限重新導向迴圈。

參數
參數類型描述
params物件-
params.authnull | Session已驗證的使用者或權杖 (如果有的話)。
params.requestNextRequest要授權的請求。
傳回

any

覆寫

Omit.callbacks

cookies?

optional cookies: Partial<CookiesOptions>;

您可以覆寫 Auth.js 所使用的任何 Cookie 的預設 Cookie 名稱和選項。您可以指定一個或多個具有自訂屬性的 Cookie,遺失的選項將使用 Auth.js 定義的預設值。如果您使用此功能,您可能會想要建立條件行為,以支援在開發和生產版本中設定不同的 Cookie 政策,因為您將選擇退出內建的動態政策。

  • 這是一個進階選項。進階選項的傳遞方式與基本選項相同,但可能會有複雜的影響或副作用。您應該盡量避免使用進階選項,除非您非常熟悉它們的使用方式。
預設
{}
繼承自

Omit.cookies

debug?

optional debug: boolean;

將 debug 設定為 true 可啟用驗證和資料庫操作的除錯訊息。

預設
false
繼承自

Omit.debug

events?

optional events: {
  createUser: (message) => Awaitable<void>;
  linkAccount: (message) => Awaitable<void>;
  session: (message) => Awaitable<void>;
  signIn: (message) => Awaitable<void>;
  signOut: (message) => Awaitable<void>;
  updateUser: (message) => Awaitable<void>;
};

事件是不會傳回回應的非同步函式,它們對於稽核記錄很有用。您可以為以下任何事件指定處理常式,例如用於除錯或建立稽核記錄。訊息物件的內容會根據流程 (例如 OAuth 或電子郵件驗證流程、JWT 或資料庫工作階段等) 而有所不同,但通常包含使用者物件和/或 JSON Web 權杖的內容以及與事件相關的其他資訊。

預設
{}
createUser()?
optional createUser: (message) => Awaitable<void>;
參數
參數類型
message物件
message.userUser
傳回

Awaitable<void>

linkAccount()?
optional linkAccount: (message) => Awaitable<void>;
參數
參數類型
message物件
message.accountAccount
message.profileAdapterUser | User
message.userAdapterUser | User
傳回

Awaitable<void>

session()?
optional session: (message) => Awaitable<void>;

訊息物件將包含以下其中一項,具體取決於您是否使用 JWT 或資料庫持續性工作階段

  • token: 此工作階段的 JWT。
  • session: 來自您轉接器的工作階段物件。
參數
參數類型
message物件
message.sessionSession
message.tokenJWT
傳回

Awaitable<void>

signIn()?
optional signIn: (message) => Awaitable<void>;

如果使用 credentials 類型驗證,則使用者是來自您憑證提供者的原始回應。對於其他提供者,您將從您的轉接器取得 User 物件、帳戶,以及使用者是否為您的轉接器的新使用者的指示。

參數
參數類型
message物件
message.account?null | Account
message.isNewUser?布林值
message.profile?Profile
message.userUser
傳回

Awaitable<void>

signOut()?
optional signOut: (message) => Awaitable<void>;

訊息物件將包含以下其中一項,具體取決於您是否使用 JWT 或資料庫持續性工作階段

  • token: 此工作階段的 JWT。
  • session: 來自您轉接器且正在結束的工作階段物件。
參數
參數類型
message{ session: undefined | null | void | AdapterSession; } | { token: null | JWT; }
傳回

Awaitable<void>

updateUser()?
optional updateUser: (message) => Awaitable<void>;
參數
參數類型
message物件
message.userUser
傳回

Awaitable<void>

繼承自

Omit.events

experimental?

optional experimental: {
  enableWebAuthn: boolean;
};

使用此選項可啟用實驗性功能。啟用後,它會在主控台中列印警告訊息。

注意

無法保證實驗性功能的穩定性,可能會在不另行通知的情況下變更或移除。請謹慎使用。

預設
{}
enableWebAuthn?
optional enableWebAuthn: boolean;

啟用 WebAuthn 支援。

預設
false
繼承自

Omit.experimental

jwt?

optional jwt: Partial<JWTOptions>;

如果您未指定 AuthConfig.adapter,則預設會啟用 JSON Web 權杖。JSON Web 權杖預設為加密 (JWE)。我們建議您保持此行為。

繼承自

Omit.jwt

logger?

optional logger: Partial<LoggerInstance>;

覆寫任何記錄器層級 ( undefined 層級將使用內建記錄器),並攔截 NextAuth 中的記錄。您可以使用此選項將 NextAuth 記錄傳送到第三方記錄服務。

範例
// /auth.ts
import log from "logging-service"
 
export const { handlers, auth, signIn, signOut } = NextAuth({
  logger: {
    error(code, ...message) {
      log.error(code, message)
    },
    warn(code, ...message) {
      log.warn(code, message)
    },
    debug(code, ...message) {
      log.debug(code, message)
    }
  }
})
預設
console
繼承自

Omit.logger

pages?

optional pages: Partial<PagesOptions>;

如果您想要建立自訂登入、登出和錯誤頁面,請指定要使用的 URL。指定的頁面將覆寫對應的內建頁面。

預設
{}
範例
  pages: {
    signIn: '/auth/signin',
    signOut: '/auth/signout',
    error: '/auth/error',
    verifyRequest: '/auth/verify-request',
    newUser: '/auth/new-user'
  }
繼承自

Omit.pages

providers

providers: Provider[];

用於登入的驗證提供者清單 (例如 Google、Facebook、Twitter、GitHub、電子郵件等),順序不拘。這可以是內建提供者之一,也可以是具有自訂提供者的物件。

預設
[]
繼承自

Omit.providers

redirectProxyUrl?

optional redirectProxyUrl: string;

設定後,在 OAuth 登入流程期間,授權請求的 redirect_uri 將根據此值設定。

如果您的 OAuth 提供者僅支援單一 redirect_uri,或者您想要在預覽 URL (例如 Vercel) 上使用 OAuth,這會很有用,因為您事先不知道最終的部署 URL。

URL 需要包含直到 Auth.js 初始化位置的完整路徑。

注意

這將在提供者上自動啟用 state OAuth2Config.checks。

範例
"https://authjs.example.com/api/auth"

您也可以個別為每個提供者覆寫此設定。

範例
GitHub({
  ...
  redirectProxyUrl: "https://github.example.com/api/auth"
})
預設

AUTH_REDIRECT_PROXY_URL 環境變數

另請參閱:指南:保護預覽部署

繼承自

Omit.redirectProxyUrl

secret?

optional secret: string | string[];

用於雜湊權杖、簽署 Cookie 和產生加密金鑰的隨機字串。

要產生隨機字串,您可以使用 Auth.js CLI:npx auth secret

注意

您也可以傳遞一個密鑰陣列,在這種情況下,將會使用第一個成功解密 JWT 的密鑰。這對於在不使現有會話失效的情況下輪換密鑰非常有用。較新的密鑰應該添加到陣列的開頭,這將用於所有新的會話。

繼承自

Omit.secret

session?

optional session: {
  generateSessionToken: () => string;
  maxAge: number;
  strategy: "jwt" | "database";
  updateAge: number;
};

設定您的會話,例如是否要使用 JWT 或資料庫,閒置會話過期的時間,或者在您使用資料庫的情況下限制寫入操作。

generateSessionToken()?
optional generateSessionToken: () => string;

為基於資料庫的會話產生自訂會話令牌。預設情況下,根據 Node.js 版本產生隨機 UUID 或字串。但是,您可以指定要使用的自訂字串(例如 CUID)。

預設值

randomUUIDrandomBytes.toHex,取決於 Node.js 版本

回傳值

字串

maxAge?
optional maxAge: number;

從現在起算,以秒為單位的相對時間,會話將在此時間到期

預設值
2592000 // 30 days
strategy?
optional strategy: "jwt" | "database";

選擇您要如何儲存使用者會話。預設值為 "jwt",即會話 Cookie 中加密的 JWT (JWE)。

但是,如果您使用 adapter,我們會將其預設為 "database"。您仍然可以透過明確定義 "jwt" 來強制使用 JWT 會話。

當使用 "database" 時,會話 Cookie 將僅包含 sessionToken 值,該值用於在資料庫中查找會話。

文件 | Adapter | 關於 JSON Web Tokens

updateAge?
optional updateAge: number;

會話應該多久更新一次,以秒為單位。如果設定為 0,則每次都會更新會話。

預設值
86400 // 1 day
繼承自

Omit.session

skipCSRFCheck?

optional skipCSRFCheck: typeof skipCSRFCheck;
繼承自

Omit.skipCSRFCheck

theme?

optional theme: Theme;

變更內建 AuthConfig.pages 的主題。

繼承自

Omit.theme

trustHost?

optional trustHost: boolean;

Auth.js 依賴傳入請求的 host 標頭才能正常運作。因此,此屬性需要設定為 true

請確保您的部署平台安全地設定了 host 標頭。

官方基於 Auth.js 的函式庫將嘗試為某些已知會安全設定 host 標頭的部署平台(例如:Vercel)自動設定此值。

繼承自

Omit.trustHost

useSecureCookies?

optional useSecureCookies: boolean;

當設定為 true 時,NextAuth.js 設定的所有 Cookie 將只能從 HTTPS URL 存取。為了方便開發人員,對於以 http:// 開頭的 URL(例如 https://127.0.0.1:3000),此選項預設為 false。您可以手動將此選項設定為 false 以停用此安全性功能,並允許從非安全 URL 存取 Cookie(不建議這樣做)。

  • 這是一個進階選項。進階選項的傳遞方式與基本選項相同,但可能會有複雜的影響或副作用。您應該盡量避免使用進階選項,除非您非常熟悉它們的使用方式。

預設值為 HTTP 的 false 和 HTTPS 網站的 true

繼承自

Omit.useSecureCookies


NextAuthResult

使用 NextAuthConfig 初始化的 NextAuth 的調用結果。它包含在您的 Next.js 應用程式中設定和與 NextAuth.js 互動的方法。

屬性

auth

auth: (...args) => Promise<null | Session> & (...args) => Promise<null | Session> & (...args) => Promise<null | Session> & (...args) => AppRouteHandlerFn;

在您的 Next.js 應用程式中與 NextAuth.js 互動的通用方法。在 auth.ts 中初始化 NextAuth.js 後,請在 Middleware、伺服器元件、路由處理程式(app/)和 Edge 或 Node.js API 路由(pages/)中使用此方法。

在 Middleware 中

auth 新增至您的 Middleware 是選用的,但建議保持使用者會話的存活。

驗證由 callbacks.authorized 回呼完成。

範例
middleware.ts
export { auth as middleware } from "./auth"

或者,您可以使用 auth 包裝您自己的 middleware,其中 req 會擴充 auth

範例
middleware.ts
import { auth } from "./auth"
export default auth((req) => {
  // req.auth
})
// Optionally, don't invoke Middleware on some paths
// Read more: https://nextjs.dev.org.tw/docs/app/building-your-application/routing/middleware#matcher
export const config = {
  matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"],
}

在伺服器元件中

範例
app/page.ts
import { auth } from "../auth"
 
export default async function Page() {
  const { user } = await auth()
  return <p>Hello {user?.name}</p>
}

在路由處理程式中

範例
app/api/route.ts
import { auth } from "../../auth"
 
export const POST = auth((req) => {
  // req.auth
})

在 Edge API 路由中

範例
pages/api/protected.ts
import { auth } from "../../auth"
 
export default auth((req) => {
  // req.auth
})
 
export const config = { runtime: "edge" }

在 API 路由中

範例
pages/api/protected.ts
import { auth } from "../auth"
import type { NextApiRequest, NextApiResponse } from "next"
 
export default async (req: NextApiRequest, res: NextApiResponse) => {
  const session = await auth(req, res)
  if (session) {
    // Do something with the session
    return res.json("This is protected content.")
  }
  res.status(401).json("You must be signed in.")
}

getServerSideProps

範例
pages/protected-ssr.ts
import { auth } from "../auth"
 
export const getServerSideProps: GetServerSideProps = async (context) => {
  const session = await auth(context)
 
  if (session) {
    // Do something with the session
    return { props: { session, content: (await res.json()).content } }
  }
 
  return { props: {} }
}

handlers

handlers: AppRouteHandlers;

NextAuth.js 路由處理程式方法。這些方法用於公開 OAuth/Email 提供者的端點,以及可以從客戶端聯絡的 REST API 端點(例如 /api/auth/session)。

auth.ts 中初始化 NextAuth.js 後,重新匯出這些方法。

app/api/auth/[...nextauth]/route.ts

app/api/auth/[...nextauth]/route.ts
export { GET, POST } from "../../../../auth"
export const runtime = "edge" // optional

然後是 auth.ts

auth.ts
// ...
export const { handlers: { GET, POST }, auth } = NextAuth({...})

signIn()

signIn: <P, R>(provider?, options?, authorizationParams?) => Promise<R extends false ? any : never>;

使用提供者登入。如果未指定任何提供者,使用者將被重新導向至登入頁面。

預設情況下,使用者會在登入後被重新導向至目前頁面。您可以透過使用相對路徑設定 redirectTo 選項來覆寫此行為。

範例
app/layout.tsx
import { signIn } from "../auth"
 
export default function Layout() {
 return (
  <form action={async () => {
    "use server"
    await signIn("github")
  }}>
   <button>Sign in with GitHub</button>
  </form>
)

如果在登入期間發生錯誤,將會拋出 AuthError 的實例。您可以像這樣捕獲它

app/layout.tsx
import { AuthError } from "next-auth"
import { signIn } from "../auth"
 
export default function Layout() {
 return (
   <form action={async (formData) => {
     "use server"
     try {
       await signIn("credentials", formData)
    } catch(error) {
      if (error instanceof AuthError) // Handle auth errors
      throw error // Rethrow all other errors
    }
   }}>
    <button>Sign in</button>
  </form>
 )
}
類型參數
類型參數
P extends BuiltInProviderType | string & {}-
R extends booleantrue
參數
參數類型描述
provider?P要登入的提供者
options?FormData | { redirect: R; redirectTo: string; } & Record<string, any>-
authorizationParams?string | Record<string, string> | URLSearchParams | string[][]-
回傳值

Promise<R extends false ? any : never>

signOut()

signOut: <R>(options?) => Promise<R extends false ? any : never>;

登出使用者。如果會話是使用資料庫策略建立的,則會話將從資料庫中移除,並且相關的 cookie 將失效。如果會話是使用 JWT 建立的,則 cookie 將失效。

預設情況下,使用者登出後會被重新導向到目前頁面。您可以透過設定 redirectTo 選項為相對路徑來覆寫此行為。

範例
app/layout.tsx
import { signOut } from "../auth"
 
export default function Layout() {
 return (
  <form action={async () => {
    "use server"
    await signOut()
  }}>
   <button>Sign out</button>
  </form>
)
類型參數
類型參數
R extends booleantrue
參數
參數類型描述
options?物件-
options.redirect?R如果設定為 falsesignOut 方法將會回傳重新導向的 URL,而不是自動重新導向。
options.redirectTo?字串登出後重新導向的相對路徑。預設情況下,使用者會被重新導向到目前頁面。
回傳值

Promise<R extends false ? any : never>

unstable_update()

unstable_update: (data) => Promise<null | Session>;
參數
參數類型
dataPartial<Session | { user: Partial<undefined | User>; }>
回傳值

Promise<null | Session>


個人資料

從您的 OAuth 提供者返回的使用者資訊。

參見

https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims

可索引

[claim: string]: unknown

屬性

address?

optional address: null | {
  country: null | string;
  formatted: null | string;
  locality: null | string;
  postal_code: null | string;
  region: null | string;
  street_address: null | string;
};

birthdate?

optional birthdate: null | string;

email?

optional email: null | string;

email_verified?

optional email_verified: null | boolean;

family_name?

optional family_name: null | string;

gender?

optional gender: null | string;

given_name?

optional given_name: null | string;

id?

optional id: null | string;

locale?

optional locale: null | string;

middle_name?

optional middle_name: null | string;

name?

optional name: null | string;

nickname?

optional nickname: null | string;

phone_number?

optional phone_number: null | string;

picture?

optional picture: any;

preferred_username?

optional preferred_username: null | string;

profile?

optional profile: null | string;

sub?

optional sub: null | string;

updated_at?

optional updated_at: null | string | number | Date;

website?

optional website: null | string;

zoneinfo?

optional zoneinfo: null | string;

會話

已登入使用者的有效會話。

繼承自

屬性

expires

expires: string;
繼承自

DefaultSession.expires

user?

optional user: User;
繼承自

DefaultSession.user


使用者

OAuth 提供者的 profile 回呼中返回的物件形狀,可在 jwtsession 回呼中取得,或是在使用資料庫時,可在 session 回呼的第二個參數中取得。

擴展自

屬性

email?

optional email: null | string;

id?

optional id: string;

image?

optional image: null | string;

name?

optional name: null | string;

customFetch

const customFetch: unique symbol;
🚫

此選項允許您覆寫提供者用來直接向提供者的 OAuth 端點發出請求的預設 fetch 函式。如果使用不當,可能會產生安全隱患。

它可以用來支援企業代理伺服器、自訂 fetch 函式庫、快取探索端點、為測試新增模擬、記錄、為不符合規格的提供者設定自訂標頭/參數等等。

範例

import { Auth, customFetch } from "@auth/core"
import GitHub from "@auth/core/providers/github"
 
const dispatcher = new ProxyAgent("my.proxy.server")
function proxy(...args: Parameters<typeof fetch>): ReturnType<typeof fetch> {
  return undici(args[0], { ...(args[1] ?? {}), dispatcher })
}
 
const response = await Auth(request, {
  providers: [GitHub({ [customFetch]: proxy })]
})

參見


default()

default(config): NextAuthResult

初始化 NextAuth.js。

參數

參數類型
configNextAuthConfig | (request) => Awaitable<NextAuthConfig>

回傳值

NextAuthResult

範例

auth.ts
import NextAuth from "next-auth"
import GitHub from "@auth/core/providers/github"
 
export const { handlers, auth } = NextAuth({ providers: [GitHub] })

延遲初始化

範例

auth.ts
import NextAuth from "next-auth"
import GitHub from "@auth/core/providers/github"
 
export const { handlers, auth } = NextAuth(async (req) => {
  console.log(req) // do something with the request
  return {
    providers: [GitHub],
  },
})
Auth.js © Balázs Orbán 與團隊 -2024