跳至内容
从 NextAuth.js v4 迁移?阅读 我们的迁移指南.
API 参考@auth/solid-start

@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
返回值

AuthError

覆盖

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.node.org.cn/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. 用户将被重定向到登录页面,URL 中包含 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.node.org.cn/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


Account

通常包含有关所用提供者的信息,并且还扩展了 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.oauth.ac.cn/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.oauth.ac.cn/reference/core/adapters#adapteruser


DefaultSession

扩展自

属性

expires

expires: string;

user?

optional user: User;

Profile

从您的 OAuth 提供者返回的用户资料信息。

参见

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

Indexable

[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;

中间名?

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;
继承自

DefaultSession.expires

用户?

optional user: User;
继承自

DefaultSession.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)

参见

初始化

扩展

属性

适配器?

optional adapter: Adapter;

您可以使用适配器选项传入您的数据库适配器。

继承自

AuthConfig.adapter

基本路径?

optional basePath: string;

Auth.js API 端点的基本路径。

默认
"/api/auth" in "next-auth"; "/auth" with all other frameworks
继承自

AuthConfig.basePath

回调?

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

回调是异步函数,您可以使用它们来控制执行操作时发生的事情。回调非常强大,特别是在涉及 JSON Web Tokens 的场景中,因为它们允许您在没有数据库的情况下实现访问控制,以及与外部数据库或 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 令牌或 /userinfo 响应)

注意
trigger"signIn" 时可用。
params.session?any当使用AuthConfig.session strategy: "jwt" 时,这是数据
从客户端通过useSession().update 方法发送。

⚠ 注意,您应该在使用之前验证此数据。
params.tokenJWTtrigger"signIn""signUp" 时,它将是JWT 的子集,
nameemailimage 将被包含。

否则,它将是后续调用的完整JWT
params.trigger?"update" | "signIn" | "signUp"检查 jwt 回调被调用的原因。可能的原因是
- 用户登录:回调第一次被调用,userprofileaccount 将存在。
- 用户注册:在数据库中首次创建用户 (当AuthConfig.session.strategy 设置为"database" 时)。
- 更新事件:由useSession().update 方法触发。
在后者的例子中,trigger 将是undefined
params.userUser | AdapterUserOAuthConfig.profile 或 CredentialsConfig.authorize 回调的结果之一。

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

资源
- 凭证提供者
- 用户数据库模型
返回

Awaitable<null | JWT>

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

每当用户被重定向到回调 URL (即登录或注销) 时,都会调用此回调。默认情况下,仅允许与原始主机相同的 host 上的 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 回调提供给客户端,您也必须在这里显式返回它。

⚠ 默认情况下,出于安全考虑,只会返回令牌的子集 (电子邮件、姓名、图像)。

令牌参数仅在使用 jwt 会话策略时可用,而用户参数仅在使用数据库会话策略时可用。

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.userUser | AdapterUser-
返回

Awaitable<string | boolean>

继承自

AuthConfig.callbacks

cookies?

optional cookies: Partial<CookiesOptions>;

您可以覆盖 Auth.js 使用的任何 cookie 的默认 cookie 名称和选项。您可以使用自定义属性指定一个或多个 cookie,缺少的选项将使用 Auth.js 定义的默认值。如果您使用此功能,您可能希望创建条件行为以支持在开发和生产构建中设置不同的 cookie 策略,因为您将选择退出内置的动态策略。

  • 这是一个高级选项。高级选项的传递方式与基本选项相同,但可能具有复杂的影响或副作用。您应该尽量避免使用高级选项,除非您对使用它们非常熟悉。
默认
{}
继承自

AuthConfig.cookies

debug?

optional debug: boolean;

将 debug 设置为 true 以启用身份验证和数据库操作的调试消息。

默认
false
继承自

AuthConfig.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.profileUser | AdapterUser
message.userUser | AdapterUser
返回

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 类型身份验证,则用户是来自您的凭据提供程序的原始响应。对于其他提供程序,您将从您的适配器获取用户对象、帐户以及用户是否是您适配器的新用户的指示器。

