forked from tsai/budibase
21 changed files with 231 additions and 215 deletions
@ -1,125 +0,0 @@ |
|||||
static_resources: |
|
||||
listeners: |
|
||||
- name: main_listener |
|
||||
address: |
|
||||
socket_address: { address: 0.0.0.0, port_value: 10000 } |
|
||||
filter_chains: |
|
||||
- filters: |
|
||||
- name: envoy.filters.network.http_connection_manager |
|
||||
typed_config: |
|
||||
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager |
|
||||
stat_prefix: ingress |
|
||||
codec_type: auto |
|
||||
route_config: |
|
||||
name: local_route |
|
||||
virtual_hosts: |
|
||||
- name: local_services |
|
||||
domains: ["*"] |
|
||||
routes: |
|
||||
- match: { prefix: "/db/" } |
|
||||
route: |
|
||||
cluster: couchdb-service |
|
||||
prefix_rewrite: "/" |
|
||||
|
|
||||
- match: { prefix: "/cache/" } |
|
||||
route: |
|
||||
cluster: redis-service |
|
||||
prefix_rewrite: "/" |
|
||||
|
|
||||
- match: { prefix: "/api/" } |
|
||||
route: |
|
||||
cluster: server-dev |
|
||||
|
|
||||
- match: { prefix: "/app_" } |
|
||||
route: |
|
||||
cluster: server-dev |
|
||||
|
|
||||
- match: { prefix: "/builder/" } |
|
||||
route: |
|
||||
cluster: builder-dev |
|
||||
|
|
||||
- match: { prefix: "/builder" } |
|
||||
route: |
|
||||
cluster: builder-dev |
|
||||
prefix_rewrite: "/builder/" |
|
||||
|
|
||||
# minio is on the default route because this works |
|
||||
# best, minio + AWS SDK doesn't handle path proxy |
|
||||
- match: { prefix: "/" } |
|
||||
route: |
|
||||
cluster: minio-service |
|
||||
|
|
||||
http_filters: |
|
||||
- name: envoy.filters.http.router |
|
||||
|
|
||||
clusters: |
|
||||
- name: minio-service |
|
||||
connect_timeout: 0.25s |
|
||||
type: strict_dns |
|
||||
lb_policy: round_robin |
|
||||
load_assignment: |
|
||||
cluster_name: minio-service |
|
||||
endpoints: |
|
||||
- lb_endpoints: |
|
||||
- endpoint: |
|
||||
address: |
|
||||
socket_address: |
|
||||
address: minio-service |
|
||||
port_value: 9000 |
|
||||
|
|
||||
- name: couchdb-service |
|
||||
connect_timeout: 0.25s |
|
||||
type: strict_dns |
|
||||
lb_policy: round_robin |
|
||||
load_assignment: |
|
||||
cluster_name: couchdb-service |
|
||||
endpoints: |
|
||||
- lb_endpoints: |
|
||||
- endpoint: |
|
||||
address: |
|
||||
socket_address: |
|
||||
address: couchdb-service |
|
||||
port_value: 5984 |
|
||||
|
|
||||
- name: redis-service |
|
||||
connect_timeout: 0.25s |
|
||||
type: strict_dns |
|
||||
lb_policy: round_robin |
|
||||
load_assignment: |
|
||||
cluster_name: redis-service |
|
||||
endpoints: |
|
||||
- lb_endpoints: |
|
||||
- endpoint: |
|
||||
address: |
|
||||
socket_address: |
|
||||
address: redis-service |
|
||||
port_value: 6379 |
|
||||
|
|
||||
- name: server-dev |
|
||||
connect_timeout: 0.25s |
|
||||
type: strict_dns |
|
||||
lb_policy: round_robin |
|
||||
load_assignment: |
|
||||
cluster_name: server-dev |
|
||||
endpoints: |
|
||||
- lb_endpoints: |
|
||||
- endpoint: |
|
||||
address: |
|
||||
socket_address: |
|
||||
address: host.docker.internal |
|
||||
port_value: 4001 |
|
||||
|
|
||||
- name: builder-dev |
|
||||
connect_timeout: 15s |
|
||||
type: strict_dns |
|
||||
lb_policy: round_robin |
|
||||
load_assignment: |
|
||||
cluster_name: builder-dev |
|
||||
endpoints: |
|
||||
- lb_endpoints: |
|
||||
- endpoint: |
|
||||
address: |
|
||||
socket_address: |
|
||||
address: host.docker.internal |
|
||||
port_value: 3000 |
|
||||
|
|
||||
@ -0,0 +1,53 @@ |
|||||
|
const CouchDB = require("../db") |
||||
|
const { Cookies } = require("../constants") |
||||
|
const { getAppId, setCookie, getCookie } = require("../utils") |
||||
|
const { StaticDatabases } = require("../db/utils") |
||||
|
|
||||
|
async function setCurrentAppContext(ctx) { |
||||
|
let role = "PUBLIC" |
||||
|
|
||||
|
// Current app cookie
|
||||
|
let appId = getAppId(ctx) |
||||
|
if (!appId) { |
||||
|
ctx.user = { |
||||
|
role, |
||||
|
} |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
const currentAppCookie = getCookie(ctx, Cookies.CurrentApp, { decrypt: true }) |
||||
|
const appIdChanged = appId && currentAppCookie.appId !== appId |
||||
|
if (appIdChanged) { |
||||
|
try { |
||||
|
// get roles for user from global DB
|
||||
|
const db = new CouchDB(StaticDatabases.USER) |
||||
|
const user = await db.get(ctx.user) |
||||
|
role = user.roles[appId] |
||||
|
} catch (err) { |
||||
|
// no user exists
|
||||
|
} |
||||
|
} else if (currentAppCookie.appId) { |
||||
|
appId = currentAppCookie.appId |
||||
|
} |
||||
|
setCookie(ctx, { appId, role }, Cookies.CurrentApp, { encrypt: true }) |
||||
|
return appId |
||||
|
} |
||||
|
|
||||
|
module.exports = async (ctx, next) => { |
||||
|
try { |
||||
|
// check the actual user is authenticated first
|
||||
|
const authCookie = getCookie(ctx, Cookies.Auth, { decrypt: true }) |
||||
|
|
||||
|
if (authCookie) { |
||||
|
ctx.isAuthenticated = true |
||||
|
ctx.user = authCookie._id |
||||
|
} |
||||
|
|
||||
|
ctx.appId = await setCurrentAppContext(ctx) |
||||
|
|
||||
|
await next() |
||||
|
} catch (err) { |
||||
|
console.log(err) |
||||
|
ctx.throw(err.status || 403, err.text) |
||||
|
} |
||||
|
} |
||||
@ -1,9 +1,11 @@ |
|||||
const jwt = require("./passport/jwt") |
const jwt = require("./passport/jwt") |
||||
const local = require("./passport/local") |
const local = require("./passport/local") |
||||
const google = require("./passport/google") |
const google = require("./passport/google") |
||||
|
const authenticated = require("./authenticated") |
||||
|
|
||||
module.exports = { |
module.exports = { |
||||
google, |
google, |
||||
jwt, |
jwt, |
||||
local, |
local, |
||||
|
authenticated, |
||||
} |
} |
||||
|
|||||
@ -0,0 +1,31 @@ |
|||||
|
<script> |
||||
|
import { Button, Label, Input, TextArea, Spacer } from "@budibase/bbui" |
||||
|
import { auth } from "stores/backend" |
||||
|
|
||||
|
let username = "" |
||||
|
let password = "" |
||||
|
|
||||
|
async function login() { |
||||
|
const json = await auth.login({ |
||||
|
username, |
||||
|
password, |
||||
|
}) |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<form on:submit|preventDefault> |
||||
|
<Spacer large /> |
||||
|
<Label small>Email</Label> |
||||
|
<Input outline bind:value={username} /> |
||||
|
<Spacer large /> |
||||
|
<Label small>Password</Label> |
||||
|
<Input outline type="password" on:change bind:value={password} /> |
||||
|
<Spacer large /> |
||||
|
<Button primary on:click={login}>Login</Button> |
||||
|
</form> |
||||
|
|
||||
|
<style> |
||||
|
form { |
||||
|
width: 60%; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1 @@ |
|||||
|
export { LoginForm } from "./LoginForm.svelte" |
||||
@ -0,0 +1,22 @@ |
|||||
|
import { writable, get } from "svelte/store" |
||||
|
import api from "../../builderStore/api" |
||||
|
|
||||
|
export function createAuthStore() { |
||||
|
const { subscribe } = writable({}) |
||||
|
|
||||
|
return { |
||||
|
subscribe, |
||||
|
login: async () => { |
||||
|
const response = await api.post(`/api/admin/auth/authenticate`) |
||||
|
const json = await response.json() |
||||
|
set({ user: json }) |
||||
|
}, |
||||
|
logout: async () => { |
||||
|
const response = await api.post(`/api/auth/logout`) |
||||
|
const json = await response.json() |
||||
|
set({ user: null }) |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export const auth = createAuthStore() |
||||
@ -1,8 +1,18 @@ |
|||||
const Router = require("@koa/router") |
const Router = require("@koa/router") |
||||
|
const { passport } = require("@budibase/auth") |
||||
const authController = require("../controllers/auth") |
const authController = require("../controllers/auth") |
||||
|
|
||||
const router = Router() |
const router = Router() |
||||
|
|
||||
router.post("/api/auth/authenticate", authController.authenticate) |
router |
||||
|
.post("/api/admin/auth", authController.authenticate) |
||||
|
.get("/api/auth/google", passport.authenticate("google")) |
||||
|
.get( |
||||
|
"/api/auth/google/callback", |
||||
|
passport.authenticate("google", { |
||||
|
successRedirect: "/app", |
||||
|
failureRedirect: "/", |
||||
|
}) |
||||
|
) |
||||
|
|
||||
module.exports = router |
module.exports = router |
||||
|
|||||
@ -1,30 +0,0 @@ |
|||||
const { passport, getAppId, setCookie, Cookies } = require("@budibase/auth") |
|
||||
|
|
||||
module.exports = async (ctx, next) => { |
|
||||
// do everything we can to make sure the appId is held correctly
|
|
||||
let appId = getAppId(ctx) |
|
||||
const cookieAppId = ctx.cookies.get(Cookies.CurrentApp) |
|
||||
// const builtinRoles = getBuiltinRoles()
|
|
||||
if (appId && cookieAppId !== appId) { |
|
||||
setCookie(ctx, appId, Cookies.CurrentApp) |
|
||||
} else if (cookieAppId) { |
|
||||
appId = cookieAppId |
|
||||
} |
|
||||
|
|
||||
return passport.authenticate("jwt", async (err, user) => { |
|
||||
if (err) { |
|
||||
return ctx.throw(err.status || 403, err) |
|
||||
} |
|
||||
|
|
||||
try { |
|
||||
ctx.appId = appId |
|
||||
ctx.isAuthenticated = true |
|
||||
// TODO: introduce roles again
|
|
||||
ctx.user = user |
|
||||
await next() |
|
||||
} catch (err) { |
|
||||
console.log(err) |
|
||||
ctx.throw(err.status || 403, err.text) |
|
||||
} |
|
||||
})(ctx, next) |
|
||||
} |
|
||||
@ -1,7 +0,0 @@ |
|||||
/** |
|
||||
* Check the user token, used when creating admin resources, like for example |
|
||||
* a global user record. |
|
||||
*/ |
|
||||
module.exports = async (ctx, next) => { |
|
||||
return next() |
|
||||
} |
|
||||
Loading…
Reference in new issue