aboutsummaryrefslogtreecommitdiffstats
path: root/src/browser
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2020-08-09 15:51:33 +0200
committerivarlovlie <git@ivarlovlie.no>2020-08-09 15:51:33 +0200
commit8614d18522441543e08c37c68121fed1fa8d6ae7 (patch)
treedd53ae13bdf269098e385107d27dcc2a0d8d73db /src/browser
parent9b2c6f550a3a705e02dc4f86797c9223ad59d5fa (diff)
downloaddough-8614d18522441543e08c37c68121fed1fa8d6ae7.tar.xz
dough-8614d18522441543e08c37c68121fed1fa8d6ae7.zip
auth user
Diffstat (limited to 'src/browser')
-rw-r--r--src/browser/package-lock.json31
-rw-r--r--src/browser/package.json3
-rw-r--r--src/browser/src/api/account.js178
-rw-r--r--src/browser/src/constants.js15
-rw-r--r--src/browser/src/main.js5
-rw-r--r--src/browser/src/router.js27
-rw-r--r--src/browser/src/store.js14
-rw-r--r--src/browser/src/views/Login.vue9
-rw-r--r--src/browser/src/views/OidcCallback.vue8
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>