diff --git a/.example.env b/.example.env
new file mode 100644
index 0000000..7669a3d
--- /dev/null
+++ b/.example.env
@@ -0,0 +1,4 @@
+SAPPER_KEYCLOAK_CLIENT_ID=
+SAPPER_KEYCLOAK_CLIENT_SECRET=
+SAPPER_KEYCLOAK_REALM=
+SAPPER_KEYCLOAK_AUTHSERVER_URL=https://keycloak.yoursite.com/auth
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index f1f880d..563ba44 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@
yarn-error.log
/cypress/screenshots/
/__sapper__/
+.env
\ No newline at end of file
diff --git a/README.md b/README.md
index ed28d6c..04d2e7d 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,17 @@
# Sapper Authentication Demo
-A demonstration of Authentication with Sapper
+A demonstration of Authentication with Sapper with Keycloak and passport.js
Includes:
* JWT
* Secure cookies
* HTTP Only cookies
+* Keycloak Integration with Passport
## Usage
-`npm run dev`
+1. Set up Keycloak and Keycloak Client (DevOps Bliss Course shows you how)
+2. Create `.env` file with values from Keycloak
+3. Install `dotenv-cli` - `npm i -g dotenv-cli`
+4. Run - `dotenv -e .env npm run dev`
diff --git a/backend/auth.js b/backend/auth.js
deleted file mode 100644
index 1a28aff..0000000
--- a/backend/auth.js
+++ /dev/null
@@ -1,46 +0,0 @@
-'use strict'
-
-const { promisify } = require('util')
-const plugin = require('hapi-auth-jwt2')
-const jwt = require('jsonwebtoken')
-
-const sign = promisify(jwt.sign)
-const seed = 'some-totally-secret-string'
-
-exports.plugin = plugin
-
-exports.strategy = {
- type: 'jwt',
- name: 'jwt',
- config: {
- cookieKey: 'my-jwt',
- validate: ({ id, role, scp }) => ({
- isValid: true,
- credentials: {
- id,
- role,
- scope: scp
- }
- }),
- verifyOptions: {
- algorithms: [ 'HS256' ]
- }
- }
-}
-
-exports.createJsonWebToken = async function (user) {
- const { email, scope, name } = user
- const exp = new Date()
- exp.setDate(exp.getDate() + 1)
- return sign({ email, scope, name, exp: exp.getTime() }, seed)
-}
-
-exports.cookieConfig = {
- encoding: 'none',
- isHttpOnly: true,
- ttl: 1000 * 60 * 60 * 24 * 3,
- isSecure: false,
- isSameSite: false,
- domain: 'localhost',
- path: '/'
-}
\ No newline at end of file
diff --git a/backend/package-lock.json b/backend/package-lock.json
deleted file mode 100644
index 0c05f5e..0000000
--- a/backend/package-lock.json
+++ /dev/null
@@ -1,455 +0,0 @@
-{
- "name": "backend",
- "version": "1.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@hapi/accept": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.1.tgz",
- "integrity": "sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x",
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/address": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.1.tgz",
- "integrity": "sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "^9.0.0"
- }
- },
- "@hapi/ammo": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-5.0.1.tgz",
- "integrity": "sha512-FbCNwcTbnQP4VYYhLNGZmA76xb2aHg9AMPiy18NZyWMG310P5KdFGyA9v2rm5ujrIny77dEEIkMOwl0Xv+fSSA==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/b64": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz",
- "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/boom": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.0.tgz",
- "integrity": "sha512-4nZmpp4tXbm162LaZT45P7F7sgiem8dwAh2vHWT6XX24dozNjGMg6BvKCRvtCUcmcXqeMIUqWN8Rc5X8yKuROQ==",
- "requires": {
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/bounce": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-2.0.0.tgz",
- "integrity": "sha512-JesW92uyzOOyuzJKjoLHM1ThiOvHPOLDHw01YV8yh5nCso7sDwJho1h0Ad2N+E62bZyz46TG3xhAi/78Gsct6A==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x",
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/bourne": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz",
- "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==",
- "dev": true
- },
- "@hapi/call": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/call/-/call-8.0.0.tgz",
- "integrity": "sha512-4xHIWWqaIDQlVU88XAnomACSoC7iWUfaLfdu2T7I0y+HFFwZUrKKGfwn6ik4kwKsJRMnOliG3UXsF8V/94+Lkg==",
- "dev": true,
- "requires": {
- "@hapi/address": "4.x.x",
- "@hapi/boom": "9.x.x",
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/catbox": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-11.1.0.tgz",
- "integrity": "sha512-FDEjfn26RZRyOEPeZdaAL7dRiAK5FOGuwTnTw0gxK30csAlKeOHsEnoIxnLIXx7QOS17eUaOk6+MiweWQM6Keg==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x",
- "@hapi/hoek": "9.x.x",
- "@hapi/joi": "17.x.x",
- "@hapi/podium": "4.x.x"
- }
- },
- "@hapi/catbox-memory": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-5.0.0.tgz",
- "integrity": "sha512-ByuxVJPHNaXwLzbBv4GdTr6ccpe1nG+AfYt+8ftDWEJY7EWBWzD+Klhy5oPTDGzU26pNUh1e7fcYI1ILZRxAXQ==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x",
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/content": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@hapi/content/-/content-5.0.2.tgz",
- "integrity": "sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x"
- }
- },
- "@hapi/cryptiles": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.0.0.tgz",
- "integrity": "sha512-Yq43ti9N51Z7jbm0Q7YVCcofA+4Gh5wsBX/jZ++Z+FM8GYfBQ1WmI9ufZSL+BVX8vRxzDkdQ2fKoG6cxOQlnVQ==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x"
- }
- },
- "@hapi/file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/file/-/file-2.0.0.tgz",
- "integrity": "sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ==",
- "dev": true
- },
- "@hapi/formula": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz",
- "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==",
- "dev": true
- },
- "@hapi/hapi": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-19.1.1.tgz",
- "integrity": "sha512-rpQzSs0XsHSF7usM4qdJJ0Bcmhs9stWhUW3OiamW33bw4qL8q3uEgUKB9KH8ODmluCAkkXOQ0X0Dh9t94E5VIw==",
- "dev": true,
- "requires": {
- "@hapi/accept": "^5.0.1",
- "@hapi/ammo": "^5.0.1",
- "@hapi/boom": "9.x.x",
- "@hapi/bounce": "2.x.x",
- "@hapi/call": "8.x.x",
- "@hapi/catbox": "11.x.x",
- "@hapi/catbox-memory": "5.x.x",
- "@hapi/heavy": "7.x.x",
- "@hapi/hoek": "9.x.x",
- "@hapi/joi": "17.x.x",
- "@hapi/mimos": "5.x.x",
- "@hapi/podium": "4.x.x",
- "@hapi/shot": "5.x.x",
- "@hapi/somever": "3.x.x",
- "@hapi/statehood": "^7.0.2",
- "@hapi/subtext": "^7.0.3",
- "@hapi/teamwork": "4.x.x",
- "@hapi/topo": "5.x.x"
- }
- },
- "@hapi/heavy": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-7.0.0.tgz",
- "integrity": "sha512-n/nheUG6zNleWkjY+3fzV3VJIAumUCaa/WoTmurjqlYY5JgC5ZKOpvP7tWi8rXmKZhbcXgjH3fHFoM55LoBT7g==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x",
- "@hapi/hoek": "9.x.x",
- "@hapi/joi": "17.x.x"
- }
- },
- "@hapi/hoek": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz",
- "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw=="
- },
- "@hapi/iron": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz",
- "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==",
- "dev": true,
- "requires": {
- "@hapi/b64": "5.x.x",
- "@hapi/boom": "9.x.x",
- "@hapi/bourne": "2.x.x",
- "@hapi/cryptiles": "5.x.x",
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/joi": {
- "version": "17.1.1",
- "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz",
- "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==",
- "dev": true,
- "requires": {
- "@hapi/address": "^4.0.1",
- "@hapi/formula": "^2.0.0",
- "@hapi/hoek": "^9.0.0",
- "@hapi/pinpoint": "^2.0.0",
- "@hapi/topo": "^5.0.0"
- }
- },
- "@hapi/mimos": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-5.0.0.tgz",
- "integrity": "sha512-EVS6wJYeE73InTlPWt+2e3Izn319iIvffDreci3qDNT+t3lA5ylJ0/SoTaID8e0TPNUkHUSsgJZXEmLHvoYzrA==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "9.x.x",
- "mime-db": "1.x.x"
- }
- },
- "@hapi/nigel": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-4.0.0.tgz",
- "integrity": "sha512-Bqs1pjcDnDQo/XGoiCCNHWTFcMzPbz3L4KU04njeFQMzzEmsojMRX7TX+PezQYCMKtHJOtMg0bHxZyMGqYtbSA==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "9.x.x",
- "@hapi/vise": "4.x.x"
- }
- },
- "@hapi/pez": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-5.0.2.tgz",
- "integrity": "sha512-jr1lAm8mE7J2IBxvDIuDI1qy2aAsoaD2jxOUd/7JRg/Vmrzco8HdKhtz4fKk6KHU6zbbsAp5m5aSWWVTUrag7g==",
- "dev": true,
- "requires": {
- "@hapi/b64": "5.x.x",
- "@hapi/boom": "9.x.x",
- "@hapi/content": "^5.0.2",
- "@hapi/hoek": "9.x.x",
- "@hapi/nigel": "4.x.x"
- }
- },
- "@hapi/pinpoint": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz",
- "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==",
- "dev": true
- },
- "@hapi/podium": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.0.tgz",
- "integrity": "sha512-k/n0McAu8PvonfQRLyKKUvvdb+Gh/O5iAeIwv535Hpxw9B1qZcrYdZyWtHZ8O5PkA9/b/Kk+BdvtgcxeKMB/2g==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "9.x.x",
- "@hapi/joi": "17.x.x",
- "@hapi/teamwork": "4.x.x"
- }
- },
- "@hapi/shot": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-5.0.0.tgz",
- "integrity": "sha512-JXddnJkRh3Xhv9lY1tA+TSIUaoODKbdNIPL/M8WFvFQKOttmGaDeqTW5e8Gf01LtLI7L5DraLMULHjrK1+YNFg==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "9.x.x",
- "@hapi/joi": "17.x.x"
- }
- },
- "@hapi/somever": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-3.0.0.tgz",
- "integrity": "sha512-Upw/kmKotC9iEmK4y047HMYe4LDKsE5NWfjgX41XNKmFvxsQL7OiaCWVhuyyhU0ShDGBfIAnCH8jZr49z/JzZA==",
- "dev": true,
- "requires": {
- "@hapi/bounce": "2.x.x",
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/statehood": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-7.0.2.tgz",
- "integrity": "sha512-+0VNxysQu+UYzkfvAXq3X4aN65TnUwiR7gsq2cQ/4Rq26nCJjHAfrkYReEeshU2hPmJ3m5QuaBzyDqRm8WOpyg==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x",
- "@hapi/bounce": "2.x.x",
- "@hapi/bourne": "2.x.x",
- "@hapi/cryptiles": "5.x.x",
- "@hapi/hoek": "9.x.x",
- "@hapi/iron": "6.x.x",
- "@hapi/joi": "17.x.x"
- }
- },
- "@hapi/subtext": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-7.0.3.tgz",
- "integrity": "sha512-CekDizZkDGERJ01C0+TzHlKtqdXZxzSWTOaH6THBrbOHnsr3GY+yiMZC+AfNCypfE17RaIakGIAbpL2Tk1z2+A==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x",
- "@hapi/bourne": "2.x.x",
- "@hapi/content": "^5.0.2",
- "@hapi/file": "2.x.x",
- "@hapi/hoek": "9.x.x",
- "@hapi/pez": "^5.0.1",
- "@hapi/wreck": "17.x.x"
- }
- },
- "@hapi/teamwork": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-4.0.0.tgz",
- "integrity": "sha512-V6xYOrr5aFv/IJqNPneaYCu8vuGTKisamqHVRS3JJnbZr18TrpXdsJOYk9pjPhFti+M2YETPebQLUr820N5NoQ==",
- "dev": true
- },
- "@hapi/topo": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
- "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "^9.0.0"
- }
- },
- "@hapi/vise": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-4.0.0.tgz",
- "integrity": "sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg==",
- "dev": true,
- "requires": {
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/wreck": {
- "version": "17.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-17.0.0.tgz",
- "integrity": "sha512-d8lqCinbKyDByn7GzJDRDbitddhIEydNm44UcAMejfhEH3o4IYvKYq6K8cAqXbilXPuvZc0ErlUOg9SDdgRtMw==",
- "dev": true,
- "requires": {
- "@hapi/boom": "9.x.x",
- "@hapi/bourne": "2.x.x",
- "@hapi/hoek": "9.x.x"
- }
- },
- "buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
- },
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
- },
- "ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "hapi-auth-jwt2": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/hapi-auth-jwt2/-/hapi-auth-jwt2-10.0.0.tgz",
- "integrity": "sha512-Xax8xd3dz1vtVnJBrij/rAWb1lQVjlIQOkjIoj2nd0ZAGpsXWPyqCDd9HxMHVoezAjZAZ7JCwSfdDnjEnvrEmg==",
- "requires": {
- "@hapi/boom": "^9.0.0",
- "cookie": "^0.4.0",
- "jsonwebtoken": "^8.5.1"
- }
- },
- "jsonwebtoken": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
- "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
- "requires": {
- "jws": "^3.2.2",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
- "ms": "^2.1.1",
- "semver": "^5.6.0"
- }
- },
- "jwa": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
- "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
- "requires": {
- "buffer-equal-constant-time": "1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
- }
- },
- "jws": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
- "requires": {
- "jwa": "^1.4.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
- },
- "lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
- },
- "lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
- },
- "lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
- },
- "lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
- },
- "lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
- },
- "lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
- },
- "mime-db": {
- "version": "1.43.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
- "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
- }
- }
-}
diff --git a/backend/package.json b/backend/package.json
deleted file mode 100644
index 4a4adc4..0000000
--- a/backend/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "backend",
- "version": "1.0.0",
- "description": "",
- "main": "routes.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
- "dev": "node server.js"
- },
- "author": "",
- "license": "MIT",
- "dependencies": {
- "hapi-auth-jwt2": "^10.0.0",
- "jsonwebtoken": "^8.5.1"
- },
- "devDependencies": {
- "@hapi/hapi": "^19.1.1",
- "@hapi/joi": "^17.1.1"
- }
-}
diff --git a/backend/routes.js b/backend/routes.js
deleted file mode 100644
index 5774fb0..0000000
--- a/backend/routes.js
+++ /dev/null
@@ -1,68 +0,0 @@
-'use strict'
-
-const Joi = require('@hapi/joi')
-const { createJsonWebToken, cookieConfig } = require('./auth')
-
-const usersDatabase = [
- {
- name: 'A User',
- email: 'user@example.com',
- scope: [ 'user' ]
- },
- {
- name: 'An Owner',
- email: 'owner@example.org',
- scope: [ 'owner', 'moderator' ]
- },
- {
- name: 'An Admin',
- email: 'admin@example.net',
- scope: [ 'admin', 'secret' ]
- }
-]
-
-module.exports = [
- {
- method: 'POST',
- path: '/session',
- options: {
- validate: {
- payload: Joi.object({
- email: Joi.string().email().required(),
- password: Joi.string().required()
- })
- }
- },
- handler: async (request, h) => {
- const { email, password } = request.payload
- const user = usersDatabase.find(u => u.email === email)
-
- if (password === 'user123') {
- const jwt = await createJsonWebToken(user)
- return h
- .response()
- .state('my-jwt', jwt, cookieConfig)
- .code(201)
- }
-
- return h.response().code(401)
- }
- },
- {
- method: 'DELETE',
- path: '/session',
- handler: (request, h) => {
- return h
- .response()
- .unstate('my-jwt', cookieConfig)
- .code(200)
- }
- },
- {
- method: 'GET',
- path: '/whoami',
- handler: (request, h) => {
- return request.auth.credentials
- }
- }
-]
\ No newline at end of file
diff --git a/backend/server.js b/backend/server.js
deleted file mode 100644
index 69c7ec3..0000000
--- a/backend/server.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict'
-
-const Hapi = require('@hapi/hapi')
-const { strategy, plugin } = require('./auth')
-const routes = require('./routes')
-
-const init = async () => {
- const server = Hapi.server({
- routes: {
- cors: {
- credentials: true
- }
- },
- port: 2000,
- host: 'localhost'
- })
-
- await server.register(plugin)
- const { type, name, config } = strategy
- server.auth.strategy(type, name, config)
-
- await server.route(routes)
-
- await server.start()
- console.log('Server running on %s', server.info.uri)
-}
-
-init()
diff --git a/package-lock.json b/package-lock.json
index de6a551..bafacd1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -929,11 +929,6 @@
"integrity": "sha512-TUzWsoCbahZIIWq17mDvWyGlioKnp7v+XaqMFHC2/ESyS+DlcdUi5pqLyRUFg36etaHWZ+LXu7LhoF5vYEQLgw==",
"dev": true
},
- "@polka/url": {
- "version": "1.0.0-next.11",
- "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz",
- "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA=="
- },
"@rollup/plugin-commonjs": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz",
@@ -1024,6 +1019,11 @@
"color-convert": "^1.9.0"
}
},
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
"babel-plugin-dynamic-import-node": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
@@ -1039,6 +1039,35 @@
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
+ "base64url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
+ "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A=="
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "requires": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ }
+ }
+ },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1176,6 +1205,19 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
"convert-source-map": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
@@ -1185,27 +1227,36 @@
"safe-buffer": "~5.1.1"
}
},
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
- "dev": true
- },
- "cookie-parser": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz",
- "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==",
- "dev": true,
+ "cookie-session": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-1.4.0.tgz",
+ "integrity": "sha512-0hhwD+BUIwMXQraiZP/J7VP2YFzqo6g4WqZlWHtEHQ22t0MeZZrNBSCxC1zcaLAs8ApT3BzAKizx9gW/AP9vNA==",
"requires": {
- "cookie": "0.4.0",
- "cookie-signature": "1.0.6"
+ "cookies": "0.8.0",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2"
}
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
- "dev": true
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "cookies": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz",
+ "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==",
+ "requires": {
+ "depd": "~2.0.0",
+ "keygrip": "~1.1.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ }
+ }
},
"core-js-compat": {
"version": "3.6.4",
@@ -1255,6 +1306,16 @@
"object-keys": "^1.0.12"
}
},
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
"ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -1264,12 +1325,22 @@
"safe-buffer": "^5.0.1"
}
},
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
"electron-to-chromium": {
"version": "1.3.376",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz",
"integrity": "sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw==",
"dev": true
},
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -1309,6 +1380,11 @@
"is-symbol": "^1.0.2"
}
},
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -1327,6 +1403,79 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "requires": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ }
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -1399,12 +1548,37 @@
"uglify-js": "^3.5.1"
}
},
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ }
+ },
"http-link-header": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.0.2.tgz",
"integrity": "sha512-z6YOZ8ZEnejkcCWlGZzYXNa6i+ZaTfiTg3WhlV/YvnNya3W/RbX1bMVUMTuCrg/DrtTCQxaFCkXCz4FtLpcebg==",
"dev": true
},
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -1414,6 +1588,11 @@
"loose-envify": "^1.0.0"
}
},
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -1566,6 +1745,14 @@
"safe-buffer": "^5.0.1"
}
},
+ "keygrip": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
+ "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
+ "requires": {
+ "tsscmp": "1.0.6"
+ }
+ },
"leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -1665,18 +1852,33 @@
"sourcemap-codec": "^1.4.4"
}
},
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ },
"memorystream": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
"integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
"dev": true
},
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
"mime": {
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
@@ -1781,6 +1983,11 @@
"string.prototype.padend": "^3.0.0"
}
},
+ "oauth": {
+ "version": "0.9.15",
+ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
+ "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE="
+ },
"object-inspect": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
@@ -1805,6 +2012,14 @@
"object-keys": "^1.0.11"
}
},
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
"on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
@@ -1829,6 +2044,45 @@
"json-parse-better-errors": "^1.0.1"
}
},
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "passport": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz",
+ "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==",
+ "requires": {
+ "passport-strategy": "1.x.x",
+ "pause": "0.0.1"
+ }
+ },
+ "passport-keycloak-oauth2-oidc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/passport-keycloak-oauth2-oidc/-/passport-keycloak-oauth2-oidc-1.0.3.tgz",
+ "integrity": "sha512-NVL5UaJtgZOXDwNN72ossdjpmc+ShkfaOBzcF6YUjp7bbBxHuTsC8pGThWHGaAJrXaSIuKFjpSbgwJ4+qztirw==",
+ "requires": {
+ "passport-oauth2": "^1.5.0"
+ }
+ },
+ "passport-oauth2": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.5.0.tgz",
+ "integrity": "sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==",
+ "requires": {
+ "base64url": "3.x.x",
+ "oauth": "0.9.x",
+ "passport-strategy": "1.x.x",
+ "uid2": "0.0.x",
+ "utils-merge": "1.x.x"
+ }
+ },
+ "passport-strategy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
+ "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ="
+ },
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
@@ -1841,6 +2095,11 @@
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ },
"path-type": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
@@ -1850,6 +2109,11 @@
"pify": "^3.0.0"
}
},
+ "pause": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
+ "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
+ },
"pidtree": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
@@ -1862,21 +2126,49 @@
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
"dev": true
},
- "polka": {
- "version": "1.0.0-next.11",
- "resolved": "https://registry.npmjs.org/polka/-/polka-1.0.0-next.11.tgz",
- "integrity": "sha512-M/HBkS6ILksrDq7uvktCTev81OzuLwNtpxMyYdUhxLKQlMWdsu789XMotQU+p8JY8CM8vx8ML0HudyWjRus/lg==",
- "requires": {
- "@polka/url": "^1.0.0-next.11",
- "trouter": "^3.1.0"
- }
- },
"private": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
"integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
"dev": true
},
+ "proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ }
+ }
+ },
"read-pkg": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
@@ -1919,11 +2211,6 @@
"private": "^0.1.8"
}
},
- "regexparam": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-1.3.0.tgz",
- "integrity": "sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g=="
- },
"regexpu-core": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
@@ -2048,6 +2335,11 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
"sapper": {
"version": "0.27.10",
"resolved": "https://registry.npmjs.org/sapper/-/sapper-0.27.10.tgz",
@@ -2067,12 +2359,60 @@
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ }
+ }
+ },
"serialize-javascript": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
"integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==",
"dev": true
},
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ },
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -2178,6 +2518,11 @@
"integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
"dev": true
},
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
"string-hash": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
@@ -2282,12 +2627,23 @@
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"dev": true
},
- "trouter": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/trouter/-/trouter-3.1.0.tgz",
- "integrity": "sha512-3Swwu638QQWOefHLss9cdyLi5/9BKYmXZEXpH0KOFfB9YZwUAwHbDAcoYxaHfqAeFvbi/LqAK7rGkhCr1v1BJA==",
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ },
+ "tsscmp": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
- "regexparam": "^1.3.0"
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
}
},
"uglify-js": {
@@ -2308,6 +2664,11 @@
}
}
},
+ "uid2": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz",
+ "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I="
+ },
"unicode-canonical-property-names-ecmascript": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@@ -2336,12 +2697,22 @@
"integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
"dev": true
},
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
"upper-case": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
"integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
"dev": true
},
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ },
"validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
diff --git a/package.json b/package.json
index 3303557..9c5b3f8 100644
--- a/package.json
+++ b/package.json
@@ -3,9 +3,7 @@
"description": "TODO",
"version": "0.0.1",
"scripts": {
- "dev": "run-p dev:**",
- "dev:client": "sapper dev",
- "dev:server": "node backend/server",
+ "dev": "sapper dev",
"build": "sapper build --legacy",
"export": "sapper export --legacy",
"start": "node __sapper__/build",
@@ -15,7 +13,10 @@
},
"dependencies": {
"compression": "^1.7.1",
- "polka": "next",
+ "cookie-session": "^1.4.0",
+ "express": "^4.17.1",
+ "passport": "^0.4.1",
+ "passport-keycloak-oauth2-oidc": "^1.0.3",
"sirv": "^0.4.0"
},
"devDependencies": {
@@ -28,7 +29,6 @@
"@rollup/plugin-commonjs": "^11.0.0",
"@rollup/plugin-node-resolve": "^7.0.0",
"@rollup/plugin-replace": "^2.2.0",
- "cookie-parser": "^1.4.5",
"jsonwebtoken": "^8.5.1",
"npm-run-all": "^4.1.5",
"rollup": "^1.20.0",
diff --git a/rollup.config.js b/rollup.config.js
index e5f51ad..d278ed4 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -13,12 +13,19 @@ const legacy = !!process.env.SAPPER_LEGACY_BUILD;
const onwarn = (warning, onwarn) => (warning.code === 'CIRCULAR_DEPENDENCY' && /[/\\]@sapper[/\\]/.test(warning.message)) || onwarn(warning);
+const sapperEnv = Object.keys(process.env).filter(key => key.includes('SAPPER_') && ! key.includes('SAPPER_LEGACY_BUILD'))
+ .reduce((acc, key) => ({
+ ...acc,
+ [`process.env.${key}`]: JSON.stringify(process.env[key])
+ }), {})
+
export default {
client: {
input: config.client.input(),
output: config.client.output(),
plugins: [
replace({
+ ...sapperEnv,
'process.browser': true,
'process.env.NODE_ENV': JSON.stringify(mode)
}),
diff --git a/src/components/Nav.svelte b/src/components/Nav.svelte
index 500b338..f0c51f5 100644
--- a/src/components/Nav.svelte
+++ b/src/components/Nav.svelte
@@ -1,74 +1,113 @@
diff --git a/src/config.js b/src/config.js
new file mode 100644
index 0000000..90678c7
--- /dev/null
+++ b/src/config.js
@@ -0,0 +1,12 @@
+export default {
+ keycloak: {
+ authServerURL: process.env.SAPPER_KEYCLOAK_AUTHSERVER_URL,
+ clientID: process.env.SAPPER_KEYCLOAK_CLIENT_ID,
+ clientSecret: process.env.SAPPER_KEYCLOAK_CLIENT_SECRET,
+ realm: process.env.SAPPER_KEYCLOAK_REALM,
+ sslRequired: 'external',
+ publicClient: false,
+ callbackURL: `/auth/callback`
+ },
+ sessionKey: ['in prod use a random string here']
+}
\ No newline at end of file
diff --git a/src/routes.js b/src/routes.js
new file mode 100644
index 0000000..67a89ee
--- /dev/null
+++ b/src/routes.js
@@ -0,0 +1,10 @@
+import { Router } from '@beyonk/sapper-rbac'
+
+const routes = new Router()
+ .restrict('/admin.*', ['admin'])
+ .restrict('/organisation.*', ['member'])
+ .restrict('/profile.*', ['member'])
+ .unrestrict('/.*') // add this after the guarded sub-urls
+ .build()
+
+export default routes
\ No newline at end of file
diff --git a/src/routes/_error.svelte b/src/routes/_error.svelte
index 320e587..c197822 100644
--- a/src/routes/_error.svelte
+++ b/src/routes/_error.svelte
@@ -1,34 +1,35 @@
{error.message}
{#if dev && error.stack} -{error.stack}
+ {error.stack}
{/if}
diff --git a/src/routes/_layout.svelte b/src/routes/_layout.svelte
index 8432299..53fed24 100644
--- a/src/routes/_layout.svelte
+++ b/src/routes/_layout.svelte
@@ -1,22 +1,42 @@
-
+
You are all powerful.
\ No newline at end of file +You are all powerful.
diff --git a/src/routes/index.svelte b/src/routes/index.svelte index 198056c..cb874a0 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -1,45 +1,17 @@You are logged in as {$session.profile.name}
+You are logged in as {$session.user.username}
{:else} - ++ Login + to access +
{/if} diff --git a/src/routes/logout.svelte b/src/routes/logout.svelte index c4ee290..7361a96 100644 --- a/src/routes/logout.svelte +++ b/src/routes/logout.svelte @@ -1,22 +1,29 @@ \ No newline at end of file + goto("/"); + diff --git a/src/routes/organisation.svelte b/src/routes/organisation.svelte index 972b705..e43a275 100644 --- a/src/routes/organisation.svelte +++ b/src/routes/organisation.svelte @@ -1,3 +1,3 @@Stuff.
\ No newline at end of file +Stuff.
diff --git a/src/routes/profile.svelte b/src/routes/profile.svelte index 5c2bfaf..bfd4d4f 100644 --- a/src/routes/profile.svelte +++ b/src/routes/profile.svelte @@ -1,26 +1,20 @@ -