2023-06-07 23:46:42 +08:00
|
|
|
import { CopyOutlined } from '@ant-design/icons';
|
2023-07-08 08:26:27 +08:00
|
|
|
import { ArrayItems } from '@formily/antd-v5';
|
2023-06-07 23:46:42 +08:00
|
|
|
import { observer } from '@formily/react';
|
2023-07-08 08:26:27 +08:00
|
|
|
import { FormItem, Input, SchemaComponent } from '@nocobase/client';
|
|
|
|
import { Card, Space, message } from 'antd';
|
|
|
|
import React from 'react';
|
2023-06-07 23:46:42 +08:00
|
|
|
import { useOidcTranslation } from './locale';
|
|
|
|
|
|
|
|
const schema = {
|
|
|
|
type: 'object',
|
|
|
|
properties: {
|
|
|
|
oidc: {
|
|
|
|
type: 'object',
|
|
|
|
properties: {
|
|
|
|
issuer: {
|
|
|
|
title: '{{t("Issuer")}}',
|
|
|
|
'x-component': 'Input',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
clientId: {
|
|
|
|
title: '{{t("Client ID")}}',
|
|
|
|
'x-component': 'Input',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
clientSecret: {
|
|
|
|
title: '{{t("Client Secret")}}',
|
|
|
|
'x-component': 'Input',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
required: true,
|
|
|
|
},
|
|
|
|
scope: {
|
|
|
|
title: '{{t("scope")}}',
|
|
|
|
'x-component': 'Input',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
'x-decorator-props': {
|
|
|
|
tooltip: '{{t("Default: openid profile email")}}',
|
|
|
|
},
|
|
|
|
},
|
2023-06-12 11:50:56 +08:00
|
|
|
idTokenSignedResponseAlg: {
|
|
|
|
title: '{{t("id_token signed response algorithm")}}',
|
|
|
|
'x-component': 'Select',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
enum: [
|
|
|
|
{ label: 'HS256', value: 'HS256' },
|
|
|
|
{ label: 'HS384', value: 'HS384' },
|
|
|
|
{ label: 'HS512', value: 'HS512' },
|
|
|
|
{ label: 'RS256', value: 'RS256' },
|
|
|
|
{ label: 'RS384', value: 'RS384' },
|
|
|
|
{ label: 'RS512', value: 'RS512' },
|
|
|
|
{ label: 'ES256', value: 'ES256' },
|
|
|
|
{ label: 'ES384', value: 'ES384' },
|
|
|
|
{ label: 'ES512', value: 'ES512' },
|
|
|
|
{ label: 'PS256', value: 'PS256' },
|
|
|
|
{ label: 'PS384', value: 'PS384' },
|
|
|
|
{ label: 'PS512', value: 'PS512' },
|
|
|
|
],
|
|
|
|
},
|
2023-06-07 23:46:42 +08:00
|
|
|
http: {
|
2023-06-12 11:50:56 +08:00
|
|
|
title: '{{t("HTTP")}}',
|
2023-06-07 23:46:42 +08:00
|
|
|
'x-component': 'Checkbox',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
},
|
2023-06-12 11:50:56 +08:00
|
|
|
port: {
|
|
|
|
title: '{{t("Port")}}',
|
|
|
|
'x-component': 'InputNumber',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
'x-component-props': {
|
|
|
|
style: {
|
|
|
|
width: '15%',
|
|
|
|
'min-width': '100px',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2023-06-07 23:46:42 +08:00
|
|
|
fieldMap: {
|
|
|
|
title: '{{t("Field Map")}}',
|
|
|
|
type: 'array',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
'x-component': 'ArrayItems',
|
|
|
|
items: {
|
|
|
|
type: 'object',
|
|
|
|
'x-decorator': 'ArrayItems.Item',
|
|
|
|
properties: {
|
2023-06-19 21:53:33 +08:00
|
|
|
space: {
|
|
|
|
type: 'void',
|
|
|
|
'x-component': 'Space',
|
|
|
|
properties: {
|
|
|
|
source: {
|
|
|
|
type: 'string',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
'x-component': 'Input',
|
|
|
|
'x-component-props': {
|
|
|
|
placeholder: '{{t("source")}}',
|
|
|
|
},
|
2023-06-07 23:46:42 +08:00
|
|
|
},
|
2023-06-19 21:53:33 +08:00
|
|
|
target: {
|
|
|
|
type: 'string',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
'x-component': 'Select',
|
|
|
|
'x-component-props': {
|
|
|
|
placeholder: '{{t("target")}}',
|
|
|
|
},
|
|
|
|
enum: [
|
|
|
|
{ label: 'Nickname', value: 'nickname' },
|
|
|
|
{ label: 'Email', value: 'email' },
|
|
|
|
{ label: 'Phone', value: 'phone' },
|
|
|
|
],
|
|
|
|
},
|
|
|
|
remove: {
|
|
|
|
type: 'void',
|
|
|
|
'x-decorator': 'FormItem',
|
|
|
|
'x-component': 'ArrayItems.Remove',
|
2023-06-07 23:46:42 +08:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
properties: {
|
|
|
|
add: {
|
|
|
|
type: 'void',
|
|
|
|
title: 'Add',
|
|
|
|
'x-component': 'ArrayItems.Addition',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
usage: {
|
|
|
|
type: 'void',
|
|
|
|
'x-component': 'Usage',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const Usage = observer(() => {
|
|
|
|
const { t } = useOidcTranslation();
|
|
|
|
|
|
|
|
const { protocol, host } = window.location;
|
|
|
|
const url = `${protocol}//${host}/api/oidc:redirect`;
|
|
|
|
|
|
|
|
const copy = (text: string) => {
|
|
|
|
navigator.clipboard.writeText(text);
|
|
|
|
message.success(t('Copied'));
|
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Card title={t('Usage')} type="inner">
|
|
|
|
<FormItem label={t('Redirect URL')}>
|
|
|
|
<Input value={url} disabled={true} addonBefore={<CopyOutlined onClick={() => copy(url)} />} />
|
|
|
|
</FormItem>
|
|
|
|
</Card>
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
export const Options = () => {
|
|
|
|
const { t } = useOidcTranslation();
|
2023-06-19 21:53:33 +08:00
|
|
|
return <SchemaComponent scope={{ t }} components={{ Usage, ArrayItems, Space }} schema={schema} />;
|
2023-06-07 23:46:42 +08:00
|
|
|
};
|