From 992eb07f5c658bfaff7c27bee7cb67bcd5a89e4b Mon Sep 17 00:00:00 2001 From: DanMihailescu Date: Thu, 19 Dec 2024 20:06:44 -0500 Subject: [PATCH] Lucia Authentication (#8) * initial lucia installation * added prismAdapter for lucia * fixed adapter * main lucia set * moved into correct folder * fixed * removed npm lock * removed supabase(i swear) * Lucia register done * lucia login done * removed * fixed issues with uuid * fixed all commented issues * fixed event param * Update +page.server.ts Signed-off-by: DanMihailescu * Update lucia.ts Signed-off-by: DanMihailescu --------- Signed-off-by: DanMihailescu Co-authored-by: Dan Mihailescu --- bun.lockb | Bin 242747 -> 259875 bytes package.json | 5 ++- prisma/dev.db | Bin 32768 -> 49152 bytes .../20241210153750_init/migration.sql | 19 --------- .../migration.sql | 37 ------------------ .../migration.sql | 24 ++++++++++++ prisma/schema.prisma | 23 ++++++++--- src/app.d.ts | 6 ++- src/lib/server/lucia.ts | 31 +++++++++++++++ src/routes/+page.server.ts | 7 ++-- src/routes/login/+page.server.ts | 28 ++++++++++--- 11 files changed, 108 insertions(+), 72 deletions(-) delete mode 100644 prisma/migrations/20241210153750_init/migration.sql delete mode 100644 prisma/migrations/20241211200947_add_timestamps/migration.sql create mode 100644 prisma/migrations/20241215222709_removed_issue/migration.sql create mode 100644 src/lib/server/lucia.ts diff --git a/bun.lockb b/bun.lockb index f1ef47ed3706409033c44ac3b151bee23838f0c7..49f309742d80ecce4c21491563cd7a138a44e646 100755 GIT binary patch delta 56636 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 CrdB8b delta 46238 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

k-E;CNFZFSD+` zvkNz_2E#Lw6ug<~n3Sn{u3y5LlAHB#olP+O-6=ym3Ol=7V26|NiN`&mGpcT%cJzn( zes7AI?# zmTGgos_GC4Aridx%ks|`Wl>foS<+-#)}7Cl0r;Fu`zQ9#A;aAC{_%O71J`Q?I2A?9mCLFVv=I0@*c#V+?)w@ z3_HtxOp`=Sv9K=Kj-v<+k|bc$bOeN`ge+N8Y?Zm2BiW`(3`{7)r^y|k;!Y{6*dfSP z9Yt}Fq+;fs%pWz|(M?sgMANZkLd}k0b6bXqilSz)Z8Hz+uQYW;qMI{ATb7BoAsLQN z1eUkVoJ=8tWw8oXv1F(cC9|sBi!M8aS+8j# z)~Sq5ESgAm5K@ROce0)8StiM%XsSB5Z0p9~=OR}>+?)z_EK@i$Telt4LRdhiiCJZ; zy1<&0F31`qBuYBbSaVcaV?(-(GzXc~VSc4Bz(_%ktXQgUBU7Rl185qSCOI0BEQhk{ zlqqY+#6Y-{?O%G9v9_z|nwVkhEA`Ha_a<1M7LI%ni2f*gJ$f@b8TlZpM&bVd0qW_& zR3HEZfB+Bx0zd!=00AHX1b_e#=n^;@N(Tp701I=$K^CM&x!@oRL?c{qkOiCJPSyh~ zpoF;KAnO@JPleJ0Eidr<|4{VpK=h;N`)mgR2mk>f00e*l5C8%|00;m9AOHk_01$W( z2t-43LFM@@e~aX4QYnS_vAlIW6ba3ZOIyeM@Bi6L|AFYo?C1Rlp@3i`5C8%|00;m9 zAOHk_01yBIKmZ5;0U)rGKx8;HIUG7N*8i+iI24*5;~$m?53^tR=S2AZe<<=;AW9-X zV><{y00;m9AOHk_01yBIKmZ5;0U+@CA+Y&GXe>P!-CQ0SLAvC~re+ATCF$(dc|#Kn z%XS0>=@xr0Uv@-nY#HFC=STAwI9XSXwTN=Mrl<@rCpC4OjKgl-AE{2Fk7Z=`4F` z{r3ELH{N_=sBfo5*moHmNfoe#EkV^KB$%>>1Zo+gq*&~O2kZ^{t%u(7eeAqcHIw#> z=V($-dMW+9d@gk{;Wp>pQrxW6uUyVGS8K;s6Y^?fB~Ja+nt56@<5)bO6_251%S~QA z$L*}#`9?S1d^|XIvdfc{)Ed%Dt(M4w+cbRB%d(G4)WmI1D}w4}EcZ`HrtIw#@$#!`0WipT)2rI(h9as9MflKmYIjGU}E`K;v>Exl=L>wY!smRjpLtL5@7#ieq+;jq2!HY&l}^YTs6xFynLys7n-$7S)+bIZx@T@eDHSm z(06~&9xs3It@pd}zN+ovj_P!)(6aQpQ&;kZid?h3YLyf%uZCr{M03cO3q`NuZDb2f z^})X$WJ+((Pj}-%Zk5+U-2%AHyv408Qrt$(a-p=2oLVklX)8_C(5RCycpBMo+B}!9 zWtje3>-_WiEZ)BWL)`+%*lVlR4Uam_Y`chBk*rrJ6kU>Ar`0lcoV=GU)%^;xv*jww<O(vB;Z&=ntc@=tktt$ls#BiTomZ@u6?#P(UC61b_e#00KY&2mk>f z00e*l5cq5mI3Btl9CQh0j0+FCs1oMFgD#Vda^XQ2K1R6kpi3FUTzJqGi4Yeabd6!? zSm^rrpi2e)@Bgt%AO37qJXiq)fB+Bx0zd!=00AHX1b_e#00KY&2mk>f00e*l5C8%| z00;m9AOHk_01yBIKmZ7QS_1s<|M~y_g8&4801yBIKmZ5;0U!VbfB+Bx0zd!=JiG+{ E3Fgi0K>z>% delta 920 zcma)4O=}ZD7@keK*=&;SSZM5_mTpr;i(NajJNtF1UxZpHwMe1`(K6eah1GmW8?{oQ zjX9_%D+_v4&>tX@gW$o72eIf$ES}Vhr%Dfkc=6zFq9-pMc;6YGnR%XP-g(#8lk4k= zjln($07ysiZ{+Te8-oxWxpqg%9tD!@17!=gb3bK2`#t+8JJlZ9^EJJ{M3z!om^8wK_BtXhci!l6RI z3S+lY>5h7<9)8Pe9X&la9^TAt9=sR3YOZ!%#W&*UIeDgdyi`<6$4|@@yF}qjaZ=<} z8dSoK)ZT23R(U}!73WKt_D5wRkxuk(0eGc%tKEk-d)Jx+iA=evh*JQFGWC$@Qr*-{ z8~YkDsH3@rVGU!9kWYQYkYjtk?HkynmVs^RV9#(&+cI6k3FD574Be%cPMA+jZs~~X z%(Eg|Q#UQg_o*j@FV5Y)pd+1N9pkV(Jg^o4b4^9)_%LE07Q)D4$k0r-Xln!^TXQ`l z@?jc_Cebm+%;LUn7!EabOk8R(!nsFCXmB_UeG?HHdE;CleyxBHI0 zhDWiG0uy7R=<(VmS`BK)8hp8NWU*d7@fT3%XytM}uKwp&-Q1Pm25=knL{eYiaDQ?_ z{*R!m^Z~#Rk { + return { + email: attributes.email + }; + } +}); + +declare module 'lucia' { + interface Register { + Lucia: typeof Lucia; + DatabaseUserAttributes: DatabaseUserAttributes; + } +} + +interface DatabaseUserAttributes { + email: string; +} + +export type Auth = typeof auth; diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 614de2d..3e2a230 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,18 +1,17 @@ import { prisma } from '$lib/server/prisma'; - export async function load(event) { const userId = event.cookies.get('user'); - if (!userId && isNaN(Number(userId))) { + if (!userId) { return { authenticated: false }; } const user = await prisma.user.findUnique({ where: { - id: Number(userId) + id: userId } }); return { authenticated: !!user }; -} \ No newline at end of file +} diff --git a/src/routes/login/+page.server.ts b/src/routes/login/+page.server.ts index 5216540..dc69fae 100644 --- a/src/routes/login/+page.server.ts +++ b/src/routes/login/+page.server.ts @@ -1,6 +1,8 @@ import { logger } from '$lib/server/logger'; import { prisma } from '$lib/server/prisma'; import { error, redirect, type Actions } from '@sveltejs/kit'; +import { Argon2id } from 'oslo/password'; +import { auth } from '$lib/server/lucia.js'; export const actions = { login: async (event) => { @@ -17,30 +19,46 @@ export const actions = { logger.error('User not found! ${user}'); return error(401); } - event.cookies.set('user', String(user.id), { + const password = form.get('password') as string; + if (!password) { + return error(401, 'Password is required'); + } + const validPassword = await new Argon2id().verify(user.password, password); + if (!validPassword) { + return error(400, 'Password is incorrect!'); + } + const session = await auth.createSession(user.id, []); + const sessionCookie = auth.createSessionCookie(session.id); + event.cookies.set(sessionCookie.name, sessionCookie.value, { path: '/', maxAge: 120 }); redirect(302, '/'); }, + register: async (event) => { const form = await event.request.formData(); - if (!form.has('email') || !form.has('name')) { + if (!form.has('email') || !form.has('name') || !form.has('password')) { return error(400); } + const password = form.get('password') as string; + const hashedPassword = await new Argon2id().hash(password); const user = await prisma.user.create({ data: { email: form.get('email') as string, - name: form.get('name') as string + name: form.get('name') as string, + password: hashedPassword } }); + const session = await auth.createSession(user.id.toString(), {}); + const sessionCookie = auth.createSessionCookie(session.id); if (!user) { return error(500); } - event.cookies.set('user', String(user.id), { + event.cookies.set(sessionCookie.name, sessionCookie.value, { path: '/', maxAge: 120 }); redirect(302, '/'); } -} satisfies Actions; \ No newline at end of file +} satisfies Actions;