From f2600a3012442b42318dbab3d2fc545893131ade Mon Sep 17 00:00:00 2001 From: Peaceultime Date: Tue, 30 Jul 2024 17:58:22 +0200 Subject: [PATCH] Finished registration + working on own useAuth composable --- assets/common.css | 90 +++++++++++++++++++++++++++++-- assets/global.css | 7 --- bun.lockb | Bin 361144 -> 347136 bytes components/Input.vue | 17 ++++++ composables/useAuth.ts | 54 +++++++++++++++++++ composables/useDatabase.ts | 21 ++++++++ db.sqlite | Bin 0 -> 69632 bytes middleware/auth.ts | 5 ++ nuxt.config.ts | 45 ++-------------- package.json | 5 +- pages/user/login.vue | 1 - pages/user/profile.vue | 2 +- pages/user/register.vue | 77 ++++++++++++++++++++++++++ pages/user/signup.vue | 41 -------------- schemas/registration.ts | 43 +++++++++++++++ server/api/auth/login.post.ts | 2 + server/api/auth/logout.post.ts | 2 + server/api/auth/register.post.ts | 35 ++++++++++++ server/api/auth/session.get.ts | 2 + server/api/login.ts | 1 - server/api/logout.ts | 1 - server/api/register.ts | 1 - server/api/session.ts | 1 - 23 files changed, 354 insertions(+), 99 deletions(-) create mode 100644 components/Input.vue create mode 100644 composables/useAuth.ts create mode 100644 composables/useDatabase.ts create mode 100644 db.sqlite create mode 100644 middleware/auth.ts create mode 100644 pages/user/register.vue delete mode 100644 pages/user/signup.vue create mode 100644 schemas/registration.ts create mode 100644 server/api/auth/login.post.ts create mode 100644 server/api/auth/logout.post.ts create mode 100644 server/api/auth/register.post.ts create mode 100644 server/api/auth/session.get.ts delete mode 100644 server/api/login.ts delete mode 100644 server/api/logout.ts delete mode 100644 server/api/register.ts delete mode 100644 server/api/session.ts diff --git a/assets/common.css b/assets/common.css index 4423179..7922b2d 100644 --- a/assets/common.css +++ b/assets/common.css @@ -138,9 +138,6 @@ html.light-mode .light-block { display: block; } -.flex { - display: flex; -} .align-baseline { align-items: baseline; } @@ -150,11 +147,26 @@ html.light-mode .light-block { .align-stretch { align-items: stretch; } +.justify-center { + justify-content: center; +} +.justify-between { + justify-content: space-between; +} +.justify-evenly { + justify-content: space-evenly; +} +.justify-around { + justify-content: space-around; +} @media screen and (max-width: 750px) { .mobile-bigger { flex: 3 1 0 !important; } + .mobile-smaller { + flex: 1 3 0 !important; + } .mobile-hidden { display: none !important; } @@ -163,10 +175,82 @@ html.light-mode .light-block { } } @media screen and (min-width: 750px) { + .desktop-bigger { + flex: 3 1 0 !important; + } + .desktop-smaller { + flex: 1 3 0 !important; + } .desktop-hidden { display: none !important; } .desktop-block { display: inherit !important; } +} + + +.input-form.input-form-wide { + width: 600px; +} + +.input-form { + width: 400px; + display: flex; + flex-direction: column; + padding: 0 2em 2em 2em; + border: 1px solid var(--background-modifier-border); +} + +.input-group { + display: flex; + flex-direction: column; + padding: .5em; +} + +.input-form h1 { + font-size: x-large; +} + +.input-form button { + margin-top: 2em; +} + +.input-group .input-label { + padding: 4px 1em; +} + +.input-group .input-error { + padding: .5em 1em 4px; + color: var(--text-error); + user-select: text; +} + +.input-group .input-input.input-has-error { + border-color: var(--text-error); +} + +.password-validation-group { + display: flex; + flex-direction: column; + padding: .5em 2em; +} + +.password-validation-title { + font-style: italic; + font-size: small; + padding-bottom: 4px; +} + +.password-validation-item { + font-size: small; + padding-left: .5em; +} + +.password-validation-item pre { + user-select: text; +} + +.password-validation-item.validation-error { + color: var(--text-error); } \ No newline at end of file diff --git a/assets/global.css b/assets/global.css index 729b509..38ac617 100644 --- a/assets/global.css +++ b/assets/global.css @@ -2266,13 +2266,6 @@ button.mod-destructive { color: var(--text-on-accent); } -.input-label { - display: inline-block; - width: 150px; - text-align: right; - margin-right: var(--size-4-2); -} - .input-button { padding: 6px 14px; margin-left: 14px; diff --git a/bun.lockb b/bun.lockb index eb681e35162ac64111b1438d6c4030e1042a0790..996f7023f183c9ae15eb786cde59b640474d29b9 100644 GIT binary patch delta 64783 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

6OIAaL9y3?+UyrtG6aw|1n{jX8v;lk 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 diff --git a/components/Input.vue b/components/Input.vue new file mode 100644 index 0000000..b0eeeea --- /dev/null +++ b/components/Input.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/composables/useAuth.ts b/composables/useAuth.ts new file mode 100644 index 0000000..d2efa9d --- /dev/null +++ b/composables/useAuth.ts @@ -0,0 +1,54 @@ +export enum AuthStatus +{ + disconnected, loading, connected +}; +export interface Auth +{ + id: Ref; + data: Ref>; + token: Ref; + session_id: Ref; + status: Ref; + + lastRefresh: Ref; + + register: (username: string, email: string, password: string, data?: Record) => AuthStatus; + login: (usernameOrEmail: string, password: string) => AuthStatus; + logout: () => AuthStatus; + + refresh: () => AuthStatus; +} + +const id = useState("auth:id", () => 0); +const data = useState("auth:data", () => {}); +const token = useState("auth:token", () => ''); +const session_id = useState("auth:session_id", () => 0); +const status = useState("auth:status", () => 0); + +const lastRefresh = useState("auth:date", () => new Date()); + +function register(username: string, email: string, password: string, data?: Record): AuthStatus +{ + + return AuthStatus.disconnected; +} +function login(usernameOrEmail: string, password: string): AuthStatus +{ + return AuthStatus.disconnected; +} +function logout(): AuthStatus +{ + return AuthStatus.disconnected; +} + +function refresh(): AuthStatus +{ + return AuthStatus.disconnected; +} + +export default function useAuth(): Auth { + return { + id, data, token, session_id, status, lastRefresh, + register, login, logout, refresh + }; +} \ No newline at end of file diff --git a/composables/useDatabase.ts b/composables/useDatabase.ts new file mode 100644 index 0000000..8ab2990 --- /dev/null +++ b/composables/useDatabase.ts @@ -0,0 +1,21 @@ +import { Database } from "bun:sqlite"; + +let instance: Database | undefined; + +export default function useDatabase(): Database { + if(instance === undefined) + instance = getDatabase(); + + return instance; +} + +function getDatabase(): Database +{ + const { dbFile } = useRuntimeConfig(); + + const db = new Database(dbFile); + + db.exec("PRAGMA journal_mode = WAL;"); + + return db; +} \ No newline at end of file diff --git a/db.sqlite b/db.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..3d36073c900cb31d2c31b22ca0f7ba6ee3d29fd2 GIT binary patch literal 69632 zcmeI*$y3`_9KdnO4mL82p-Ysd=?I4z@R$O&frJB{I7CodW5C!==tUzy0VQ4l8QNwh zGlk^PQ*Zq%`p@**OV70o~iMz-GK_xrpjJqro5zLqvChH}4r zP}D0*QWy|?KH-+42!ar>?}PR|Y~L@~_sgeCd*R;1>Vq?u0b%^nUZ0c{db`K{{nz?N z`u^zutLKNFeDBNd@tz)OIrMAj=g?#4tM}_O>LCdM1Q0*~f&VCQGW$tTo|q7y4psEc zf?@3!HnoaT+|%5rTC!oqh54+S%Be~&bvvypk%sh$G8&R1=5|C{%H-5VHLGM+a!Mwj zPAmD$(pp{}vy%@k<3MYX$1*I-ESI!h-P(;vIrW}h%V|wc73N-(mHLiRsx+=&%`Ppc zvKz`*>c*(kw5VOd{7Pm$mrdD?R3dr1IT2-HC95tiX1rY07DknD~6A@o?dB9DxSPyJPdlWA{AoqT35os`SflmqRwQ$3jKle!`0Hn^JBLBpx%7vWNV zLKMu>w(*_4UD@wMHM^tBv!4d!<&nnqZa%F>OH0%|?Vr8&?nUD@MZ46i0eK^N=Bw6> zLQC^1s9o6?2}Prq0`i=ER!x@IZmTCMx6bOmj1}rHi);T*W#B-w3xD*kg=<~>{bk{| zX1(O~M*Z$Et|hGf)a8KuPl`0`bmN2etNzriij>_;&DJ+>O+t&;H!#s>SKaMQB2l}Q zt-2}cj1g<_`13$e9vTu)7GG`ImbR@|bT`?36l~nhd0ATQ-Cj=;H9Kv0Y`(uecQP1| z7l+Osl1@C{nD!dpz1kI!V=-~Vjrnx@w2b{jqqODBo6hE1eHy5VzAkaJq!*1bJ8RTd z|527@@rn7`(Ixab*l7{y&Ex#x>^zox0H6I7o0Z_w^vruYARz-h~7Jk(bGzunXP8@*qN17 zKDV-zvEx}*GdU+mwTuJqHZ>ZG_Bq}I&JS(~Ab2q1s}0tg_000IagfB*vLUckHle^Ur=p8HS;009ILKmY**5I_I{1Q0*~f&Wk7 z`1q3GH<5M>#Z|xLyvoO9@E)MGlJLOWs+#Wufi_Z=h z=Vqp-lQUzLxy0DsTzvSOn0mN#^u^TuN+La@#&eTviMtcC3wIYLr?+mz9!!;17uFxd z%H^XwH;4D{9qm5M-&{;grRVqb?fqD#cyH>)y7?e=Cq8fG%HJ-0nVOz7XX5EK=ls7I zeks`B+z>zj0R#|0009ILKmY**5I~^q1iJiwza)9b|IdZ+bHRBiwOyD5ga85vAbRbNt`d-A!-^AbDBSSFwmh4gpB|K2q1s} z0tg_000IagfIw#n`0a3=-vT&GUuT6*v`#hK{^@|v zx&EK?|LxPyM1lYU2q1s}0tg_000IagfIu?=@9+Pg3E^kWQdx%p0tg_000IagfB*sr TAb { + const meta = to.meta.auth; + + //to. +}) \ No newline at end of file diff --git a/nuxt.config.ts b/nuxt.config.ts index 39cb234..364e4ab 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -2,45 +2,17 @@ import CanvasModule from './transformer/canvas/module' export default defineNuxtConfig({ - modules: [CanvasModule, "@nuxt/content", "@nuxtjs/color-mode", '@sidebase/nuxt-auth'], - + modules: [CanvasModule, "@nuxt/content", "@nuxtjs/color-mode"], + css: ['~/assets/common.css', '~/assets/global.css'], + runtimeConfig: { + dbFile: '' + }, components: [ { path: '~/components', pathPrefix: false, }, ], - - router: { - options: { - scrollBehaviorType: 'smooth' - } - }, - - auth: { - baseURL: '/api/auth', - provider: { - type: 'local', - //type: 'refresh', - endpoints: { - signIn: { path: '/login', method: 'post' }, - signOut: { path: '/logout', method: 'post' }, - signUp: { path: '/register', method: 'post' }, - getSession: { path: '/session', method: 'get' }, - //refresh: { path: '/refresh', method: 'post' } - }, - session: { - dataType: { - id: 'string', - username: 'string', - email: 'string', - } - } - } - }, - - css: ['~/assets/common.css', '~/assets/global.css'], - content: { ignores: [ '98.Privé' @@ -78,12 +50,5 @@ export default defineNuxtConfig({ } } }, - - vite: { - vue: { - customElement: ['Line', 'Circle', 'Path'] - } - }, - compatibilityDate: '2024-07-25' }) \ No newline at end of file diff --git a/package.json b/package.json index fcffe21..696ba3e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "devDependencies": { "@nuxt/content": "^2.13.2", "@nuxtjs/color-mode": "^3.4.2", - "@sidebase/nuxt-auth": "^0.8.1", + "@types/bun": "^1.1.6", "nuxt": "^3.12.4", "vue": "^3.4.34", "vue-router": "^4.4.0" @@ -14,6 +14,7 @@ "dependencies": { "hast-util-to-html": "^9.0.1", "remark-breaks": "^4.0.0", - "remark-ofm": "link:remark-ofm" + "remark-ofm": "link:remark-ofm", + "zod": "^3.23.8" } } \ No newline at end of file diff --git a/pages/user/login.vue b/pages/user/login.vue index 8293750..42ea93b 100644 --- a/pages/user/login.vue +++ b/pages/user/login.vue @@ -1,6 +1,5 @@ + + \ No newline at end of file diff --git a/pages/user/signup.vue b/pages/user/signup.vue deleted file mode 100644 index 18c3632..0000000 --- a/pages/user/signup.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - \ No newline at end of file diff --git a/schemas/registration.ts b/schemas/registration.ts new file mode 100644 index 0000000..d4184f1 --- /dev/null +++ b/schemas/registration.ts @@ -0,0 +1,43 @@ +import { z } from "zod"; + +function securePassword(password: string, ctx: z.RefinementCtx): void { + const lowercase = password.toLowerCase(); + const uppercase = password.toUpperCase(); + + if(lowercase === password) + { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Votre mot de passe doit contenir au moins une majuscule", + }); + } + if(uppercase === password) + { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Votre mot de passe doit contenir au moins une minuscule", + }); + } + if(!/[0-9]/.test(password)) + { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Votre mot de passe doit contenir au moins un chiffre", + }); + } + if(!" !\"#$%&'()*+,-./:;<=>?@[]^_`{|}~".split("").some(e => password.includes(e))) + { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Votre mot de passe doit contenir au moins un symbole", + }); + } +} + +export const schema = z.object({ + username: z.string({ required_error: "Nom d'utilisateur obligatoire" }).min(3, "Votre nom d'utilisateur doit contenir au moins 3 caractères").max(32, "Votre nom d'utilisateur doit contenir au plus 32 caractères"), + email: z.string({ required_error: "Email obligatoire" }).email("Adresse mail invalide"), + password: z.string({ required_error: "Mot de passe obligatoire" }).min(8, "Votre mot de passe doit contenir au moins 8 caractères").max(128, "Votre mot de passe doit contenir au moins 8 caractères").superRefine(securePassword), +}); + +export type Registration = z.infer; \ No newline at end of file diff --git a/server/api/auth/login.post.ts b/server/api/auth/login.post.ts new file mode 100644 index 0000000..0e2f809 --- /dev/null +++ b/server/api/auth/login.post.ts @@ -0,0 +1,2 @@ +export default defineEventHandler(async (e) => { +}); \ No newline at end of file diff --git a/server/api/auth/logout.post.ts b/server/api/auth/logout.post.ts new file mode 100644 index 0000000..0e2f809 --- /dev/null +++ b/server/api/auth/logout.post.ts @@ -0,0 +1,2 @@ +export default defineEventHandler(async (e) => { +}); \ No newline at end of file diff --git a/server/api/auth/register.post.ts b/server/api/auth/register.post.ts new file mode 100644 index 0000000..4df29af --- /dev/null +++ b/server/api/auth/register.post.ts @@ -0,0 +1,35 @@ +import useDatabase from '~/composables/useDatabase'; +import { schema } from '~/schemas/registration'; + +export default defineEventHandler(async (e) => { + const body = await readValidatedBody(e, schema.safeParse); + + if(!body.success) + return body.error; + + const db = useDatabase(); + + const usernameQuery = db.query(`SELECT COUNT(*) as count FROM users WHERE username = ?1`); + const checkUsername = usernameQuery.get(body.data.username); + + const emailQuery = db.query(`SELECT COUNT(*) as count FROM users WHERE email = ?1`); + const checkEmail = emailQuery.get(body.data.email); + + const errors = []; + if(checkUsername.count !== 0) + errors.push({ path: ['username'], message: "Ce nom d'utilisateur est déjà utilisé" }); + if(checkEmail.count !== 0) + errors.push({ path: ['email'], message: "Cette adresse mail est déjà utilisée" }); + + if(errors.length > 0) + throw createError({ status: 406, message: "duplicates", data: errors }); + else + { + const hash = await Bun.password.hash(body.data.password); + const registration = db.query(`INSERT INTO users(username, email, hash) VALUES(?1, ?2, ?3)`); + const result = registration.get(body.data.username, body.data.email, hash); + + setResponseStatus(e, 201, "Created"); + return { success: true }; + } +}); \ No newline at end of file diff --git a/server/api/auth/session.get.ts b/server/api/auth/session.get.ts new file mode 100644 index 0000000..0e2f809 --- /dev/null +++ b/server/api/auth/session.get.ts @@ -0,0 +1,2 @@ +export default defineEventHandler(async (e) => { +}); \ No newline at end of file diff --git a/server/api/login.ts b/server/api/login.ts deleted file mode 100644 index ea120c7..0000000 --- a/server/api/login.ts +++ /dev/null @@ -1 +0,0 @@ -export default defineEventHandler(() => 'Hello World!'); \ No newline at end of file diff --git a/server/api/logout.ts b/server/api/logout.ts deleted file mode 100644 index ea120c7..0000000 --- a/server/api/logout.ts +++ /dev/null @@ -1 +0,0 @@ -export default defineEventHandler(() => 'Hello World!'); \ No newline at end of file diff --git a/server/api/register.ts b/server/api/register.ts deleted file mode 100644 index 7ba15ab..0000000 --- a/server/api/register.ts +++ /dev/null @@ -1 +0,0 @@ -export default defineEventHandler((...args) => console.log(...args)); \ No newline at end of file diff --git a/server/api/session.ts b/server/api/session.ts deleted file mode 100644 index ea120c7..0000000 --- a/server/api/session.ts +++ /dev/null @@ -1 +0,0 @@ -export default defineEventHandler(() => 'Hello World!'); \ No newline at end of file