mirror of https://github.com/Budibase/budibase.git
22 changed files with 259 additions and 217 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 local = require("./passport/local") |
|||
const google = require("./passport/google") |
|||
const authenticated = require("./authenticated") |
|||
|
|||
module.exports = { |
|||
google, |
|||
jwt, |
|||
local, |
|||
authenticated, |
|||
} |
|||
|
|||
@ -0,0 +1,52 @@ |
|||
<script> |
|||
import { Button, Label, Input, TextArea, Spacer } from "@budibase/bbui" |
|||
import { notifier } from "builderStore/store/notifications" |
|||
import { auth } from "stores/backend" |
|||
|
|||
let username = "" |
|||
let password = "" |
|||
|
|||
async function login() { |
|||
try { |
|||
const json = await auth.login({ |
|||
username, |
|||
password, |
|||
}) |
|||
notifier.success("Logged in successfully.") |
|||
} catch (err) { |
|||
console.error(err) |
|||
notifier.danger(`Error logging in: ${err}`) |
|||
} |
|||
} |
|||
|
|||
async function createTestUser() { |
|||
try { |
|||
const json = await auth.createUser({ |
|||
email: "test@test.com", |
|||
password: "test", |
|||
roles: {}, |
|||
}) |
|||
notifier.success("Test user created") |
|||
} catch (err) { |
|||
console.error(err) |
|||
} |
|||
} |
|||
</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> |
|||
<Button secondary on:click={createTestUser}>Create Test User</Button> |
|||
</form> |
|||
|
|||
<style> |
|||
form { |
|||
width: 60%; |
|||
} |
|||
</style> |
|||
@ -0,0 +1 @@ |
|||
export { LoginForm } from "./LoginForm.svelte" |
|||
@ -0,0 +1,32 @@ |
|||
import { writable, get } from "svelte/store" |
|||
import api from "../../builderStore/api" |
|||
|
|||
export function createAuthStore() { |
|||
const { subscribe, set } = writable({}) |
|||
|
|||
const user = localStorage.getItem("auth:user") |
|||
if (user) set({ user: JSON.parse(user) }) |
|||
|
|||
return { |
|||
subscribe, |
|||
login: async creds => { |
|||
const response = await api.post(`/api/admin/auth`, creds) |
|||
const json = await response.json() |
|||
if (json.user) { |
|||
localStorage.setItem("auth:user", JSON.stringify(json.user)) |
|||
set({ user: json.user }) |
|||
} |
|||
}, |
|||
logout: async () => { |
|||
const response = await api.post(`/api/auth/logout`) |
|||
const json = await response.json() |
|||
set({ user: false }) |
|||
}, |
|||
createUser: async user => { |
|||
const response = await api.post(`/api/admin/users`, user) |
|||
const json = await response.json() |
|||
}, |
|||
} |
|||
} |
|||
|
|||
export const auth = createAuthStore() |
|||
@ -1,8 +1,18 @@ |
|||
const Router = require("@koa/router") |
|||
const { passport } = require("@budibase/auth") |
|||
const authController = require("../controllers/auth") |
|||
|
|||
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 |
|||
|
|||
@ -1,32 +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 next() |
|||
|
|||
// 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