diff --git a/.env.development b/.env.development index 9c0a503..03157cc 100644 --- a/.env.development +++ b/.env.development @@ -1 +1,2 @@ VITE_API_URL=https://localhost:5001/ +VITE_GOOGLE_CLIENT_ID=468391910875-78sfopq1t12ulrv4f5vj227j45guuj66.apps.googleusercontent.com diff --git a/.env.production b/.env.production index 5a800a5..83147aa 100644 --- a/.env.production +++ b/.env.production @@ -1 +1,2 @@ VITE_API_URL=todo +VITE_GOOGLE_CLIENT_ID=468391910875-78sfopq1t12ulrv4f5vj227j45guuj66.apps.googleusercontent.com diff --git a/package-lock.json b/package-lock.json index 915a947..2cc5162 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "pinia": "^2.1.7", "vue": "^3.4.15", "vue-router": "^4.2.5", + "vue3-google-login": "^2.0.26", "vuetify": "^3.5.6" }, "devDependencies": { @@ -3479,6 +3480,14 @@ "vue": "^3.2.0" } }, + "node_modules/vue3-google-login": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/vue3-google-login/-/vue3-google-login-2.0.26.tgz", + "integrity": "sha512-BuTSIeSjINNHNPs+BDF4COnjWvff27IfCBDxK6JPRqvm57lF8iK4B3+zcG8ud6BXfZdyuiDlxletbEDgg4/RFA==", + "peerDependencies": { + "vue": "^3.0.3" + } + }, "node_modules/vuetify": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.5.6.tgz", diff --git a/package.json b/package.json index 1a647ed..bdb69c0 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "pinia": "^2.1.7", "vue": "^3.4.15", "vue-router": "^4.2.5", + "vue3-google-login": "^2.0.26", "vuetify": "^3.5.6" }, "devDependencies": { @@ -26,4 +27,4 @@ "tailwindcss": "^3.4.1", "vite": "^5.0.11" } -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 39f62fb..666e898 100644 --- a/src/main.js +++ b/src/main.js @@ -9,6 +9,7 @@ import { createVuetify } from 'vuetify' import * as components from 'vuetify/components' import * as directives from 'vuetify/directives' import clientPlugin from './plugins/api.js' +import vueGoogleOauth from 'vue3-google-login' const vuetify = createVuetify({ components, @@ -20,6 +21,9 @@ const app = createApp(App); // Create an axios client preconfigured to the Hutopy API. app.use(clientPlugin); +app.use(vueGoogleOauth, { + clientId: import.meta.env.VITE_GOOGLE_CLIENT_ID, +}) app.use(createPinia()); app.use(vuetify); app.use(router); diff --git a/src/stores/auth.js b/src/stores/auth.js index bc2c12f..5cd42c0 100644 --- a/src/stores/auth.js +++ b/src/stores/auth.js @@ -4,47 +4,64 @@ const baseUrl = '/api/Users'; export const auth = defineStore({ id: 'auth', + state: () => ({ - user: null, - refreshTokenTimeout: null + user: "", + refreshTokenTimeout: 0 }), + actions: { + async googleLogin(client, idToken) { + const response = await client.post("https://people.googleapis.com/v1/people/me", { + headers: { + "Authorization": "Bearer " + idToken + } + }) + this.user = { + accessToken: response.data.accessToken, + refreshToken: response.data.refreshToken, + email: response.data.email + } + localStorage.setItem('jwt', this.user.accessToken); + this.startRefreshTokenTimer(); + }, + async login(client, email, password) { const requestBody = { email: email, password: password }; - try { - const response = await client.post(`${baseUrl}/login`, requestBody) - this.user = { - accessToken: response.data.accessToken, - refreshToken: response.data.refreshToken, - email: email - } - localStorage.setItem('jwt', this.user.accessToken); - this.startRefreshTokenTimer(); - } catch (error) { - throw new Error('Login failed.') + const response = await client.post(`${baseUrl}/login`, requestBody) + this.user = { + accessToken: response.data.accessToken, + refreshToken: response.data.refreshToken, + email: email } - }, - logout() { - localStorage.setItem('jwt', ''); - this.stopRefreshTokenTimer(); - this.user = null; - - }, - async refreshToken(client) { - const response = await client.post(`${baseUrl}/refresh`, {}); - this.user.accessToken = response.accessToken; localStorage.setItem('jwt', this.user.accessToken); - this.startRefreshTokenTimer(); }, + + logout() { + localStorage.setItem('jwt', ''); + this.user = null; + + this.stopRefreshTokenTimer(); + }, + + async refreshToken(client) { + const response = await client.post(`${baseUrl}/refresh`); + this.user.accessToken = response.accessToken; + localStorage.setItem('jwt', this.user.accessToken); + + this.startRefreshTokenTimer(); + }, + startRefreshTokenTimer() { const timeout = 50 * 1000; this.refreshTokenTimeout = setTimeout(this.refreshToken, timeout); }, + stopRefreshTokenTimer() { clearTimeout(this.refreshTokenTimeout); } diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index d62c6d6..4893403 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -1,5 +1,9 @@