diff --git a/packages/hoppscotch-common/locales/en.json b/packages/hoppscotch-common/locales/en.json
index 1d70b503b..55b9a1cb9 100644
--- a/packages/hoppscotch-common/locales/en.json
+++ b/packages/hoppscotch-common/locales/en.json
@@ -308,7 +308,8 @@
"proxy_error": "Proxy error",
"script_fail": "Could not execute pre-request script",
"something_went_wrong": "Something went wrong",
- "test_script_fail": "Could not execute post-request script"
+ "test_script_fail": "Could not execute post-request script",
+ "authproviders_load_error": "Unable to load auth providers"
},
"export": {
"as_json": "Export as JSON",
diff --git a/packages/hoppscotch-common/src/components/app/ActionHandler.vue b/packages/hoppscotch-common/src/components/app/ActionHandler.vue
index 6f1cfa547..89aaa64a0 100644
--- a/packages/hoppscotch-common/src/components/app/ActionHandler.vue
+++ b/packages/hoppscotch-common/src/components/app/ActionHandler.vue
@@ -1,7 +1,7 @@
-
+
diff --git a/packages/hoppscotch-common/src/platform/auth.ts b/packages/hoppscotch-common/src/platform/auth.ts
index 529f51133..d2920c46e 100644
--- a/packages/hoppscotch-common/src/platform/auth.ts
+++ b/packages/hoppscotch-common/src/platform/auth.ts
@@ -2,6 +2,7 @@ import { ClientOptions } from "@urql/core"
import { Observable } from "rxjs"
import { Component } from "vue"
import { getI18n } from "~/modules/i18n"
+import * as E from "fp-ts/Either"
/**
* A common (and required) set of fields that describe a user.
@@ -222,6 +223,11 @@ export type AuthPlatformDef = {
*/
setDisplayName: (name: string) => Promise
+ /**
+ * Returns the list of allowed auth providers for the platform ( the currently supported ones are GOOGLE, GITHUB, EMAIL, MICROSOFT, SAML )
+ */
+ getAllowedAuthProviders: () => Promise>
+
/**
* Defines the additional login items that should be shown in the login screen
*/
diff --git a/packages/hoppscotch-selfhost-web/package.json b/packages/hoppscotch-selfhost-web/package.json
index fef4de863..97ae9e75d 100644
--- a/packages/hoppscotch-selfhost-web/package.json
+++ b/packages/hoppscotch-selfhost-web/package.json
@@ -37,7 +37,8 @@
"stream-browserify": "^3.0.0",
"util": "^0.12.5",
"vue": "^3.3.8",
- "workbox-window": "^7.0.0"
+ "workbox-window": "^7.0.0",
+ "zod": "^3.22.4"
},
"devDependencies": {
"@graphql-codegen/add": "^5.0.0",
diff --git a/packages/hoppscotch-selfhost-web/src/main.ts b/packages/hoppscotch-selfhost-web/src/main.ts
index 6d3a3278e..46be730c5 100644
--- a/packages/hoppscotch-selfhost-web/src/main.ts
+++ b/packages/hoppscotch-selfhost-web/src/main.ts
@@ -1,5 +1,5 @@
import { createHoppApp } from "@hoppscotch/common"
-import { def as authDef } from "./platform/auth"
+import { def as authDef } from "./platform/auth/auth.platform"
import { def as environmentsDef } from "./platform/environments/environments.platform"
import { def as collectionsDef } from "./platform/collections/collections.platform"
import { def as settingsDef } from "./platform/settings/settings.platform"
diff --git a/packages/hoppscotch-selfhost-web/src/platform/auth/auth.api.ts b/packages/hoppscotch-selfhost-web/src/platform/auth/auth.api.ts
new file mode 100644
index 000000000..ee0808715
--- /dev/null
+++ b/packages/hoppscotch-selfhost-web/src/platform/auth/auth.api.ts
@@ -0,0 +1,30 @@
+import axios from "axios"
+import * as E from "fp-ts/Either"
+import { z } from "zod"
+
+const expectedAllowedProvidersSchema = z.object({
+ // currently supported values are "GOOGLE", "GITHUB", "EMAIL", "MICROSOFT", "SAML"
+ // keeping it as string to avoid backend accidentally breaking frontend when adding new providers
+ providers: z.array(z.string()),
+})
+
+export const getAllowedAuthProviders = async () => {
+ try {
+ const res = await axios.get(
+ `${import.meta.env.VITE_BACKEND_API_URL}/auth/providers`,
+ {
+ withCredentials: true,
+ }
+ )
+
+ const parseResult = expectedAllowedProvidersSchema.safeParse(res.data)
+
+ if (!parseResult.success) {
+ return E.left("SOMETHING_WENT_WRONG")
+ }
+
+ return E.right(parseResult.data.providers)
+ } catch (_) {
+ return E.left("SOMETHING_WENT_WRONG")
+ }
+}
diff --git a/packages/hoppscotch-selfhost-web/src/platform/auth.ts b/packages/hoppscotch-selfhost-web/src/platform/auth/auth.platform.ts
similarity index 99%
rename from packages/hoppscotch-selfhost-web/src/platform/auth.ts
rename to packages/hoppscotch-selfhost-web/src/platform/auth/auth.platform.ts
index 879b9249a..6783f60df 100644
--- a/packages/hoppscotch-selfhost-web/src/platform/auth.ts
+++ b/packages/hoppscotch-selfhost-web/src/platform/auth/auth.platform.ts
@@ -8,6 +8,7 @@ import { PersistenceService } from "@hoppscotch/common/services/persistence"
import axios from "axios"
import { BehaviorSubject, Subject } from "rxjs"
import { Ref, ref, watch } from "vue"
+import { getAllowedAuthProviders } from "./auth.api"
export const authEvents$ = new Subject()
const currentUser$ = new BehaviorSubject(null)
@@ -341,4 +342,5 @@ export const def: AuthPlatformDef = {
window.location.href = "/"
}
},
+ getAllowedAuthProviders,
}
diff --git a/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts b/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts
index 568c80a36..234d45e57 100644
--- a/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts
+++ b/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts
@@ -1,4 +1,4 @@
-import { authEvents$, def as platformAuth } from "@platform/auth"
+import { authEvents$, def as platformAuth } from "@platform/auth/auth.platform"
import { CollectionsPlatformDef } from "@hoppscotch/common/platform/collections"
import { runDispatchWithOutSyncing } from "../../lib/sync"
diff --git a/packages/hoppscotch-selfhost-web/src/platform/environments/environments.platform.ts b/packages/hoppscotch-selfhost-web/src/platform/environments/environments.platform.ts
index 8d5042228..93b88cac5 100644
--- a/packages/hoppscotch-selfhost-web/src/platform/environments/environments.platform.ts
+++ b/packages/hoppscotch-selfhost-web/src/platform/environments/environments.platform.ts
@@ -1,4 +1,4 @@
-import { authEvents$, def as platformAuth } from "@platform/auth"
+import { authEvents$, def as platformAuth } from "@platform/auth/auth.platform"
import {
createEnvironment,
deleteEnvironment,
diff --git a/packages/hoppscotch-selfhost-web/src/platform/history/history.platform.ts b/packages/hoppscotch-selfhost-web/src/platform/history/history.platform.ts
index fd0042a71..9e364e304 100644
--- a/packages/hoppscotch-selfhost-web/src/platform/history/history.platform.ts
+++ b/packages/hoppscotch-selfhost-web/src/platform/history/history.platform.ts
@@ -1,4 +1,4 @@
-import { authEvents$, def as platformAuth } from "@platform/auth"
+import { authEvents$, def as platformAuth } from "@platform/auth/auth.platform"
import {
restHistoryStore,
RESTHistoryEntry,
diff --git a/packages/hoppscotch-selfhost-web/src/platform/settings/settings.platform.ts b/packages/hoppscotch-selfhost-web/src/platform/settings/settings.platform.ts
index a8aca2e72..61b838810 100644
--- a/packages/hoppscotch-selfhost-web/src/platform/settings/settings.platform.ts
+++ b/packages/hoppscotch-selfhost-web/src/platform/settings/settings.platform.ts
@@ -1,6 +1,6 @@
import { SettingsPlatformDef } from "@hoppscotch/common/platform/settings"
import { settingsSyncer } from "./settings.sync"
-import { authEvents$, def as platformAuth } from "@platform/auth"
+import { authEvents$, def as platformAuth } from "@platform/auth/auth.platform"
import {
createUserSettings,
getUserSettings,
diff --git a/packages/hoppscotch-selfhost-web/src/platform/tabState/tabState.platform.ts b/packages/hoppscotch-selfhost-web/src/platform/tabState/tabState.platform.ts
index 2c8966010..1ce65094a 100644
--- a/packages/hoppscotch-selfhost-web/src/platform/tabState/tabState.platform.ts
+++ b/packages/hoppscotch-selfhost-web/src/platform/tabState/tabState.platform.ts
@@ -2,7 +2,7 @@ import { PersistableTabState } from "@hoppscotch/common/services/tab"
import { HoppRESTDocument } from "@hoppscotch/common/helpers/rest/document"
import { HoppUser } from "@hoppscotch/common/platform/auth"
import { TabStatePlatformDef } from "@hoppscotch/common/platform/tab"
-import { def as platformAuth } from "@platform/auth"
+import { def as platformAuth } from "@platform/auth/auth.platform"
import { getCurrentRestSession, updateUserSession } from "./tabState.api"
import { SessionType } from "../../api/generated/graphql"
import * as E from "fp-ts/Either"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cc0dde3d4..94fd6bca9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1099,6 +1099,9 @@ importers:
workbox-window:
specifier: ^7.0.0
version: 7.0.0
+ zod:
+ specifier: ^3.22.4
+ version: 3.22.4
devDependencies:
'@graphql-codegen/add':
specifier: ^5.0.0
@@ -7645,7 +7648,7 @@ packages:
dependencies:
'@intlify/bundle-utils': 7.4.0(vue-i18n@9.2.2)
'@intlify/shared': 9.4.1
- '@rollup/pluginutils': 5.0.3(rollup@2.79.1)
+ '@rollup/pluginutils': 5.0.3(rollup@3.29.4)
'@vue/compiler-sfc': 3.3.10
debug: 4.3.4(supports-color@9.2.2)
fast-glob: 3.3.1
@@ -9365,6 +9368,7 @@ packages:
estree-walker: 2.0.2
picomatch: 2.3.1
rollup: 2.79.1
+ dev: true
/@rollup/pluginutils@5.0.3(rollup@3.29.4):
resolution: {integrity: sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==}
@@ -9379,7 +9383,6 @@ packages:
estree-walker: 2.0.2
picomatch: 2.3.1
rollup: 3.29.4
- dev: true
/@rollup/pluginutils@5.1.0(rollup@2.79.1):
resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
@@ -11264,7 +11267,7 @@ packages:
regenerator-runtime: 0.13.11
systemjs: 6.14.2
terser: 5.24.0
- vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0)
+ vite: 4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
transitivePeerDependencies:
- supports-color
@@ -11297,7 +11300,7 @@ packages:
vite: ^4.0.0 || ^5.0.0
vue: ^3.2.25
dependencies:
- vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0)
+ vite: 4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
vue: 3.3.9(typescript@5.3.2)
dev: true
@@ -11857,7 +11860,7 @@ packages:
dependencies:
'@vue/compiler-ssr': 3.3.9
'@vue/shared': 3.3.9
- vue: 3.3.9(typescript@4.9.5)
+ vue: 3.3.9(typescript@5.3.2)
/@vue/shared@3.2.45:
resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==}
@@ -23454,6 +23457,7 @@ packages:
chokidar: 3.5.3
immutable: 4.3.2
source-map-js: 1.0.2
+ dev: true
/sax@1.2.4:
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
@@ -25457,7 +25461,7 @@ packages:
dependencies:
fast-glob: 3.3.1
unplugin: 1.4.0
- vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0)
+ vite: 4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
dev: true
/unplugin-icons@0.14.9(@vue/compiler-sfc@3.2.45)(vite@3.2.4):
@@ -26279,7 +26283,7 @@ packages:
vite: ^2.0.0 || ^3.0.0 || ^4.0.0
dependencies:
fast-glob: 3.3.1
- vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0)
+ vite: 4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
dev: true
/vite-plugin-html-config@1.0.10(vite@3.2.4):
@@ -26297,7 +26301,7 @@ packages:
peerDependencies:
vite: '>=2.0.0'
dependencies:
- vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0)
+ vite: 4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
dev: true
/vite-plugin-inspect@0.7.38(rollup@2.79.1)(vite@4.5.0):
@@ -26538,7 +26542,7 @@ packages:
debug: 4.3.4(supports-color@9.2.2)
fast-glob: 3.3.2
pretty-bytes: 6.1.1
- vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0)
+ vite: 4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
workbox-build: 7.0.0
workbox-window: 7.0.0
transitivePeerDependencies:
@@ -26632,7 +26636,7 @@ packages:
'@vue/compiler-sfc': 3.3.8
debug: 4.3.4(supports-color@9.2.2)
fast-glob: 3.3.1
- vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0)
+ vite: 4.5.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
vue: 3.3.9(typescript@5.3.2)
vue-router: 4.2.5(vue@3.3.9)
transitivePeerDependencies:
@@ -26758,7 +26762,6 @@ packages:
terser: 5.24.0
optionalDependencies:
fsevents: 2.3.3
- dev: true
/vite@4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0):
resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==}
@@ -26790,12 +26793,13 @@ packages:
dependencies:
'@types/node': 17.0.27
esbuild: 0.18.20
- postcss: 8.4.31
+ postcss: 8.4.32
rollup: 3.29.4
sass: 1.69.5
terser: 5.24.0
optionalDependencies:
fsevents: 2.3.3
+ dev: true
/vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.24.0):
resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==}