implemented authentication
This commit is contained in:
6
app.vue
6
app.vue
@ -7,9 +7,15 @@
|
|||||||
|
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { createPinia } from "pinia";
|
||||||
|
import piniaPluginPersistedState from "pinia-plugin-persistedstate"
|
||||||
|
|
||||||
|
|
||||||
//const layout = "empty";
|
//const layout = "empty";
|
||||||
//const route = useRoute();
|
//const route = useRoute();
|
||||||
|
const pinia = createPinia();
|
||||||
|
pinia.use(piniaPluginPersistedState);
|
||||||
|
|
||||||
|
|
||||||
useHead({
|
useHead({
|
||||||
//title: `Tüit ERP - ${route.meta.title}`,
|
//title: `Tüit ERP - ${route.meta.title}`,
|
||||||
|
|||||||
@ -70,11 +70,17 @@ const handleLogin = async () => {
|
|||||||
try {
|
try {
|
||||||
let res = await Axios.post(`https://${clientsideConfig.url}:${clientsideConfig.port}/api/login`, requestBody);
|
let res = await Axios.post(`https://${clientsideConfig.url}:${clientsideConfig.port}/api/login`, requestBody);
|
||||||
|
|
||||||
|
const sessionToken = useCookie('token', {maxAge: 604800, sameSite: true});
|
||||||
|
sessionToken.value = res.data.token;
|
||||||
|
Axios.defaults.headers.common['Authorization'] = `${username}`;
|
||||||
|
const userToken = useCookie('user', {maxAge: 604800, sameSite: true});
|
||||||
|
userToken.value = username;
|
||||||
// something to do with the res?
|
// something to do with the res?
|
||||||
console.log(res.data)
|
console.log(sessionToken)
|
||||||
|
console.log(res.data.message)
|
||||||
|
|
||||||
// sucessfully logged in
|
// sucessfully logged in
|
||||||
router.push('/')
|
router.push('/home')
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// handle the error
|
// handle the error
|
||||||
console.log(err.response.statusText)
|
console.log(err.response.statusText)
|
||||||
|
|||||||
@ -5,6 +5,13 @@ import type {
|
|||||||
|
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
devtools: { enabled: true },
|
devtools: { enabled: true },
|
||||||
|
modules: [
|
||||||
|
'@pinia/nuxt',
|
||||||
|
],/*
|
||||||
|
buildModules: [
|
||||||
|
'@nuxtjs/composition-api/module',
|
||||||
|
['@pinia/nuxt', { disableVuex: false }],
|
||||||
|
],*/
|
||||||
devServer: {
|
devServer: {
|
||||||
https: {
|
https: {
|
||||||
key: './certs/privkey.pem',
|
key: './certs/privkey.pem',
|
||||||
|
|||||||
135
package-lock.json
generated
135
package-lock.json
generated
@ -12,16 +12,20 @@
|
|||||||
"bcryptjs": "^2.4.3",
|
"bcryptjs": "^2.4.3",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"h3": "^1.11.1",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"leading-trim": "^1.0.2",
|
"leading-trim": "^1.0.2",
|
||||||
"mariadb": "^3.2.3",
|
"mariadb": "^3.2.3",
|
||||||
|
"pinia-plugin-persistedstate": "^3.2.1",
|
||||||
"uuid": "^9.0.1",
|
"uuid": "^9.0.1",
|
||||||
"vite": "^5.1.0",
|
"vite": "^5.1.0",
|
||||||
"vuex": "^4.1.0"
|
"vuex": "^4.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nuxt/devtools": "latest",
|
"@nuxt/devtools": "latest",
|
||||||
|
"@pinia/nuxt": "^0.5.1",
|
||||||
"nuxt": "^3.8.0",
|
"nuxt": "^3.8.0",
|
||||||
|
"pinia": "^2.1.7",
|
||||||
"vue": "^3.3.7",
|
"vue": "^3.3.7",
|
||||||
"vue-router": "^4.2.5"
|
"vue-router": "^4.2.5"
|
||||||
}
|
}
|
||||||
@ -2582,6 +2586,19 @@
|
|||||||
"node": ">=0.10"
|
"node": ">=0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@pinia/nuxt": {
|
||||||
|
"version": "0.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.5.1.tgz",
|
||||||
|
"integrity": "sha512-6wT6TqY81n+7/x3Yhf0yfaJVKkZU42AGqOR0T3+UvChcaOJhSma7OWPN64v+ptYlznat+fS1VTwNAcbi2lzHnw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@nuxt/kit": "^3.5.0",
|
||||||
|
"pinia": ">=2.1.7"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/posva"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@pkgjs/parseargs": {
|
"node_modules/@pkgjs/parseargs": {
|
||||||
"version": "0.11.0",
|
"version": "0.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
|
||||||
@ -4449,7 +4466,6 @@
|
|||||||
"version": "3.2.3",
|
"version": "3.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
|
||||||
"integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
|
"integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^14.18.0 || >=16.10.0"
|
"node": "^14.18.0 || >=16.10.0"
|
||||||
}
|
}
|
||||||
@ -4496,8 +4512,7 @@
|
|||||||
"node_modules/cookie-es": {
|
"node_modules/cookie-es": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz",
|
||||||
"integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==",
|
"integrity": "sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/cookie-signature": {
|
"node_modules/cookie-signature": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
@ -4837,8 +4852,7 @@
|
|||||||
"node_modules/defu": {
|
"node_modules/defu": {
|
||||||
"version": "6.1.4",
|
"version": "6.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
|
||||||
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
|
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/delayed-stream": {
|
"node_modules/delayed-stream": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
@ -4871,10 +4885,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/destr": {
|
"node_modules/destr": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/destr/-/destr-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz",
|
||||||
"integrity": "sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==",
|
"integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/destroy": {
|
"node_modules/destroy": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
@ -5730,22 +5743,35 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/h3": {
|
"node_modules/h3": {
|
||||||
"version": "1.10.1",
|
"version": "1.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/h3/-/h3-1.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/h3/-/h3-1.11.1.tgz",
|
||||||
"integrity": "sha512-UBAUp47hmm4BB5/njB4LrEa9gpuvZj4/Qf/ynSMzO6Ku2RXaouxEfiG2E2IFnv6fxbhAkzjasDxmo6DFdEeXRg==",
|
"integrity": "sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cookie-es": "^1.0.0",
|
"cookie-es": "^1.0.0",
|
||||||
|
"crossws": "^0.2.2",
|
||||||
"defu": "^6.1.4",
|
"defu": "^6.1.4",
|
||||||
"destr": "^2.0.2",
|
"destr": "^2.0.3",
|
||||||
"iron-webcrypto": "^1.0.0",
|
"iron-webcrypto": "^1.0.0",
|
||||||
"ohash": "^1.1.3",
|
"ohash": "^1.1.3",
|
||||||
"radix3": "^1.1.0",
|
"radix3": "^1.1.0",
|
||||||
"ufo": "^1.3.2",
|
"ufo": "^1.4.0",
|
||||||
"uncrypto": "^0.1.3",
|
"uncrypto": "^0.1.3",
|
||||||
"unenv": "^1.9.0"
|
"unenv": "^1.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/h3/node_modules/crossws": {
|
||||||
|
"version": "0.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/crossws/-/crossws-0.2.4.tgz",
|
||||||
|
"integrity": "sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"uWebSockets.js": "*"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"uWebSockets.js": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/has-flag": {
|
"node_modules/has-flag": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||||
@ -6131,7 +6157,6 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz",
|
||||||
"integrity": "sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==",
|
"integrity": "sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==",
|
||||||
"dev": true,
|
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/brc-dd"
|
"url": "https://github.com/sponsors/brc-dd"
|
||||||
}
|
}
|
||||||
@ -6912,7 +6937,6 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
|
||||||
"integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
|
"integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
|
||||||
"dev": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"mime": "cli.js"
|
"mime": "cli.js"
|
||||||
},
|
},
|
||||||
@ -7730,8 +7754,7 @@
|
|||||||
"node_modules/node-fetch-native": {
|
"node_modules/node-fetch-native": {
|
||||||
"version": "1.6.2",
|
"version": "1.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz",
|
||||||
"integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==",
|
"integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/node-forge": {
|
"node_modules/node-forge": {
|
||||||
"version": "1.3.1",
|
"version": "1.3.1",
|
||||||
@ -8264,8 +8287,7 @@
|
|||||||
"node_modules/ohash": {
|
"node_modules/ohash": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz",
|
||||||
"integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==",
|
"integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/on-finished": {
|
"node_modules/on-finished": {
|
||||||
"version": "2.4.1",
|
"version": "2.4.1",
|
||||||
@ -8527,8 +8549,7 @@
|
|||||||
"node_modules/pathe": {
|
"node_modules/pathe": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
|
||||||
"integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
|
"integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/perfect-debounce": {
|
"node_modules/perfect-debounce": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
@ -8553,6 +8574,64 @@
|
|||||||
"url": "https://github.com/sponsors/jonschlinkert"
|
"url": "https://github.com/sponsors/jonschlinkert"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/pinia": {
|
||||||
|
"version": "2.1.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz",
|
||||||
|
"integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/devtools-api": "^6.5.0",
|
||||||
|
"vue-demi": ">=0.14.5"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/posva"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@vue/composition-api": "^1.4.0",
|
||||||
|
"typescript": ">=4.4.4",
|
||||||
|
"vue": "^2.6.14 || ^3.3.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@vue/composition-api": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"typescript": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/pinia-plugin-persistedstate": {
|
||||||
|
"version": "3.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.1.tgz",
|
||||||
|
"integrity": "sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"pinia": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/pinia/node_modules/vue-demi": {
|
||||||
|
"version": "0.14.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
|
||||||
|
"integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"bin": {
|
||||||
|
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||||
|
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/antfu"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@vue/composition-api": "^1.0.0-rc.1",
|
||||||
|
"vue": "^3.0.0-0 || ^2.6.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@vue/composition-api": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/pkg-types": {
|
"node_modules/pkg-types": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
|
||||||
@ -9159,8 +9238,7 @@
|
|||||||
"node_modules/radix3": {
|
"node_modules/radix3": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.0.tgz",
|
||||||
"integrity": "sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==",
|
"integrity": "sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/randombytes": {
|
"node_modules/randombytes": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
@ -10394,8 +10472,7 @@
|
|||||||
"node_modules/ufo": {
|
"node_modules/ufo": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz",
|
||||||
"integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==",
|
"integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/ultrahtml": {
|
"node_modules/ultrahtml": {
|
||||||
"version": "1.5.2",
|
"version": "1.5.2",
|
||||||
@ -10406,8 +10483,7 @@
|
|||||||
"node_modules/uncrypto": {
|
"node_modules/uncrypto": {
|
||||||
"version": "0.1.3",
|
"version": "0.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz",
|
||||||
"integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
|
"integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/unctx": {
|
"node_modules/unctx": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
@ -10443,7 +10519,6 @@
|
|||||||
"version": "1.9.0",
|
"version": "1.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz",
|
||||||
"integrity": "sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==",
|
"integrity": "sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"consola": "^3.2.3",
|
"consola": "^3.2.3",
|
||||||
"defu": "^6.1.3",
|
"defu": "^6.1.3",
|
||||||
|
|||||||
@ -11,7 +11,9 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nuxt/devtools": "latest",
|
"@nuxt/devtools": "latest",
|
||||||
|
"@pinia/nuxt": "^0.5.1",
|
||||||
"nuxt": "^3.8.0",
|
"nuxt": "^3.8.0",
|
||||||
|
"pinia": "^2.1.7",
|
||||||
"vue": "^3.3.7",
|
"vue": "^3.3.7",
|
||||||
"vue-router": "^4.2.5"
|
"vue-router": "^4.2.5"
|
||||||
},
|
},
|
||||||
@ -21,9 +23,11 @@
|
|||||||
"bcryptjs": "^2.4.3",
|
"bcryptjs": "^2.4.3",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"h3": "^1.11.1",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"leading-trim": "^1.0.2",
|
"leading-trim": "^1.0.2",
|
||||||
"mariadb": "^3.2.3",
|
"mariadb": "^3.2.3",
|
||||||
|
"pinia-plugin-persistedstate": "^3.2.1",
|
||||||
"uuid": "^9.0.1",
|
"uuid": "^9.0.1",
|
||||||
"vite": "^5.1.0",
|
"vite": "^5.1.0",
|
||||||
"vuex": "^4.1.0"
|
"vuex": "^4.1.0"
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { loginSuccessful, errorMsg } from "../middleware/login";
|
import { loginSuccessful, sessionToken, errorMsg } from "../middleware/login";
|
||||||
import { OutgoingMessage } from 'http';
|
import { OutgoingMessage } from 'http';
|
||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
@ -10,6 +10,11 @@ export default defineEventHandler(async (event) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
setResponseStatus(event, 200)
|
setResponseStatus(event, 200);
|
||||||
return 'Successfully logged in.'
|
//setResponseHeader(event, "Set-Cookie", sessionToken);
|
||||||
|
const resBody = {
|
||||||
|
token: sessionToken,
|
||||||
|
message: 'Login successful'
|
||||||
|
};
|
||||||
|
return resBody;
|
||||||
})
|
})
|
||||||
|
|||||||
1
server/main.ts
Normal file
1
server/main.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
import { pinia } from '@/store'
|
||||||
63
server/middleware/auth.global.js
Normal file
63
server/middleware/auth.global.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import { useAuthStore } from '~/store/auth';
|
||||||
|
|
||||||
|
|
||||||
|
export default defineEventHandler (async (event) => {
|
||||||
|
// Check if user is not authenticated and trying to access a page other than /login
|
||||||
|
let isAuthenticated = false;
|
||||||
|
|
||||||
|
if (event.path !== '/login' && event.path !== '/api/login') {
|
||||||
|
|
||||||
|
//const reqUsername = getHeader(event, "Authorization");
|
||||||
|
//const reqCookie = getHeader(event, "Cookie");
|
||||||
|
const reqUsername = getCookie(event, 'user');
|
||||||
|
const reqToken = getCookie(event, 'token');
|
||||||
|
//console.log('getHeader: ', reqCookie);
|
||||||
|
console.log('getCookie user: ', reqUsername);
|
||||||
|
console.log('getCookie token: ', reqToken);
|
||||||
|
|
||||||
|
const auth = useAuthStore();
|
||||||
|
const authUsername = auth.username;
|
||||||
|
const authToken = auth.token;
|
||||||
|
|
||||||
|
console.log('auth user: ', authUsername);
|
||||||
|
console.log('auth token: ', authToken);
|
||||||
|
|
||||||
|
if (authUsername == reqUsername && authToken == reqToken) {
|
||||||
|
isAuthenticated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!isAuthenticated) {
|
||||||
|
await sendRedirect(event, '/login');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*function isAuthenticated(event) {
|
||||||
|
// Implement authentication logic
|
||||||
|
/*const auth = useAuthStore();
|
||||||
|
const authUsername = auth.username;
|
||||||
|
const authToken = auth.token;
|
||||||
|
|
||||||
|
const reqUsername = getHeader(event, 'Authorization');
|
||||||
|
const reqCookie = getHeader(event, 'Cookie');
|
||||||
|
const reqToken = useCookie('token');
|
||||||
|
console.log('getHeader: ', reqCookie);
|
||||||
|
console.log('useCookie: ', reqToken);
|
||||||
|
|
||||||
|
if (authUsername.equals(reqUsername) ) {
|
||||||
|
return true;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*return false;
|
||||||
|
// Return true if authenticated, false otherwise
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
/*export default defineNuxtRouteMiddleware((to) => {
|
||||||
|
const auth = useAuthStore();
|
||||||
|
const authUsername = auth.username;
|
||||||
|
const authToken = auth.token;
|
||||||
|
|
||||||
|
const reqUsername =
|
||||||
|
})*/
|
||||||
@ -1,8 +1,10 @@
|
|||||||
import axios, { AxiosError } from 'axios';
|
import axios, { AxiosError } from 'axios';
|
||||||
import serversideConfig from '../../serversideConfig';
|
import serversideConfig from '../../serversideConfig';
|
||||||
import https from 'https';
|
import https from 'https';
|
||||||
|
import { useAuthStore } from '~/store/auth';
|
||||||
|
|
||||||
let loginSuccessful = false;
|
let loginSuccessful = false;
|
||||||
|
let sessionToken = 'token';
|
||||||
let errorMsg = '';
|
let errorMsg = '';
|
||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
@ -29,6 +31,9 @@ export default defineEventHandler(async (event) => {
|
|||||||
username: body.username,
|
username: body.username,
|
||||||
password: body.password,
|
password: body.password,
|
||||||
});
|
});
|
||||||
|
sessionToken = res.data.token;
|
||||||
|
const auth = useAuthStore();
|
||||||
|
auth.createNewSession(res.data.user, sessionToken);
|
||||||
loginSuccessful = true;
|
loginSuccessful = true;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (axios.isAxiosError(err)) {
|
if (axios.isAxiosError(err)) {
|
||||||
@ -53,4 +58,4 @@ export default defineEventHandler(async (event) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export { loginSuccessful, errorMsg };
|
export { loginSuccessful, sessionToken, errorMsg };
|
||||||
65
store/auth.ts
Normal file
65
store/auth.ts
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import { defineStore } from 'pinia';
|
||||||
|
|
||||||
|
|
||||||
|
export const useAuthStore = defineStore('auth', {
|
||||||
|
state: () => ({
|
||||||
|
userobject: null,
|
||||||
|
username: 'user',
|
||||||
|
token: 'token',
|
||||||
|
authenticated: false,
|
||||||
|
}),
|
||||||
|
actions: {
|
||||||
|
createNewSession( user: any, t: string ) {
|
||||||
|
this.userobject = user;
|
||||||
|
this.username = user.username;
|
||||||
|
this.token = t;
|
||||||
|
this.authenticated = true;
|
||||||
|
},
|
||||||
|
logUserOut() {
|
||||||
|
this.username = 'user';
|
||||||
|
this.token = 'token';
|
||||||
|
this.authenticated = false;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
persist: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/*interface UserPayloadInterface {
|
||||||
|
username: string;
|
||||||
|
password: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const useAuthStore = defineStore('auth', {
|
||||||
|
state: () => ({
|
||||||
|
authenticated: false,
|
||||||
|
loading: false,
|
||||||
|
}),
|
||||||
|
actions: {
|
||||||
|
async authenticateUser({ username, password }: UserPayloadInterface) {
|
||||||
|
// useFetch from nuxt 3
|
||||||
|
const { data, pending }: any = await useFetch('https://dummyjson.com/auth/login', {
|
||||||
|
method: 'post',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: {
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
this.loading = pending;
|
||||||
|
|
||||||
|
if (data.value) {
|
||||||
|
const token = useCookie('token'); // useCookie new hook in nuxt 3
|
||||||
|
token.value = data?.value?.token; // set token to cookie
|
||||||
|
this.authenticated = true; // set authenticated state value to true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
logUserOut() {
|
||||||
|
const token = useCookie('token'); // useCookie new hook in nuxt 3
|
||||||
|
this.authenticated = false; // set authenticated state value to false
|
||||||
|
token.value = null; // clear the token cookie
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});*/
|
||||||
|
|
||||||
4
store/index.ts
Normal file
4
store/index.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { createPinia } from "pinia";
|
||||||
|
import piniaPluginPersistedState from "pinia-plugin-persistedstate"
|
||||||
|
|
||||||
|
export const pinia = createPinia().use(piniaPluginPersistedState);
|
||||||
Reference in New Issue
Block a user