better-auth-best-practices
npx skills add https://github.com/kunhai-88/skills --skill better-auth-best-practices
Agent 安装分布
Skill 文档
Better Auth éææå
代ç 示ä¾ä¸ææ° API 请æ¥é better-auth.com/docsã
Better Auth æ¯ TypeScript ä¼å ãæ¡æ¶æ å ³çé´ææ¡æ¶ï¼éè¿æä»¶æ¯æé®ç®±/å¯ç ãOAuthã鿳龿¥ãPasskey çã
鿥
ç¯å¢åé
BETTER_AUTH_SECRETï¼å å¯å¯é¥ï¼è³å° 32 å符ï¼ãçæï¼openssl rand -base64 32BETTER_AUTH_URLï¼æ ¹ URLï¼å¦https://example.comï¼
ä»
彿ªè®¾ç½®ç¯å¢åéæ¶ï¼å¨é
ç½®ä¸å®ä¹ baseURL / secretã
é ç½®æä»¶ä½ç½®
CLI å¨ ./ã./libã./utils æ ./src 䏿¥æ¾ auth.tsãèªå®ä¹è·¯å¾ç¨ --configã
CLI å½ä»¤
npx @better-auth/cli@latest migrateâ åºç¨ schemaï¼å ç½® adapterï¼npx @better-auth/cli@latest generateâ 为 Prisma/Drizzle çæ schemanpx @better-auth/cli mcp --cursorâ 为 AI å·¥å ·æ·»å MCP
æ°å¢æä¿®æ¹æä»¶åééæ°æ§è¡ã
æ ¸å¿é 置项
| é项 | 说æ |
|---|---|
appName |
å¯éæ¾ç¤ºåç§° |
baseURL |
ä»
彿ªè®¾ç½® BETTER_AUTH_URL æ¶ |
basePath |
é»è®¤ /api/authï¼è®¾ä¸º / 坿¾å¨æ ¹è·¯å¾ |
secret |
ä»
彿ªè®¾ç½® BETTER_AUTH_SECRET æ¶ |
database |
夿°åè½å¿ éï¼è§ adapter ææ¡£ |
secondaryStorage |
Redis/KVï¼ç¨äº session ä¸éæµ |
emailAndPassword |
{ enabled: true } å¯ç¨ |
socialProviders |
{ google: { clientId, clientSecret }, ... } |
plugins |
æä»¶æ°ç» |
trustedOrigins |
CSRF ç½åå |
æ°æ®åº
ç´è¿ï¼ä¼ å
¥ pg.Poolãmysql2 æ± ãbetter-sqlite3 æ bun:sqlite å®ä¾ã
ORM adapterï¼ä» better-auth/adapters/drizzleãbetter-auth/adapters/prismaãbetter-auth/adapters/mongodb ç导å
¥ã
注æï¼Better Auth ä½¿ç¨ adapter ç model åï¼èé表åãè¥ Prisma model 为 User 对åºè¡¨ usersï¼ç¨ modelName: "user"ï¼Prisma å¼ç¨ï¼ï¼èé "users"ã
Session 管ç
åå¨ä¼å 级ï¼
- è¥é
ç½®äº
secondaryStorageâ session 忤å¤ï¼ä¸å DBï¼ - 设
session.storeSessionInDatabase: trueå¯åæ¶æä¹ åå° DB - æ DB +
cookieCacheâ 纯æ ç¶ææ¨¡å¼
Cookie ç¼åçç¥ï¼compactï¼é»è®¤ï¼ãjwtãjweã
å
³é®é项ï¼session.expiresInãsession.updateAgeãsession.cookieCache.maxAgeãsession.cookieCache.versionï¼åæ´å¯ä»¤ææ session 失æï¼ã
ç¨æ·ä¸ Account é ç½®
Userï¼user.modelNameãuser.fieldsãuser.additionalFieldsãuser.changeEmail.enabledãuser.deleteUser.enabledã
Accountï¼account.modelNameãaccount.accountLinking.enabledãaccount.storeAccountCookieã
注åå¿
éåæ®µï¼email ä¸ nameã
é®ä»¶æµç¨
emailVerification.sendVerificationEmailâ éªè¯é®ä»¶åéï¼å¿ é¡»å®ä¹emailVerification.sendOnSignUp/sendOnSignInâ èªå¨åéæ¶æºemailAndPassword.sendResetPasswordâ éç½®å¯ç é®ä»¶
å®å ¨
advanced ä¸ï¼useSecureCookiesãdisableCSRFCheckï¼æé£é©ï¼ãdisableOriginCheckï¼æé£é©ï¼ãcrossSubDomainCookies.enabledãipAddress.ipAddressHeadersãdatabase.generateId çã
éæµï¼rateLimit.enabledãrateLimit.windowãrateLimit.maxãrateLimit.storageã
Hooks
端ç¹ï¼hooks.before / hooks.afterï¼{ matcher, handler } æ°ç»ï¼å¯ç¨ createAuthMiddlewareã
æ°æ®åºï¼databaseHooks.user.create.before/after çï¼ç¨äºé»è®¤å¼æå建åé»è¾ã
Hook ä¸ä¸æï¼sessionãsecretãadapterãgenerateId()ãbaseURL çã
æä»¶
æè·¯å¾å¯¼å
¥ä»¥æ¯æ tree-shakingï¼
import { twoFactor } from "better-auth/plugins/two-factor"
å¿ä» "better-auth/plugins" æ´ä½å¯¼å
¥ã
å¸¸ç¨æä»¶ï¼twoFactorãorganizationãpasskeyãmagicLinkãemailOtpãusernameãadminãapiKeyãbearerãjwtãmultiSessionãssoãopenAPI çã
客æ·ç«¯æä»¶æ¾å¨ createAuthClient({ plugins: [...] })ã
客æ·ç«¯
ä» better-auth/clientãbetter-auth/reactãbetter-auth/vue ç导å
¥ã
å¸¸ç¨æ¹æ³ï¼signUp.email()ãsignIn.email()ãsignIn.social()ãsignOut()ãuseSession()ãgetSession()ãrevokeSession() çã
ç±»åå®å ¨
æ¨æç±»åï¼typeof auth.$Infer.Sessionãtypeof auth.$Infer.Session.userã
åå端å离项ç®ï¼createAuthClient()ã
常è§å
- Model ä¸è¡¨å â é ç½®ç¨ ORM model åï¼ä¸æ¯è¡¨å
- æä»¶ schema â å¢å æä»¶åéè· CLI
- Secondary storage â é»è®¤ session 忤å¤èé DB
- Cookie cache â èªå®ä¹ session åæ®µä¸ç¼åï¼æ¯æ¬¡éæ°æå
- æ ç¶ææ¨¡å¼ â æ DB æ¶ session ä» å cookieï¼ç¼åè¿æå³ç»åº
- æ¹é®ç®±æµç¨ â å åå½åé®ç®±ï¼ååæ°é®ç®±