参数
参数类型
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>

继承自

AuthConfig.events

experimental?

optional experimental: {
  enableWebAuthn: boolean;
};

使用此选项启用实验性功能。启用后,它将在控制台中打印一条警告消息。

注意

实验性功能不能保证稳定,可能会更改或在未经通知的情况下删除。请谨慎使用。

默认
{}
enableWebAuthn?
optional enableWebAuthn: boolean;

启用 WebAuthn 支持。

默认
false
继承自

AuthConfig.experimental

jwt?

optional jwt: Partial<JWTOptions>;

如果您没有指定 AuthConfig.adapter,则默认情况下会启用 JSON Web 令牌。JSON Web 令牌默认情况下是加密的 (JWE)。我们建议您保持这种行为。

继承自

AuthConfig.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
继承自

AuthConfig.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'
  }
继承自

AuthConfig.pages

prefix?

optional prefix: string;

定义身份验证路由的基路径。

默认
'/api/auth'

providers

providers: Provider[];

用于登录的身份验证提供程序列表(例如,Google、Facebook、Twitter、GitHub、电子邮件等),以任何顺序。这可以是内置提供程序之一,也可以是包含自定义提供程序的对象。

默认
[]
继承自

AuthConfig.providers

raw?

optional raw: typeof raw;
继承自

AuthConfig.raw

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 环境变量

另请参见:指南:保护预览部署

继承自

AuthConfig.redirectProxyUrl

secret?

optional secret: string | string[];

用于对令牌进行哈希处理、对 Cookie 签名和生成加密密钥的随机字符串。

要生成随机字符串,您可以使用 Auth.js CLI:npx auth secret

注意

您也可以传递一个密钥数组,在这种情况下,第一个成功解密 JWT 的密钥将被使用。这在您需要在不使现有会话失效的情况下轮换密钥时很有用。较新的密钥应添加到数组的开头,它将用于所有新会话。

继承自

AuthConfig.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 值,用于在数据库中查找会话。

文档 | 适配器 | 关于 JSON Web Tokens

updateAge?
optional updateAge: number;

会话应更新的频率(以秒为单位)。如果设置为 0,则每次都会更新会话。

默认
86400 // 1 day
继承自

AuthConfig.session

skipCSRFCheck?

optional skipCSRFCheck: typeof skipCSRFCheck;
继承自

AuthConfig.skipCSRFCheck

theme?

optional theme: Theme;

更改内置 AuthConfig.pages 的主题。

继承自

AuthConfig.theme

trustHost?

optional trustHost: boolean;

Auth.js 依赖于传入请求的 host 标头才能正常工作。为此,此属性需要设置为 true

确保您的部署平台安全地设置 host 标头。

官方基于 Auth.js 的库将尝试自动为一些已知会安全设置 host 标头的部署平台(例如:Vercel)设置此值。

继承自

AuthConfig.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

继承自

AuthConfig.useSecureCookies


用户

OAuth 提供商的 profile 回调中返回对象的形状,在 jwtsession 回调中可用,或者在使用数据库时,是 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;
🚫

此选项允许您覆盖提供商用来直接向提供商的 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 })]
})

参见


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)

获取当前会话

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 组件触发悬念。它应该看起来像这样

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

CSR 方法也应该在使用 SSR 时工作,而 SSR 方法在使用 CSR 时则不应该工作

参数

参数类型
configSolidAuthConfig

返回

{
  GET: Promise<undefined | Response>;
  POST: Promise<undefined | Response>;
}

GET()

参数
参数类型
eventany
返回值

Promise<undefined | Response>

POST()

参数
参数类型
eventany
返回值

Promise<undefined | Response>


getSession()

getSession(req, options): GetSessionResult

参数

参数类型
req请求
optionsOmit<AuthConfig, "raw">

返回值

GetSessionResult

Auth.js © Balázs Orbán 和团队 -2024