feat: better auth rate limiting

This commit is contained in:
Maze Winther 2025-08-02 17:33:23 +02:00
parent c8980de41a
commit 5e2b07e518
3 changed files with 32 additions and 3 deletions

View File

@ -5,6 +5,8 @@ export const keys = () =>
createEnv({
server: {
BETTER_AUTH_SECRET: z.string(),
UPSTASH_REDIS_REST_URL: z.string().url(),
UPSTASH_REDIS_REST_TOKEN: z.string(),
},
client: {
NEXT_PUBLIC_BETTER_AUTH_URL: z.string().url(),
@ -12,5 +14,7 @@ export const keys = () =>
runtimeEnv: {
NEXT_PUBLIC_BETTER_AUTH_URL: process.env.NEXT_PUBLIC_BETTER_AUTH_URL,
BETTER_AUTH_SECRET: process.env.BETTER_AUTH_SECRET,
UPSTASH_REDIS_REST_URL: process.env.UPSTASH_REDIS_REST_URL,
UPSTASH_REDIS_REST_TOKEN: process.env.UPSTASH_REDIS_REST_TOKEN,
},
});

View File

@ -1,9 +1,20 @@
import { betterAuth } from "better-auth";
import { betterAuth, RateLimit } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "@opencut/db";
import { keys } from "./keys";
import { Redis } from "@upstash/redis";
const { NEXT_PUBLIC_BETTER_AUTH_URL, BETTER_AUTH_SECRET } = keys();
const {
NEXT_PUBLIC_BETTER_AUTH_URL,
BETTER_AUTH_SECRET,
UPSTASH_REDIS_REST_URL,
UPSTASH_REDIS_REST_TOKEN,
} = keys();
const redis = new Redis({
url: UPSTASH_REDIS_REST_URL,
token: UPSTASH_REDIS_REST_TOKEN,
});
export const auth = betterAuth({
database: drizzleAdapter(db, {
@ -19,6 +30,18 @@ export const auth = betterAuth({
emailAndPassword: {
enabled: true,
},
rateLimit: {
storage: "secondary-storage",
customStorage: {
get: async (key) => {
const value = await redis.get(key);
return value as RateLimit | undefined;
},
set: async (key, value) => {
await redis.set(key, value);
},
},
},
baseURL: NEXT_PUBLIC_BETTER_AUTH_URL,
appName: "OpenCut",
trustedOrigins: ["http://localhost:3000"],

View File

@ -1,5 +1,7 @@
{
"compilerOptions": {
"strictNullChecks": true
"strictNullChecks": true,
"moduleResolution": "bundler",
"module": "esnext"
}
}