feat: env variable support in authorization
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
This commit is contained in:
@@ -108,39 +108,51 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="authType === 'basic'" class="border-b border-dividerLight flex">
|
<div v-if="authType === 'basic'" class="border-b border-dividerLight flex">
|
||||||
<div class="border-r border-dividerLight space-y-2 p-2 w-2/3">
|
<div class="border-r border-dividerLight w-2/3">
|
||||||
<div class="flex relative">
|
<div
|
||||||
|
class="divide-x divide-dividerLight border-b border-dividerLight flex"
|
||||||
|
>
|
||||||
|
<SmartEnvInput
|
||||||
|
class="bg-primary flex flex-1 py-1 px-4"
|
||||||
|
v-if="EXPERIMENTAL_URL_BAR_ENABLED"
|
||||||
|
v-model="basicUsername"
|
||||||
|
:placeholder="$t('authorization.username')"
|
||||||
|
/>
|
||||||
<input
|
<input
|
||||||
|
v-else
|
||||||
id="http_basic_user"
|
id="http_basic_user"
|
||||||
v-model="basicUsername"
|
v-model="basicUsername"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
:placeholder="$t('authorization.username')"
|
||||||
name="http_basic_user"
|
name="http_basic_user"
|
||||||
/>
|
/>
|
||||||
<label for="http_basic_user">
|
|
||||||
{{ $t("authorization.username") }}
|
|
||||||
</label>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="flex relative">
|
<div
|
||||||
|
class="divide-x divide-dividerLight border-b border-dividerLight flex"
|
||||||
|
>
|
||||||
|
<SmartEnvInput
|
||||||
|
class="bg-primary flex flex-1 py-1 px-4"
|
||||||
|
v-if="EXPERIMENTAL_URL_BAR_ENABLED"
|
||||||
|
v-model="basicPassword"
|
||||||
|
:placeholder="$t('authorization.password')"
|
||||||
|
/>
|
||||||
<input
|
<input
|
||||||
|
v-else
|
||||||
id="http_basic_passwd"
|
id="http_basic_passwd"
|
||||||
v-model="basicPassword"
|
v-model="basicPassword"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
:placeholder="$t('authorization.password')"
|
||||||
name="http_basic_passwd"
|
name="http_basic_passwd"
|
||||||
:type="passwordFieldType"
|
:type="passwordFieldType"
|
||||||
/>
|
/>
|
||||||
<label for="http_basic_passwd">
|
<span>
|
||||||
{{ $t("authorization.password") }}
|
<ButtonSecondary
|
||||||
</label>
|
:icon="
|
||||||
<ButtonSecondary
|
passwordFieldType === 'text' ? 'visibility' : 'visibility_off'
|
||||||
:icon="
|
"
|
||||||
passwordFieldType === 'text' ? 'visibility' : 'visibility_off'
|
@click.native="switchVisibility"
|
||||||
"
|
/>
|
||||||
outline
|
</span>
|
||||||
class="rounded ml-2"
|
|
||||||
@click.native="switchVisibility"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -169,16 +181,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="authType === 'bearer'" class="border-b border-dividerLight flex">
|
<div v-if="authType === 'bearer'" class="border-b border-dividerLight flex">
|
||||||
<div class="border-r border-dividerLight space-y-2 p-2 w-2/3">
|
<div class="border-r border-dividerLight w-2/3">
|
||||||
<div class="flex relative">
|
<div
|
||||||
|
class="divide-x divide-dividerLight border-b border-dividerLight flex"
|
||||||
|
>
|
||||||
|
<SmartEnvInput
|
||||||
|
class="bg-primary flex flex-1 py-1 px-4"
|
||||||
|
v-if="EXPERIMENTAL_URL_BAR_ENABLED"
|
||||||
|
v-model="bearerToken"
|
||||||
|
placeholder="Token"
|
||||||
|
/>
|
||||||
<input
|
<input
|
||||||
|
v-else
|
||||||
id="bearer_token"
|
id="bearer_token"
|
||||||
v-model="bearerToken"
|
v-model="bearerToken"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
placeholder="Token"
|
||||||
name="bearer_token"
|
name="bearer_token"
|
||||||
/>
|
/>
|
||||||
<label for="bearer_token"> Token </label>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -210,16 +230,24 @@
|
|||||||
v-if="authType === 'oauth-2'"
|
v-if="authType === 'oauth-2'"
|
||||||
class="border-b border-dividerLight flex"
|
class="border-b border-dividerLight flex"
|
||||||
>
|
>
|
||||||
<div class="border-r border-dividerLight space-y-2 p-2 w-2/3">
|
<div class="border-r border-dividerLight w-2/3">
|
||||||
<div class="flex relative">
|
<div
|
||||||
|
class="divide-x divide-dividerLight border-b border-dividerLight flex"
|
||||||
|
>
|
||||||
|
<SmartEnvInput
|
||||||
|
class="bg-primary flex flex-1 py-1 px-4"
|
||||||
|
v-if="EXPERIMENTAL_URL_BAR_ENABLED"
|
||||||
|
v-model="oauth2Token"
|
||||||
|
placeholder="Token"
|
||||||
|
/>
|
||||||
<input
|
<input
|
||||||
|
v-else
|
||||||
id="oauth2_token"
|
id="oauth2_token"
|
||||||
v-model="oauth2Token"
|
v-model="oauth2Token"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
placeholder="Token"
|
||||||
name="oauth2_token"
|
name="oauth2_token"
|
||||||
/>
|
/>
|
||||||
<label for="oauth2_token"> Token </label>
|
|
||||||
</div>
|
</div>
|
||||||
<HttpOAuth2Authorization />
|
<HttpOAuth2Authorization />
|
||||||
</div>
|
</div>
|
||||||
@@ -316,6 +344,7 @@ export default defineComponent({
|
|||||||
passwordFieldType,
|
passwordFieldType,
|
||||||
clearContent,
|
clearContent,
|
||||||
switchVisibility,
|
switchVisibility,
|
||||||
|
EXPERIMENTAL_URL_BAR_ENABLED: useSetting("EXPERIMENTAL_URL_BAR_ENABLED"),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,57 +1,53 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex flex-col space-y-2">
|
<div class="flex flex-col">
|
||||||
<div class="flex relative">
|
<div class="divide-x divide-dividerLight border-b border-dividerLight flex">
|
||||||
<input
|
<input
|
||||||
id="oidcDiscoveryURL"
|
id="oidcDiscoveryURL"
|
||||||
v-model="oidcDiscoveryURL"
|
v-model="oidcDiscoveryURL"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
placeholder="OpenID Connect Discovery URL"
|
||||||
name="oidcDiscoveryURL"
|
name="oidcDiscoveryURL"
|
||||||
/>
|
/>
|
||||||
<label for="oidcDiscoveryURL"> OpenID Connect Discovery URL </label>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="flex relative">
|
<div class="divide-x divide-dividerLight border-b border-dividerLight flex">
|
||||||
<input
|
<input
|
||||||
id="authURL"
|
id="authURL"
|
||||||
v-model="authURL"
|
v-model="authURL"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
placeholder="Authentication URL"
|
||||||
name="authURL"
|
name="authURL"
|
||||||
/>
|
/>
|
||||||
<label for="authURL"> Authentication URL </label>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="flex relative">
|
<div class="divide-x divide-dividerLight border-b border-dividerLight flex">
|
||||||
<input
|
<input
|
||||||
id="accessTokenURL"
|
id="accessTokenURL"
|
||||||
v-model="accessTokenURL"
|
v-model="accessTokenURL"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
placeholder="Access Token URL"
|
||||||
name="accessTokenURL"
|
name="accessTokenURL"
|
||||||
/>
|
/>
|
||||||
<label for="accessTokenURL"> Access Token URL </label>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="flex relative">
|
<div class="divide-x divide-dividerLight border-b border-dividerLight flex">
|
||||||
<input
|
<input
|
||||||
id="clientID"
|
id="clientID"
|
||||||
v-model="clientID"
|
v-model="clientID"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
placeholder="Client ID"
|
||||||
name="clientID"
|
name="clientID"
|
||||||
/>
|
/>
|
||||||
<label for="clientID"> Client ID </label>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="flex relative">
|
<div class="divide-x divide-dividerLight border-b border-dividerLight flex">
|
||||||
<input
|
<input
|
||||||
id="scope"
|
id="scope"
|
||||||
v-model="scope"
|
v-model="scope"
|
||||||
class="input floating-input"
|
class="bg-primary flex flex-1 py-2 px-4"
|
||||||
placeholder=" "
|
placeholder="Scope"
|
||||||
name="scope"
|
name="scope"
|
||||||
/>
|
/>
|
||||||
<label for="scope"> Scope </label>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div class="p-2">
|
||||||
<ButtonPrimary
|
<ButtonSecondary
|
||||||
|
filled
|
||||||
:label="$t('authorization.generate_token')"
|
:label="$t('authorization.generate_token')"
|
||||||
@click.native="handleAccessTokenRequest()"
|
@click.native="handleAccessTokenRequest()"
|
||||||
/>
|
/>
|
||||||
@@ -101,7 +97,7 @@ export default {
|
|||||||
oidcDiscoveryURL.value === "" &&
|
oidcDiscoveryURL.value === "" &&
|
||||||
(authURL.value === "" || accessTokenURL.value === "")
|
(authURL.value === "" || accessTokenURL.value === "")
|
||||||
) {
|
) {
|
||||||
$toast.error($t("complete_config_urls"), {
|
$toast.error($t("complete_config_urls").toString(), {
|
||||||
icon: "error",
|
icon: "error",
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -80,12 +80,13 @@ export function getEffectiveRESTRequest(
|
|||||||
if (request.auth.authActive) {
|
if (request.auth.authActive) {
|
||||||
// TODO: Support a better b64 implementation than btoa ?
|
// TODO: Support a better b64 implementation than btoa ?
|
||||||
if (request.auth.authType === "basic") {
|
if (request.auth.authType === "basic") {
|
||||||
|
const username = parseTemplateString(request.auth.username, envVariables)
|
||||||
|
const password = parseTemplateString(request.auth.password, envVariables)
|
||||||
|
|
||||||
effectiveFinalHeaders.push({
|
effectiveFinalHeaders.push({
|
||||||
active: true,
|
active: true,
|
||||||
key: "Authorization",
|
key: "Authorization",
|
||||||
value: `Basic ${btoa(
|
value: `Basic ${btoa(`${username}:${password}`)}`,
|
||||||
`${request.auth.username}:${request.auth.password}`
|
|
||||||
)}`,
|
|
||||||
})
|
})
|
||||||
} else if (
|
} else if (
|
||||||
request.auth.authType === "bearer" ||
|
request.auth.authType === "bearer" ||
|
||||||
@@ -94,7 +95,10 @@ export function getEffectiveRESTRequest(
|
|||||||
effectiveFinalHeaders.push({
|
effectiveFinalHeaders.push({
|
||||||
active: true,
|
active: true,
|
||||||
key: "Authorization",
|
key: "Authorization",
|
||||||
value: `Bearer ${request.auth.token}`,
|
value: `Bearer ${parseTemplateString(
|
||||||
|
request.auth.token,
|
||||||
|
envVariables
|
||||||
|
)}`,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user