feat: migrate auth from supabase to better auth (#596)
* feat: add README for @cio/db package and remove existingAccounts.json * load session, load profile and organization, add create profile hook * chore: cache session request The trick was passing all the cookies to the backend. Previously I was only passing the better-auth.session_token and not better-auth.session_data. Read about the difference here https://www.better-auth.com/docs/concepts/cookies#custom-cookies * feat: login, logout, onboarding, verify email, reset password. * feat: complete change email and email verification * feat: standardise how we make rpc calls and create org endpoints * fix ui errors * fix: handle potential undefined customerId and standardize avatar URL property * refactor: standardize custom domain handling and update telegram chat ID references * chore: add tailwind prefix to @cio/ui this fixed the media query issues because @cio/ui classes were overriding this dashboard tailwind build * chore: clean up org sidebar * chore: persist mode state * feat: implement order breadcrumbs * chore: upgrade to better auth 1.4 * chore: address common auth flow bugs and setup app for others to setup locally.
This commit is contained in:
+57
-6
@@ -1,24 +1,75 @@
|
||||
import * as CONSTANTS from './constants';
|
||||
import * as schema from '@db/schema';
|
||||
|
||||
import { admin, anonymous } from 'better-auth/plugins';
|
||||
import { sendChangeEmailConfirmation, sendVerificationEmail } from './auth/email-verification';
|
||||
|
||||
import { betterAuth } from 'better-auth';
|
||||
import { betterAuth } from 'better-auth/minimal';
|
||||
import { createProfileHook } from './auth/hooks/create-profile';
|
||||
import { db } from '@db/drizzle';
|
||||
import { drizzleAdapter } from 'better-auth/adapters/drizzle';
|
||||
import { config as emailAndPassword } from './auth/email-password';
|
||||
import { syncUserWithProfile } from './auth/hooks/sync-user';
|
||||
|
||||
export const auth = betterAuth({
|
||||
baseURL: CONSTANTS.BASE_URL,
|
||||
database: drizzleAdapter(db, {
|
||||
provider: 'pg',
|
||||
schema
|
||||
schema,
|
||||
debugLogs: true
|
||||
}),
|
||||
emailVerification: {},
|
||||
emailAndPassword: {
|
||||
enabled: true
|
||||
emailAndPassword: emailAndPassword,
|
||||
user: {
|
||||
changeEmail: {
|
||||
enabled: true,
|
||||
sendChangeEmailConfirmation
|
||||
}
|
||||
},
|
||||
emailVerification: {
|
||||
enabled: true,
|
||||
sendVerificationEmail
|
||||
},
|
||||
socialProviders: {
|
||||
google: {
|
||||
clientId: process.env.GOOGLE_CLIENT_ID!,
|
||||
clientSecret: process.env.GOOGLE_CLIENT_SECRET!
|
||||
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
|
||||
accessType: 'offline',
|
||||
prompt: 'select_account consent'
|
||||
}
|
||||
},
|
||||
trustedOrigins: CONSTANTS.TRUSTED_ORIGINS,
|
||||
advanced: {
|
||||
cookiePrefix: 'classroomio',
|
||||
crossSubDomainCookies: {
|
||||
enabled: true
|
||||
},
|
||||
database: {
|
||||
generateId: false
|
||||
}
|
||||
},
|
||||
account: {
|
||||
storeAccountCookie: true
|
||||
},
|
||||
session: {
|
||||
expiresIn: 60 * 60 * 24 * 7, // 7 days
|
||||
updateAge: 60 * 60 * 24, // 1 day (every 1 day the session expiration is updated)
|
||||
cookieCache: {
|
||||
enabled: true,
|
||||
maxAge: 60 * 60 // 1 hour
|
||||
}
|
||||
},
|
||||
databaseHooks: {
|
||||
user: {
|
||||
create: {
|
||||
after: async (user) => {
|
||||
await createProfileHook(user);
|
||||
}
|
||||
},
|
||||
update: {
|
||||
after: async (user) => {
|
||||
await syncUserWithProfile(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: [admin(), anonymous()]
|
||||
|
||||
Reference in New Issue
Block a user