@auth/solid-start
@auth/solid-start
目前為實驗性質。API 在未來將會變更。
SolidStart Auth 是 Auth.js 的官方 SolidStart 整合。它提供了一種簡單的方式,只需幾行程式碼即可將身份驗證添加到您的 SolidStart 應用程式中。
安裝
npm install @auth/core @auth/solid-start
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;
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 | 物件 |
constructorOpt ? | 函式 |
回傳
void
繼承自
Error.captureStackTrace
CredentialsSignin
可以從憑證提供者的 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;
錯誤碼,設定在重新導向網址的 code
查詢參數中。
⚠ 注意:此屬性將包含在網址中,因此請確保它不會暗示敏感的錯誤。
如果需要偵錯,完整的錯誤訊息會始終記錄在伺服器上。
一般來說,我們不建議具體提示使用者是否輸入了錯誤的使用者名稱或密碼,請嘗試使用類似「無效的憑證」之類的訊息。
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 | 物件 |
constructorOpt ? | 函式 |
回傳
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;
個人資料
從您的 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;
};
出生日期?
optional birthdate: null | string;
電子郵件?
optional email: null | string;
電子郵件已驗證?
optional email_verified: null | boolean;
姓氏?
optional family_name: null | string;
性別?
optional gender: null | string;
名字?
optional given_name: null | string;
ID?
optional id: null | string;
地區?
optional locale: null | string;
中間名?
optional middle_name: null | string;
姓名?
optional name: null | string;
暱稱?
optional nickname: null | string;
電話號碼?
optional phone_number: null | string;
圖片?
optional picture: any;
偏好的使用者名稱?
optional preferred_username: null | string;
個人資料?
optional profile: null | string;
子識別碼?
optional sub: null | string;
更新時間?
optional updated_at: null | string | number | Date;
網站?
optional website: null | string;
時區資訊?
optional zoneinfo: null | string;
工作階段
已登入使用者的活動工作階段。
繼承自
屬性
到期時間
expires: string;
繼承自
使用者?
optional user: User;
繼承自
SolidAuthConfig
設定 Auth 方法。
範例
import Auth, { type AuthConfig } from "@auth/core"
export const authConfig: AuthConfig = {...}
const request = new Request("https://example.com")
const response = await AuthHandler(request, authConfig)
參閱
繼承自
屬性
adapter?
optional adapter: Adapter;
您可以使用 adapter 選項來傳入您的資料庫轉接器。
繼承自
basePath?
optional basePath: string;
Auth.js API 端點的基本路徑。
預設值
"/api/auth" in "next-auth"; "/auth" with all other frameworks
繼承自
回呼?
optional callbacks: {
jwt: (params) => Awaitable<null | JWT>;
redirect: (params) => Awaitable<string>;
session: (params) => Awaitable<Session | DefaultSession>;
signIn: (params) => Awaitable<string | boolean>;
};
回呼是異步函式,您可以使用它們來控制執行動作時會發生什麼。回呼非常強大,尤其是在涉及 JSON Web Token 的情況下,因為它們允許您在沒有資料庫的情況下實作存取控制,並與外部資料庫或 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 ? | 個人資料 | 從您的提供者返回的 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 ? | "update" | "signIn" | "signUp" | 檢查為什麼呼叫了 jwt 回呼。可能的原因有 - 使用者登入:第一次呼叫回呼時,將會存在 user 、profile 和 account 。- 使用者註冊:第一次在資料庫中建立使用者(當 AuthConfig.session.strategy 設定為 "database" 時)- 更新事件:由 useSession().update 方法觸發。在後者的情況下, trigger 將為 undefined 。 |
params.user | User | AdapterUser | 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 的子集(電子郵件、姓名、圖片)。
僅在使用 jwt 工作階段策略時才可以使用 token 引數,並且僅在使用資料庫工作階段策略時才可以使用 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 > | 如果使用 Credentials 提供者,則包含使用者憑證 |
params.email ? | 物件 | 如果使用 Email 提供者,在第一次呼叫時,它包含一個verificationRequest: true 屬性,以表明它是在驗證請求流程中觸發的。當使用者點擊登入連結後呼叫回呼時, 此屬性將不會存在。您可以檢查 verificationRequest 屬性以避免將電子郵件傳送至黑名單中的地址或網域,或僅明確地針對允許列表中的電子郵件地址產生。 為了允許列表中的電子郵件地址。 |
params.email.verificationRequest ? | 布林值 | - |
params.profile ? | 個人資料 | 如果使用 OAuth 提供者,則包含您的提供者回傳的完整 OAuth 個人資料。 |
params.user | User | AdapterUser | - |
回傳值
Awaitable
<string
| boolean
>
繼承自
cookies?
optional cookies: Partial<CookiesOptions>;
您可以覆寫 Auth.js 使用的任何 Cookie 的預設 Cookie 名稱和選項。您可以指定一個或多個具有自訂屬性的 Cookie,遺失的選項將使用 Auth.js 定義的預設值。如果您使用此功能,您可能需要建立條件行為,以支援在開發和生產版本中設定不同的 Cookie 原則,因為您將選擇退出內建的動態原則。
- ⚠ 這是一個進階選項。進階選項的傳遞方式與基本選項相同,但可能具有複雜的含義或副作用。除非您非常熟悉它們的使用方式,否則您應該盡量避免使用進階選項。
預設值
{}
繼承自
debug?
optional debug: boolean;
將 debug 設定為 true 以啟用身份驗證和資料庫操作的偵錯訊息。
- ⚠ 如果您新增了自訂 AuthConfig.logger,則此設定將被忽略。
預設值
false
繼承自
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 Token 的內容以及與事件相關的其他資訊。
預設值
{}
createUser()?
optional createUser: (message) => Awaitable<void>;
參數
參數 | 類型 |
---|---|
message | 物件 |
message.user | 使用者 |
回傳值
Awaitable
<void
>
linkAccount()?
optional linkAccount: (message) => Awaitable<void>;
參數
參數 | 類型 |
---|---|
message | 物件 |
message.account | 帳戶 |
message.profile | User | AdapterUser |
message.user | User | AdapterUser |
回傳值
Awaitable
<void
>
session()?
optional session: (message) => Awaitable<void>;
訊息物件將包含以下其中一項,具體取決於您是否使用 JWT 或資料庫持續會話
token
:此會話的 JWT。session
:來自您的配接器的會話物件。
參數
參數 | 類型 |
---|---|
message | 物件 |
message.session | 會話 |
message.token | JWT |
回傳值
Awaitable
<void
>
signIn()?
optional signIn: (message) => Awaitable<void>;
如果使用 credentials
類型的驗證,使用者是來自您的憑證提供者的原始回應。對於其他提供者,您將從配接器取得 User 物件、帳戶,以及使用者是否是配接器的新使用者的指示。
參數
參數 | 類型 |
---|---|
message | 物件 |
message.account ? | null | Account |
message.isNewUser ? | 布林值 |
message.profile ? | 個人資料 |
message.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 | 使用者 |
回傳值
Awaitable
<void
>
繼承自
experimental?
optional experimental: {
enableWebAuthn: boolean;
};
使用此選項啟用實驗性功能。啟用後,它會在主控台中印出警告訊息。
注意
不保證實驗性功能穩定,可能會變更或移除,恕不另行通知。請謹慎使用。
預設值
{}
enableWebAuthn?
optional enableWebAuthn: boolean;
啟用 WebAuthn 支援。
預設值
false
繼承自
jwt?
optional jwt: Partial<JWTOptions>;
如果您未指定 AuthConfig.adapter,則預設會啟用 JSON Web Tokens。預設情況下,JSON Web Token 會加密 (JWE)。我們建議您保持此行為。
繼承自
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
繼承自
頁面?
optional pages: Partial<PagesOptions>;
如果您想建立自訂的登入、登出和錯誤頁面,請指定要使用的 URL。指定的頁面將覆蓋對應的內建頁面。
預設值
{}
範例
pages: {
signIn: '/auth/signin',
signOut: '/auth/signout',
error: '/auth/error',
verifyRequest: '/auth/verify-request',
newUser: '/auth/new-user'
}
繼承自
前綴?
optional prefix: string;
定義驗證路由的基本路徑。
預設值
'/api/auth'
供應商
providers: Provider[];
用於登入的驗證供應商列表(例如 Google、Facebook、Twitter、GitHub、電子郵件等),順序不拘。可以是內建的供應商之一,也可以是具有自訂供應商的物件。
預設值
[]
繼承自
原始資料?
optional raw: typeof raw;
繼承自
重新導向代理 URL?
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
環境變數
另請參閱:指南:保護預覽部署
繼承自
密鑰?
optional secret: string | string[];
用於雜湊權杖、簽署 Cookie 和產生加密金鑰的隨機字串。
若要產生隨機字串,您可以使用 Auth.js CLI:npx auth secret
注意
您也可以傳遞密鑰陣列,在這種情況下,將使用第一個成功解密 JWT 的密鑰。這對於輪換密鑰而不使現有會話失效非常有用。較新的密鑰應新增至陣列的開頭,這將用於所有新會話。
繼承自
會話?
optional session: {
generateSessionToken: () => string;
maxAge: number;
strategy: "jwt" | "database";
updateAge: number;
};
設定您的會話,例如是否要使用 JWT 或資料庫、閒置會話過期前的時間長度,或者在您使用資料庫時限制寫入操作。
generateSessionToken()?
optional generateSessionToken: () => string;
為基於資料庫的會話產生自訂會話權杖。預設情況下,會根據 Node.js 版本產生隨機 UUID 或字串。但是,您可以指定自己的自訂字串(例如 CUID)來使用。
預設值
根據 Node.js 版本,為 randomUUID
或 randomBytes.toHex
返回
字串
最大期限?
optional maxAge: number;
會話過期的時間(從現在開始計算的秒數)
預設值
2592000 // 30 days
策略?
optional strategy: "jwt" | "database";
選擇您想要如何儲存使用者會話。預設值為 "jwt"
,即會話 Cookie 中的加密 JWT (JWE)。
如果您使用 adapter
,則預設值會改為 "database"
。您仍然可以明確定義 "jwt"
來強制使用 JWT 會話。
當使用 "database"
時,會話 Cookie 將僅包含 sessionToken
值,該值用於在資料庫中查找會話。
文件 | 介面卡 | 關於 JSON Web 權杖
更新期限?
optional updateAge: number;
會話應更新的頻率(以秒為單位)。如果設定為 0
,則每次都會更新會話。
預設值
86400 // 1 day
繼承自
跳過 CSRF 檢查?
optional skipCSRFCheck: typeof skipCSRFCheck;
繼承自
主題?
optional theme: Theme;
變更內建 AuthConfig.pages 的主題。
繼承自
信任主機?
optional trustHost: boolean;
Auth.js 依賴傳入請求的 host
標頭來正確運作。因此,此屬性需要設定為 true
。
請確保您的部署平台安全地設定 host
標頭。
官方的基於 Auth.js 的程式庫將嘗試為某些已知可以安全設定 host
標頭的部署平台(例如:Vercel)自動設定此值。
繼承自
使用安全 Cookie?
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
。
繼承自
使用者
在 OAuth 提供者的 profile
回呼中傳回的物件形狀,可在 jwt
和 session
回呼中使用,或在使用資料庫時,作為 session
回呼的第二個參數。
擴展自
屬性
email?
optional email: null | string;
id?
optional id: string;
image?
optional image: null | string;
name?
optional name: null | string;
GetSessionResult
type GetSessionResult: Promise<Session | null>;
customFetch
const customFetch: unique symbol;
此選項可讓您覆寫提供者預設的 fetch
函數,該函數直接用於向提供者的 OAuth 端點發出請求。使用不當可能會產生安全隱患。
它可用於支援公司代理、自訂的 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
SolidAuth()
SolidAuth(config): {
GET: Promise<undefined | Response>;
POST: Promise<undefined | Response>;
}
設定
產生一個驗證密鑰,然後將其設定為環境變數
AUTH_SECRET=your_auth_secret
建立 API 處理器
此範例使用 github,請確保設定以下環境變數
GITHUB_ID=your_github_oauth_id
GITHUB_SECRET=your_github_oauth_secret
// routes/api/auth/[...solidauth].ts
import { SolidAuth, type SolidAuthConfig } from "@auth/solid-start"
import GitHub from "@auth/core/providers/github"
export const authOpts: SolidAuthConfig = {
providers: [
GitHub({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET,
}),
],
debug: false,
}
export const { GET, POST } = SolidAuth(authOpts)
取得目前的 session
import { getSession } from "@auth/solid-start"
import { createServerData$ } from "solid-start/server"
import { authOpts } from "~/routes/api/auth/[...solidauth]"
export const useSession = () => {
return createServerData$(
async (_, { request }) => {
return await getSession(request, authOpts)
},
{ key: () => ["auth_user"] }
)
}
// useSession returns a resource:
const session = useSession()
const loading = session.loading
const user = () => session()?.user
受保護的路由
當使用 SSR 時
當使用 SSR 時,建議建立一個 Protected
元件,該元件將使用 Show
元件觸發 suspense。它應該看起來像這樣
// components/Protected.tsx
import { type Session } from "@auth/core/types";
import { getSession } from "@auth/solid-start";
import { Component, Show } from "solid-js";
import { useRouteData } from "solid-start";
import { createServerData$, redirect } from "solid-start/server";
import { authOpts } from "~/routes/api/auth/[...solidauth]";
const Protected = (Comp: IProtectedComponent) => {
const routeData = () => {
return createServerData$(
async (_, event) => {
const session = await getSession(event.request, authOpts);
if (!session || !session.user) {
throw redirect("/");
}
return session;
},
{ key: () => ["auth_user"] }
);
};
return {
routeData,
Page: () => {
const session = useRouteData<typeof routeData>();
return (
<Show when={session()} keyed>
{(sess) => <Comp {...sess} />}
</Show>
);
},
};
};
type IProtectedComponent = Component<Session>;
export default Protected;
它可以像這樣使用
// routes/protected.tsx
import Protected from "~/components/Protected";
export const { routeData, Page } = Protected((session) => {
return (
<main class="flex flex-col gap-2 items-center">
<h1>This is a protected route</h1>
</main>
);
});
export default Page;
當使用 CSR 時
當使用 CSR 時,Protected
元件將無法如預期運作,並導致畫面閃爍。為了修正此問題,會使用 Solid-Start 中介軟體
// entry-server.tsx
import { Session } from "@auth/core";
import { getSession } from "@auth/solid-start";
import { redirect } from "solid-start";
import {
StartServer,
createHandler,
renderAsync,
} from "solid-start/entry-server";
import { authOpts } from "./routes/api/auth/[...solidauth]";
const protectedPaths = ["/protected"]; // add any route you wish in here
export default createHandler(
({ forward }) => {
return async (event) => {
if (protectedPaths.includes(new URL(event.request.url).pathname)) {
const session = await getSession(event.request, authOpts);
if (!session) {
return redirect("/");
}
}
return forward(event);
};
},
renderAsync((event) => <StartServer event={event} />)
);
現在可以建立受保護的路由
// routes/protected.tsx
export default () => {
return (
<main class="flex flex-col gap-2 items-center">
<h1>This is a protected route</h1>
</main>
);
};
當使用 SSR 時,CSR 方法也應該有效,而當使用 CSR 時,SSR 方法不應該有效
參數
參數 | 類型 |
---|---|
config | SolidAuthConfig |
傳回值
{
GET: Promise<undefined | Response>;
POST: Promise<undefined | Response>;
}
GET()
參數
參數 | 類型 |
---|---|
event | any |
傳回值
POST()
參數
參數 | 類型 |
---|---|
event | any |
傳回值
getSession()
getSession(req, options): GetSessionResult
參數
參數 | 類型 |
---|---|
req | Request |
options | Omit <AuthConfig , "raw" > |