From 00fcc17b5df9454100e48f5661db758cf2c7ba2a Mon Sep 17 00:00:00 2001 From: TZGyn Date: Sat, 17 Jun 2023 02:41:41 +0800 Subject: [PATCH] Added auth to frontend --- frontend/composables/axios.ts | 8 +++ frontend/composables/post.ts | 2 +- frontend/composables/user.ts | 41 ++++++++++++++++ frontend/middleware/auth.ts | 12 +++++ frontend/pages/index.vue | 53 ++++++++++++-------- frontend/pages/login/index.vue | 89 ++++++++++++++++++++++++++++++++++ 6 files changed, 184 insertions(+), 21 deletions(-) create mode 100644 frontend/composables/axios.ts create mode 100644 frontend/composables/user.ts create mode 100644 frontend/middleware/auth.ts create mode 100644 frontend/pages/login/index.vue diff --git a/frontend/composables/axios.ts b/frontend/composables/axios.ts new file mode 100644 index 0000000..68603b0 --- /dev/null +++ b/frontend/composables/axios.ts @@ -0,0 +1,8 @@ +import axios from 'axios' + +const request = axios.create({ + baseURL: 'http://localhost:8000', + withCredentials: true, +}) + +export { request } diff --git a/frontend/composables/post.ts b/frontend/composables/post.ts index c585dc8..6d7572a 100644 --- a/frontend/composables/post.ts +++ b/frontend/composables/post.ts @@ -4,7 +4,7 @@ const PostValidator = z.object({ sequence: z.number(), id: z.string(), title: z.string(), - description: z.string().nullish(), + description: z.string(), created_at: z.string(), updated_at: z.string(), }) diff --git a/frontend/composables/user.ts b/frontend/composables/user.ts new file mode 100644 index 0000000..92cccb0 --- /dev/null +++ b/frontend/composables/user.ts @@ -0,0 +1,41 @@ +import { z } from 'zod' + +const userSchema = z.object({ + email: z.string().email(), + password: z.string().min(6), +}) + +const userLogin = async (email: String, password: String) => { + await getUser() + if (useUser().value) return + + const user = userSchema.safeParse({ email, password }) + + if (!user.success) return user.error.format() + + await request.get('/sanctum/csrf-cookie') + await request.post('/login', user.data) + + await getUser() +} + +const getUser = async () => { + await request + .get('/api/user') + .then(({ data }) => { + const parsed = loggedInUserSchema.safeParse(data) + if (!parsed.success) return + useUser().value = parsed.data.name + }) + .catch((error) => { + console.log(error) + }) +} + +const loggedInUserSchema = z.object({ + name: z.string(), +}) + +const useUser = () => useState('user', () => '') + +export { userLogin, useUser, getUser } diff --git a/frontend/middleware/auth.ts b/frontend/middleware/auth.ts new file mode 100644 index 0000000..0521165 --- /dev/null +++ b/frontend/middleware/auth.ts @@ -0,0 +1,12 @@ +export default defineNuxtRouteMiddleware(async (to, from) => { + const user = useUser() + await getUser() + + if (!user.value && to.path !== '/login' && to.path.startsWith('/')) { + return navigateTo('/login') + } + + if (user.value && to.path === '/login') { + return navigateTo('/') + } +}) diff --git a/frontend/pages/index.vue b/frontend/pages/index.vue index 17eb28a..8614f05 100644 --- a/frontend/pages/index.vue +++ b/frontend/pages/index.vue @@ -1,4 +1,8 @@ diff --git a/frontend/pages/login/index.vue b/frontend/pages/login/index.vue new file mode 100644 index 0000000..566c2c8 --- /dev/null +++ b/frontend/pages/login/index.vue @@ -0,0 +1,89 @@ + + +