Better Auth 集成

identifyUser

核心构建块——从 Better Auth 会话中提取安全的用户字段、屏蔽电子邮件,并捕获插件数据(组织、角色、2FA)。

identifyUser 是核心构建块。传入一个 RequestLogger 和一个 Better Auth 会话,提取安全字段,并调用 log.set()。如果识别到了用户则返回 true,否则返回 false

server/api/checkout.post.ts
import { identifyUser } from 'evlog/better-auth'

const session = await auth.api.getSession({ headers: event.headers })
if (session) {
  const identified = identifyUser(log, session)
  if (identified) {
    log.set({ subscription: 'premium' })
  }
}
默认安全。 只会提取白名单字段——密码、令牌和密钥绝不会写入日志记录器。

选项

选项类型默认值描述
maskEmailbooleanfalse将电子邮件屏蔽为 h***@example.com
sessionbooleantrue包含会话元数据(session.idsession.expiresAtsession.ipAddresssession.userAgent)。
fieldsstring[]['id', 'name', 'email', 'image', 'emailVerified', 'createdAt']要提取的用户字段。
extend(session) => Record<string, unknown>undefined从 Better Auth 插件(组织、角色等)添加自定义字段。
server/api/checkout.post.ts
identifyUser(log, session, {
  maskEmail: true,
  fields: ['id', 'name'],
  session: false,
})

屏蔽电子邮件

电子邮件属于 PII。在审计/日志轨迹可能会被支持人员或第三方查看的环境中,请将其屏蔽:

identifyUser(log, session, { maskEmail: true })

maskEmail 帮助函数也可单独导出:

import { maskEmail } from 'evlog/better-auth'

maskEmail('hugo@example.com') // 'h***@example.com'

捕获插件字段

Better Auth 附带插件(组织、2FA、角色、管理员),它们会向会话中添加字段。使用 extend 将它们展示到宽事件中:

server/middleware/auth-identify.ts
import { createAuthMiddleware } from 'evlog/better-auth'

const identify = createAuthMiddleware(auth, {
  extend: (session) => ({
    organization: session.user.activeOrganization,
    role: session.user.role,
  }),
})

包含插件字段的宽事件:

Wide Event
{
  "userId": "QBX9tPjJQExWawAbNll75",
  "user": { "id": "QBX9tPjJQExWawAbNll75", "name": "Hugo Richard" },
  "organization": { "id": "org_42", "name": "Acme" },
  "role": "admin"
}
保持 extend 的确定性——它会在每次请求时运行。避免在其中进行繁重计算或额外数据库调用;请查询 Better Auth 已经加载到会话中的数据。

捕获的字段

字段来源描述
userIdsession.user.id顶层用户 ID(PostHog 适配器将其用作 distinct_id)。
user.idsession.user.id用户 ID。
user.namesession.user.name显示名称。
user.emailsession.user.email电子邮件(可通过 maskEmail: true 屏蔽)。
user.imagesession.user.image头像 URL。
user.emailVerifiedsession.user.emailVerified电子邮件验证状态。
user.createdAtsession.user.createdAt账户创建日期(ISO 字符串)。
session.idsession.session.id会话 ID。
session.expiresAtsession.session.expiresAt会话过期时间(ISO 字符串)。
session.ipAddresssession.session.ipAddress来自会话的客户端 IP。
session.userAgentsession.session.userAgent来自会话的用户代理字符串。
session.createdAtsession.session.createdAt会话创建日期(ISO 字符串)。
auth.resolvedInMeasured会话解析耗时,单位为 ms。
auth.identifiedComputed请求是否已被识别。