next-auth
如果您想要從 v4 遷移,請訪問升級指南 (v5)。
安裝
npm install next-auth@beta
環境變數推斷
自 v4 以來,已推斷出 NEXTAUTH_URL
和 NEXTAUTH_SECRET
。
由於 NextAuth.js v5 也可以自動推斷以 AUTH_
為字首的環境變數。
例如,AUTH_GITHUB_ID
和 AUTH_GITHUB_SECRET
將會被用作 GitHub 供應商的 clientId
和 clientSecret
選項。
環境變數名稱推斷針對 OAuth 供應商具有以下格式:AUTH_{PROVIDER}_{ID|SECRET}
。
PROVIDER
是供應商 ID 的大寫蛇形命名法版本,後面接著 ID
或 SECRET
。
為了保持一致性,AUTH_SECRET
和 AUTH_URL
也分別為 NEXTAUTH_SECRET
和 NEXTAUTH_URL
的別名。
若要將社群登入新增到您的應用程式,組態會變成
import NextAuth from "next-auth"
import GitHub from "next-auth/providers/github"
export const { handlers, auth } = NextAuth({ providers: [ GitHub ] })
以及 .env.local
檔案
AUTH_GITHUB_ID=...
AUTH_GITHUB_SECRET=...
AUTH_SECRET=...
在生產環境中,AUTH_SECRET
是必填的環境變數 - 如果未設定,NextAuth.js 將會拋出錯誤。如需更多詳細資訊,請參閱 MissingSecretError。
如果您需要覆寫供應商的預設值,您仍然可以像以前一樣將其作為函式 GitHub({...})
呼叫。
延遲初始化
您也可以延遲初始化 NextAuth.js(先前稱為進階初始化),這讓您可以在某些情況下存取組態中的請求內容,例如在路由處理常式、中介軟體、API 路由或 getServerSideProps
中。上述範例會變成
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 |
回傳值
覆寫
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
參數
參數 | 類型 |
---|---|
err | Error |
stackTraces | CallSite [] |
返回值
any
繼承自
Error.prepareStackTrace
stackTraceLimit
static stackTraceLimit: number;
繼承自
Error.stackTraceLimit
方法
captureStackTrace()
static captureStackTrace(targetObject, constructorOpt?): void
在目標物件上建立 .stack 屬性
參數
參數 | 類型 |
---|---|
targetObject | object |
constructorOpt ? | Function |
返回值
void
繼承自
Error.captureStackTrace
CredentialsSignin
可以從 Credentials 提供者的 authorize
回調中拋出。當 authorize
回調期間發生錯誤時,可能會發生兩種情況
- 使用者會被重新導向至登入頁面,網址中會帶有
error=CredentialsSignin&code=credentials
。code
是可設定的。 - 如果您在伺服器端處理表單動作的框架中拋出此錯誤,則會拋出此錯誤,而不是重新導向使用者,因此您需要進行處理。
繼承自
建構子
new CredentialsSignin(message, errorOptions)
new CredentialsSignin(message?, errorOptions?): CredentialsSignin
參數
參數 | 類型 |
---|---|
message ? | string | ErrorOptions |
errorOptions ? | ErrorOptions |
返回值
繼承自
屬性
cause?
optional cause: Record<string, unknown> & {
err: Error;
};
類型宣告
err?
optional err: Error;
繼承自
code
code: string;
錯誤代碼,會設定在重新導向 URL 的 code
查詢參數中。
⚠ 注意:此屬性將會包含在 URL 中,請確保它不會暗示敏感錯誤。
如果您需要除錯,完整的錯誤始終會記錄在伺服器上。
一般而言,我們不建議明確提示使用者是否輸入了錯誤的使用者名稱或密碼,請嘗試使用類似「無效的憑證」之類的提示。
message
message: string;
繼承自
name
name: string;
繼承自
stack?
optional stack: string;
繼承自
type
type: ErrorType;
錯誤類型。用於在記錄中識別錯誤。
繼承自
kind
static kind: string;
繼承自
prepareStackTrace()?
static optional prepareStackTrace: (err, stackTraces) => any;
堆疊追蹤格式化的可選覆寫
參見
https://v8.dev.org.tw/docs/stack-trace-api#customizing-stack-traces
參數
參數 | 類型 |
---|---|
err | Error |
stackTraces | CallSite [] |
返回值
any
繼承自
stackTraceLimit
static stackTraceLimit: number;
繼承自
type
static type: string;
方法
captureStackTrace()
static captureStackTrace(targetObject, constructorOpt?): void
在目標物件上建立 .stack 屬性
參數
參數 | 類型 |
---|---|
targetObject | object |
constructorOpt ? | Function |
返回值
void
繼承自
帳戶
通常包含有關所使用提供者的資訊,並且還擴展了 TokenSet
,這是在 OAuth 提供者返回的不同令牌。
繼承自
Partial
<TokenEndpointResponse
>
屬性
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 一起實作令牌輪換。
參見
- https://authjs.dev.org.tw/guides/refresh-token-rotation#database-strategy
- https://www.rfc-editor.org/rfc/rfc6749#section-5.1
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。
擴展自
Omit
<AuthConfig
,"raw"
>
屬性
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 環境變數加密。
參數
參數 | 類型 | 描述 |
---|---|---|
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.token | JWT | 當 trigger 為 "signIn" 或 "signUp" 時,它將是 JWT 的子集,將會包含 name 、email 和 image 。否則,對於後續呼叫,它將是完整的 JWT。 |
params.trigger ? | "signIn" | "update" | "signUp" | 檢查為何叫用 jwt 回呼。可能的原因是 - 使用者登入:第一次叫用回呼時,將會存在 user 、profile 和 account 。- 使用者註冊:第一次在資料庫中建立使用者 (當 AuthConfig.session.strategy 設定為 "database" 時)- 更新事件:由 useSession().update 方法觸發。如果屬於後者,則 trigger 將會是 undefined 。 |
params.user | AdapterUser | User | OAuthConfig.profile 或 CredentialsConfig.authorize 回呼的結果。 注意 當 trigger 為 "signIn" 或 "signUp" 時可用。資源 - 憑證提供者 - 使用者資料庫模型 |
傳回值
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
端點、使用 useSession
或 getSession
時),就會呼叫此回呼。傳回值將會公開給用戶端,因此請小心您在此處傳回的內容!如果您想將您透過 JWT 回呼新增至 Token 的任何內容提供給用戶端,您也必須在此處明確傳回它。
⚠ 預設情況下,為了提高安全性,只會返回 Token 的子集 (電子郵件、姓名、影像)。
token 引數僅在使用 jwt 工作階段策略時可用,而 user 引數僅在使用資料庫工作階段策略時可用。
範例
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
,且訊息設定為原始錯誤。
範例
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.user | AdapterUser | User | - |
傳回
Awaitable
<string
| boolean
>
類型宣告
authorized()?
optional authorized: (params) => any;
當使用者需要授權時,使用 中介層 時會調用。
您可以透過傳回 NextResponse 來覆寫此行為。
範例
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.auth | null | Session | 已驗證的使用者或權杖 (如果有的話)。 |
params.request | NextRequest | 要授權的請求。 |
傳回
any
覆寫
Omit.callbacks
cookies?
optional cookies: Partial<CookiesOptions>;
您可以覆寫 Auth.js 所使用的任何 Cookie 的預設 Cookie 名稱和選項。您可以指定一個或多個具有自訂屬性的 Cookie,遺失的選項將使用 Auth.js 定義的預設值。如果您使用此功能,您可能會想要建立條件行為,以支援在開發和生產版本中設定不同的 Cookie 政策,因為您將選擇退出內建的動態政策。
- ⚠ 這是一個進階選項。進階選項的傳遞方式與基本選項相同,但可能會有複雜的影響或副作用。您應該盡量避免使用進階選項,除非您非常熟悉它們的使用方式。
預設
{}
繼承自
Omit.cookies
debug?
optional debug: boolean;
將 debug 設定為 true 可啟用驗證和資料庫操作的除錯訊息。
- ⚠ 如果您新增了自訂的 AuthConfig.logger,則會忽略此設定。
預設
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.user | User |
傳回
Awaitable
<void
>
linkAccount()?
optional linkAccount: (message) => Awaitable<void>;
參數
參數 | 類型 |
---|---|
message | 物件 |
message.account | Account |
message.profile | AdapterUser | User |
message.user | AdapterUser | User |
傳回
Awaitable
<void
>
session()?
optional session: (message) => Awaitable<void>;
訊息物件將包含以下其中一項,具體取決於您是否使用 JWT 或資料庫持續性工作階段
token
: 此工作階段的 JWT。session
: 來自您轉接器的工作階段物件。
參數
參數 | 類型 |
---|---|
message | 物件 |
message.session | Session |
message.token | JWT |
傳回
Awaitable
<void
>
signIn()?
optional signIn: (message) => Awaitable<void>;
如果使用 credentials
類型驗證,則使用者是來自您憑證提供者的原始回應。對於其他提供者,您將從您的轉接器取得 User 物件、帳戶,以及使用者是否為您的轉接器的新使用者的指示。
參數
參數 | 類型 |
---|---|
message | 物件 |
message.account ? | null | Account |
message.isNewUser ? | 布林值 |
message.profile ? | Profile |
message.user | User |
傳回
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.user | User |
傳回
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)
}
}
})
- ⚠ 設定後,將忽略 AuthConfig.debug 選項
預設
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)。
預設值
randomUUID
或 randomBytes.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 回呼完成。
範例
export { auth as middleware } from "./auth"
或者,您可以使用 auth
包裝您自己的 middleware,其中 req
會擴充 auth
範例
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).*)"],
}
在伺服器元件中
範例
import { auth } from "../auth"
export default async function Page() {
const { user } = await auth()
return <p>Hello {user?.name}</p>
}
在路由處理程式中
範例
import { auth } from "../../auth"
export const POST = auth((req) => {
// req.auth
})
在 Edge API 路由中
範例
import { auth } from "../../auth"
export default auth((req) => {
// req.auth
})
export const config = { runtime: "edge" }
在 API 路由中
範例
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
中
範例
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
中
export { GET, POST } from "../../../../auth"
export const runtime = "edge" // optional
然後是 auth.ts
// ...
export const { handlers: { GET, POST }, auth } = NextAuth({...})
signIn()
signIn: <P, R>(provider?, options?, authorizationParams?) => Promise<R extends false ? any : never>;
使用提供者登入。如果未指定任何提供者,使用者將被重新導向至登入頁面。
預設情況下,使用者會在登入後被重新導向至目前頁面。您可以透過使用相對路徑設定 redirectTo
選項來覆寫此行為。
範例
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 的實例。您可以像這樣捕獲它
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 boolean | true |
參數
參數 | 類型 | 描述 |
---|---|---|
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
選項為相對路徑來覆寫此行為。
範例
import { signOut } from "../auth"
export default function Layout() {
return (
<form action={async () => {
"use server"
await signOut()
}}>
<button>Sign out</button>
</form>
)
類型參數
類型參數 | 值 |
---|---|
R extends boolean | true |
參數
參數 | 類型 | 描述 |
---|---|---|
options ? | 物件 | - |
options.redirect ? | R | 如果設定為 false ,signOut 方法將會回傳重新導向的 URL,而不是自動重新導向。 |
options.redirectTo ? | 字串 | 登出後重新導向的相對路徑。預設情況下,使用者會被重新導向到目前頁面。 |
回傳值
Promise
<R
extends false
? any
: never
>
unstable_update()
unstable_update: (data) => Promise<null | Session>;
參數
參數 | 類型 |
---|---|
data | Partial <Session | { user : Partial <undefined | User >; }> |
回傳值
個人資料
從您的 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;
繼承自
user?
optional user: User;
繼承自
使用者
OAuth 提供者的 profile
回呼中返回的物件形狀,可在 jwt
和 session
回呼中取得,或是在使用資料庫時,可在 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 })]
})
參見
- https://undici.nodejs.org/#/docs/api/ProxyAgent?id=example-basic-proxy-request-with-local-agent-dispatcher
- https://authjs.dev.org.tw/guides/corporate-proxy
default()
default(config): NextAuthResult
初始化 NextAuth.js。
參數
參數 | 類型 |
---|---|
config | NextAuthConfig | (request ) => Awaitable <NextAuthConfig > |
回傳值
範例
import NextAuth from "next-auth"
import GitHub from "@auth/core/providers/github"
export const { handlers, auth } = NextAuth({ providers: [GitHub] })
延遲初始化
範例
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],
},
})