diff options
Diffstat (limited to 'src/browser')
| -rw-r--r-- | src/browser/package-lock.json | 31 | ||||
| -rw-r--r-- | src/browser/package.json | 3 | ||||
| -rw-r--r-- | src/browser/src/api/account.js | 178 | ||||
| -rw-r--r-- | src/browser/src/constants.js | 15 | ||||
| -rw-r--r-- | src/browser/src/main.js | 5 | ||||
| -rw-r--r-- | src/browser/src/router.js | 27 | ||||
| -rw-r--r-- | src/browser/src/store.js | 14 | ||||
| -rw-r--r-- | src/browser/src/views/Login.vue | 9 | ||||
| -rw-r--r-- | src/browser/src/views/OidcCallback.vue | 8 |
9 files changed, 232 insertions, 58 deletions
diff --git a/src/browser/package-lock.json b/src/browser/package-lock.json index 6e840a1..2e5511f 100644 --- a/src/browser/package-lock.json +++ b/src/browser/package-lock.json @@ -463,6 +463,11 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -721,6 +726,11 @@ } } }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -744,6 +754,11 @@ "which": "^2.0.1" } }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, "css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", @@ -1963,6 +1978,17 @@ "has": "^1.0.3" } }, + "oidc-client": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/oidc-client/-/oidc-client-1.10.1.tgz", + "integrity": "sha512-/QB5Nl7c9GmT9ir1E+OVY3+yZZnuk7Qa9ZEAJqSvDq0bAyAU9KAgeKipTEfKjGdGLTeOLy9FRWuNpULMkfZydQ==", + "requires": { + "base64-js": "^1.3.0", + "core-js": "^2.6.4", + "crypto-js": "^3.1.9-1", + "uuid": "^3.3.2" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -2743,6 +2769,11 @@ "object.getownpropertydescriptors": "^2.1.0" } }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/src/browser/package.json b/src/browser/package.json index a6d2e0f..baec9c1 100644 --- a/src/browser/package.json +++ b/src/browser/package.json @@ -7,8 +7,9 @@ "build": "vite build" }, "dependencies": { - "vue": "^3.0.0-rc.1", + "oidc-client": "^1.10.1", "vue-router": "^4.0.0-0", + "vue": "^3.0.0-rc.1", "vuex": "^4.0.0-0" }, "devDependencies": { diff --git a/src/browser/src/api/account.js b/src/browser/src/api/account.js index 9ba609b..665eb3f 100644 --- a/src/browser/src/api/account.js +++ b/src/browser/src/api/account.js @@ -1,37 +1,171 @@ import constants from "../constants"; +import Oidc from "oidc-client"; +import store from "../store"; + +const userManager = new Oidc.UserManager({ + authority: constants.api_address, + client_id: "browser", + redirect_uri: `${constants.client_address}/oidc-callback`, + post_logout_redirect_uri: constants.client_address, + response_type: "code", + scope: "openid profile main_api offline_access", + accessTokenExpiringNotificationTime: 10, + automaticSilentRenew: true, + filterProtocolClaims: true, + loadUserInfo: true, + revokeAccessTokenOnSignout: true, +}); + +Oidc.Log.logger = console; +Oidc.Log.level = Oidc.Log.INFO; +let currentUser; +let signedIn = false; + +userManager.events.addUserLoaded(function (user) { + store.commit("setProfileData", user); + console.log("New user:", arguments); + console.log("Access_token: ", user.access_token); +}); + +userManager.events.addAccessTokenExpiring(function () { + console.log("AccessToken Expiring", arguments); +}); + +userManager.events.addAccessTokenExpired(function () { + console.log("AccessToken Expired", arguments); + userManager + .signoutRedirect() + .then(function (resp) { + console.log("signed out", resp); + }) + .catch(function (err) { + console.log(err); + }); +}); + +userManager.events.addSilentRenewError(function () { + console.error("Silent Renew Error:", arguments); +}); + +userManager.events.addUserSignedOut(function () { + alert("Logout"); + console.log("UserSignedOut:", arguments); + //userManager.removeUser(); + userManager + .signoutRedirect() + .then(function (resp) { + console.log("signed out", resp); + }) + .catch(function (err) { + console.log(err); + }); +}); export default { - async loginAsync(username, password) { - let response = await fetch(constants.API_ADDRESS + "/account/login", { - method: "POST", - credentials: "include", - headers: { - "Content-Type": "application/json;charset=utf-8", - }, - body: JSON.stringify({ - username, - password, - }), + signIn() { + userManager.signinRedirect().catch(function (err) { + console.log(err); }); + }, - return response; + signinRedirectCallback() { + userManager.signinRedirectCallback().then( + () => { + console.log("Logged in"); + }, + (error) => { + console.error(error); + } + ); }, - async getProfileAsync() { - let response = await fetch(constants.API_ADDRESS + "/account/me", { - method: "GET", - credentials: "include", + + signOut() { + var self = this; + userManager + .signoutRedirect() + .then(function (resp) { + self.signedIn = false; + console.log("signed out", resp); + }) + .catch(function (err) { + console.log(err); + }); + }, + + showTokens() { + userManager.getUser().then(function (user) { + if (user) { + console.log("Profile", user.profile); + console.log("Role", user.profile.role); + } else { + self.signIn(); + } }); + }, - return response; + getUser() { + let self = this; + return new Promise((resolve, reject) => { + userManager + .getUser() + .then(function (user) { + if (user == null) { + self.signIn(); + return resolve(null); + } else { + return resolve(user); + } + }) + .catch(function (err) { + console.log(err); + return reject(err); + }); + }); }, - async logoutAsync() { - let response = await fetch(constants.API_ADDRESS + "/account/logout", { - method: "GET", - credentials: "include", + + getSignedIn() { + let self = this; + return new Promise((resolve, reject) => { + userManager + .getUser() + .then(function (user) { + if (user == null) { + self.signIn(); + return resolve(false); + } else { + currentUser = user; + signedIn = true; + return resolve(signedIn); + } + }) + .catch(function (err) { + console.log(err); + return reject(err); + }); }); + }, - return response; + getRole() { + let self = this; + return new Promise((resolve, reject) => { + userManager + .getUser() + .then(function (user) { + if (user == null) { + self.signIn(); + return resolve(false); + } else { + currentUser = user; + return resolve(user.profile.role); + } + }) + .catch(function (err) { + console.log(err); + return reject(err); + }); + }); }, + async sendResetPasswordMailAsync(username) { let response = await fetch(constants.API_ADDRESS + "/account/forgot", { method: "GET", diff --git a/src/browser/src/constants.js b/src/browser/src/constants.js index ddeebe8..471cc92 100644 --- a/src/browser/src/constants.js +++ b/src/browser/src/constants.js @@ -1,13 +1,12 @@ -const constants = { - API_ADDRESS: "http://localhost:5001/api", +export default { + api_address: "http://localhost:5001", + client_address: "http://localhost:3000", storageKeys: { - COOKIE_LAST_SEEN: "cookie-last-seen", + cookie_last_seen: "cookie-last-seen", }, types: { - SET_PROFILE_DATA: "set-profile-data", - LOGIN_ASYNC: "login-async", - DONWLOAD_PROFILE_DATA: "download-profile-data-async", + set_profile_data: "set-profile-data", + login_async: "login-async", + download_profile_data: "download-profile-data-async", }, }; - -export default constants; diff --git a/src/browser/src/main.js b/src/browser/src/main.js index db7debc..89ba0ea 100644 --- a/src/browser/src/main.js +++ b/src/browser/src/main.js @@ -3,7 +3,4 @@ import App from "./App.vue"; import router from "./router"; import store from "./store"; -createApp(App) - .use(store) - .use(router) - .mount("#app"); +createApp(App).use(store).use(router).mount("#app"); diff --git a/src/browser/src/router.js b/src/browser/src/router.js index 4b25557..0fd5462 100644 --- a/src/browser/src/router.js +++ b/src/browser/src/router.js @@ -1,4 +1,5 @@ import { createRouter, createWebHistory } from "vue-router"; + import store from "./store"; import Home from "./views/Home.vue"; @@ -9,48 +10,54 @@ import Privacy from "./views/Privacy.vue"; import Transactions from "./views/Transactions.vue"; import Settings from "./views/Settings.vue"; import Account from "./views/Account.vue"; +import OidcCallback from "./views/OidcCallback.vue"; const routes = [ { path: "/", - allowUnauthenticated: false, + isPublic: false, component: Home, }, { path: "/transactions", - allowUnauthenticated: false, + isPublic: false, component: Transactions, }, { path: "/settings", - allowUnauthenticated: false, + isPublic: false, component: Settings, }, { path: "/account", - allowUnauthenticated: false, + isPublic: false, component: Account, }, { path: "/login", - allowUnauthenticated: true, + isPublic: true, component: Login, }, { path: "/forgot", - allowUnauthenticated: true, + isPublic: true, component: Forgot, }, { path: "/signup", - allowUnauthenticated: true, + isPublic: true, component: Signup, }, { path: "/privacy", - allowUnauthenticated: true, + isPublic: true, component: Privacy, }, + { + path: "/oidc-callback", + isPublic: true, + component: OidcCallback, + }, ]; const router = createRouter({ @@ -60,8 +67,8 @@ const router = createRouter({ router.beforeEach((to, from, next) => { console.log("store.state.profile.isAuthenticated: " + store.state.profile.isAuthenticated); - const unRestrictedPaths = routes.filter((r) => r.allowUnauthenticated); - if (unRestrictedPaths.every((c) => c.path !== to.path) && !store.state.profile.isAuthenticated) + const publicPaths = routes.filter((r) => r.isPublic); + if (publicPaths.every((c) => c.path !== to.path) && !store.state.profile.isAuthenticated) next("/login"); else next(); }); diff --git a/src/browser/src/store.js b/src/browser/src/store.js index 0dd3195..c775ed8 100644 --- a/src/browser/src/store.js +++ b/src/browser/src/store.js @@ -3,21 +3,11 @@ import { createStore } from "vuex"; export default createStore({ strict: true, state: { - profile: { - id: "", - username: "", - sessionStart: "", - isAuthenticated: false, - }, + profile: {}, }, mutations: { setProfileData(state, profile) { - state.profile = { - id: profile.id, - username: profile.username, - sessionStart: profile.sessionStart, - isAuthenticated: profile.id !== "", - }; + state.profile = profile; }, }, actions: {}, diff --git a/src/browser/src/views/Login.vue b/src/browser/src/views/Login.vue index 07b5b31..a94ea9e 100644 --- a/src/browser/src/views/Login.vue +++ b/src/browser/src/views/Login.vue @@ -70,6 +70,7 @@ import store from "../store"; import router from "../router"; import account from "../api/account"; + export default { components: { Alert, @@ -89,6 +90,12 @@ export default { }, }); + account.signIn() + .then((user) => console.log(user)) + .catch((err) => console.error(err)); + + function submitForm() {} + /* async function submitForm() { model.isLoading = true; return; @@ -122,7 +129,7 @@ export default { } } } - +*/ const forgotPassword = () => router.replace("/forgot"); const signup = () => router.replace("/signup"); diff --git a/src/browser/src/views/OidcCallback.vue b/src/browser/src/views/OidcCallback.vue new file mode 100644 index 0000000..10ccd52 --- /dev/null +++ b/src/browser/src/views/OidcCallback.vue @@ -0,0 +1,8 @@ +<template> + <h1>callback</h1> +</template> + +<script> +import account from "../api/account"; +account.signinRedirectCallback(); +</script> |
