add config auth location

This commit is contained in:
lloydzhou 2024-09-03 12:00:55 +08:00
parent 3ec67f9f47
commit 2b317f60c8
5 changed files with 55 additions and 14 deletions

View File

@ -10,6 +10,7 @@
max-height: 240px;
overflow-y: auto;
white-space: pre-wrap;
min-width: 300px;
}
}

View File

@ -249,6 +249,30 @@ export function PluginPage() {
<option value="custom">{Locale.Plugin.Auth.Custom}</option>
</select>
</ListItem>
{["bearer", "basic", "custom"].includes(
editingPlugin.authType as string,
) && (
<ListItem title={Locale.Plugin.Auth.Location}>
<select
value={editingPlugin?.authLocation}
onChange={(e) => {
pluginStore.updatePlugin(editingPlugin.id, (plugin) => {
plugin.authLocation = e.target.value;
});
}}
>
<option value="header">
{Locale.Plugin.Auth.LocationHeader}
</option>
<option value="query">
{Locale.Plugin.Auth.LocationQuery}
</option>
<option value="body">
{Locale.Plugin.Auth.LocationBody}
</option>
</select>
</ListItem>
)}
{editingPlugin.authType == "custom" && (
<ListItem title={Locale.Plugin.Auth.CustomHeader}>
<input

View File

@ -551,10 +551,14 @@ const cn = {
Basic: "Basic",
Bearer: "Bearer",
Custom: "自定义",
CustomHeader: "自定义",
CustomHeader: "自定义参数名称",
Token: "Token",
Proxy: "使用代理",
ProxyDescription: "使用代理解决 CORS 错误",
Location: "位置",
LocationHeader: "Header",
LocationQuery: "Query",
LocationBody: "Body",
},
EditModal: {
Title: (readonly: boolean) => `编辑插件 ${readonly ? "(只读)" : ""}`,

View File

@ -559,10 +559,14 @@ const en: LocaleType = {
Basic: "Basic",
Bearer: "Bearer",
Custom: "Custom",
CustomHeader: "Custom Header",
CustomHeader: "Parameter Name",
Token: "Token",
Proxy: "Using Proxy",
ProxyDescription: "Using proxies to solve CORS error",
Location: "Location",
LocationHeader: "Header",
LocationQuery: "Query",
LocationBody: "Body",
},
EditModal: {
Title: (readonly: boolean) =>

View File

@ -13,6 +13,7 @@ export type Plugin = {
content: string;
builtin: boolean;
authType?: string;
authLocation?: string;
authHeader?: string;
authToken?: string;
usingProxy?: boolean;
@ -50,16 +51,17 @@ export const FunctionToolService = {
const definition = yaml.load(plugin.content) as any;
const serverURL = definition?.servers?.[0]?.url;
const baseURL = !!plugin?.usingProxy ? "/api/proxy" : serverURL;
const headers: Record<string, string | undefined> = {
"X-Base-URL": !!plugin?.usingProxy ? serverURL : undefined,
};
if (plugin?.authLocation == "header") {
headers[headerName] = tokenValue;
}
const api = new OpenAPIClientAxios({
definition: yaml.load(plugin.content) as any,
axiosConfigDefaults: {
baseURL,
headers: {
// 'Cache-Control': 'no-cache',
// 'Content-Type': 'application/json', // TODO
[headerName]: tokenValue,
"X-Base-URL": !!plugin?.usingProxy ? serverURL : undefined,
},
headers,
},
});
try {
@ -111,20 +113,26 @@ export const FunctionToolService = {
funcs: operations.reduce((s, o) => {
// @ts-ignore
s[o.operationId] = function (args) {
const argument = [];
const parameters: Record<string, any> = {};
if (o.parameters instanceof Array) {
o.parameters.forEach((p) => {
// @ts-ignore
argument.push(args[p?.name]);
parameters[p?.name] = args[p?.name];
// @ts-ignore
delete args[p?.name];
});
} else {
argument.push(null);
}
argument.push(args);
if (plugin?.authLocation == "query") {
parameters[headerName] = tokenValue;
} else if (plugin?.authLocation == "body") {
args[headerName] = tokenValue;
}
// @ts-ignore
return api.client[o.operationId].apply(null, argument);
return api.client[o.operationId](
parameters,
args,
api.axiosConfigDefaults,
);
};
return s;
}, {}),