@typekcz-nocobase-plugins/plugin-oidc-plus 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.js +1 -1
- package/dist/externalVersion.js +9 -9
- package/dist/node_modules/nanoid/async/index.browser.js +0 -35
- package/dist/node_modules/nanoid/async/index.js +0 -36
- package/dist/node_modules/nanoid/async/index.native.js +0 -31
- package/dist/node_modules/nanoid/index.browser.js +0 -38
- package/dist/node_modules/nanoid/index.cjs +1 -1
- package/dist/node_modules/nanoid/index.js +0 -40
- package/dist/node_modules/nanoid/non-secure/index.js +0 -13
- package/dist/node_modules/nanoid/package.json +1 -1
- package/dist/node_modules/nanoid/url-alphabet/index.js +0 -4
- package/dist/node_modules/openid-client/package.json +1 -1
- package/package.json +1 -1
- package/src/client/OIDCButton.tsx +70 -0
- package/src/client/Options.tsx +359 -0
- package/src/client/index.tsx +19 -0
- package/src/client/locale/index.ts +18 -0
- package/src/constants.ts +7 -0
- package/src/index.ts +2 -0
- package/src/locale/en-US.json +40 -0
- package/src/locale/es-ES.json +25 -0
- package/src/locale/fr-FR.json +21 -0
- package/src/locale/ko_KR.json +28 -0
- package/src/locale/pt-BR.json +21 -0
- package/src/locale/zh-CN.json +28 -0
- package/src/server/__tests__/oidc.test.ts +283 -0
- package/src/server/actions/getAuthUrl.ts +25 -0
- package/src/server/actions/redirect.ts +32 -0
- package/src/server/index.ts +1 -0
- package/src/server/oidc-auth.ts +169 -0
- package/src/server/plugin.ts +63 -0
- package/src/swagger/index.ts +157 -0
- package/dist/node_modules/nanoid/.devcontainer.json +0 -23
- package/dist/node_modules/openid-client/lib/client.js +0 -1884
- package/dist/node_modules/openid-client/lib/device_flow_handle.js +0 -125
- package/dist/node_modules/openid-client/lib/errors.js +0 -55
- package/dist/node_modules/openid-client/lib/helpers/assert.js +0 -24
- package/dist/node_modules/openid-client/lib/helpers/base64url.js +0 -13
- package/dist/node_modules/openid-client/lib/helpers/client.js +0 -208
- package/dist/node_modules/openid-client/lib/helpers/consts.js +0 -7
- package/dist/node_modules/openid-client/lib/helpers/decode_jwt.js +0 -27
- package/dist/node_modules/openid-client/lib/helpers/deep_clone.js +0 -1
- package/dist/node_modules/openid-client/lib/helpers/defaults.js +0 -27
- package/dist/node_modules/openid-client/lib/helpers/generators.js +0 -14
- package/dist/node_modules/openid-client/lib/helpers/is_key_object.js +0 -4
- package/dist/node_modules/openid-client/lib/helpers/is_plain_object.js +0 -1
- package/dist/node_modules/openid-client/lib/helpers/issuer.js +0 -111
- package/dist/node_modules/openid-client/lib/helpers/keystore.js +0 -298
- package/dist/node_modules/openid-client/lib/helpers/merge.js +0 -24
- package/dist/node_modules/openid-client/lib/helpers/pick.js +0 -9
- package/dist/node_modules/openid-client/lib/helpers/process_response.js +0 -71
- package/dist/node_modules/openid-client/lib/helpers/request.js +0 -200
- package/dist/node_modules/openid-client/lib/helpers/unix_timestamp.js +0 -1
- package/dist/node_modules/openid-client/lib/helpers/weak_cache.js +0 -1
- package/dist/node_modules/openid-client/lib/helpers/webfinger_normalize.js +0 -71
- package/dist/node_modules/openid-client/lib/helpers/www_authenticate_parser.js +0 -14
- package/dist/node_modules/openid-client/lib/index.js +0 -1
- package/dist/node_modules/openid-client/lib/issuer.js +0 -192
- package/dist/node_modules/openid-client/lib/issuer_registry.js +0 -3
- package/dist/node_modules/openid-client/lib/passport_strategy.js +0 -205
- package/dist/node_modules/openid-client/lib/token_set.js +0 -35
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { CopyOutlined } from '@ant-design/icons';
|
|
2
|
+
import { ArrayItems, FormTab } from '@formily/antd-v5';
|
|
3
|
+
import { observer } from '@formily/react';
|
|
4
|
+
import { FormItem, Input, SchemaComponent, useApp } from '@nocobase/client';
|
|
5
|
+
import { Card, Space, message } from 'antd';
|
|
6
|
+
import React, { useMemo } from 'react';
|
|
7
|
+
import { lang, useOidcTranslation } from './locale';
|
|
8
|
+
|
|
9
|
+
const schema = {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
public: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: {
|
|
15
|
+
autoSignup: {
|
|
16
|
+
'x-decorator': 'FormItem',
|
|
17
|
+
type: 'boolean',
|
|
18
|
+
title: '{{t("Sign up automatically when the user does not exist")}}',
|
|
19
|
+
'x-component': 'Checkbox',
|
|
20
|
+
default: true,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
oidc: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
collapse: {
|
|
28
|
+
type: 'void',
|
|
29
|
+
'x-component': 'FormTab',
|
|
30
|
+
properties: {
|
|
31
|
+
basic: {
|
|
32
|
+
type: 'void',
|
|
33
|
+
'x-component': 'FormTab.TabPane',
|
|
34
|
+
'x-component-props': {
|
|
35
|
+
tab: lang('Basic configuration'),
|
|
36
|
+
},
|
|
37
|
+
properties: {
|
|
38
|
+
issuer: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
title: '{{t("Issuer")}}',
|
|
41
|
+
'x-component': 'Input',
|
|
42
|
+
'x-decorator': 'FormItem',
|
|
43
|
+
required: true,
|
|
44
|
+
},
|
|
45
|
+
clientId: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
title: '{{t("Client ID")}}',
|
|
48
|
+
'x-component': 'Input',
|
|
49
|
+
'x-decorator': 'FormItem',
|
|
50
|
+
required: true,
|
|
51
|
+
},
|
|
52
|
+
clientSecret: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
title: '{{t("Client Secret")}}',
|
|
55
|
+
'x-component': 'Input',
|
|
56
|
+
'x-decorator': 'FormItem',
|
|
57
|
+
required: true,
|
|
58
|
+
},
|
|
59
|
+
scope: {
|
|
60
|
+
type: 'string',
|
|
61
|
+
title: '{{t("scope")}}',
|
|
62
|
+
'x-component': 'Input',
|
|
63
|
+
'x-decorator': 'FormItem',
|
|
64
|
+
'x-decorator-props': {
|
|
65
|
+
tooltip: '{{t("Default: openid profile email")}}',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
idTokenSignedResponseAlg: {
|
|
69
|
+
type: 'string',
|
|
70
|
+
title: '{{t("id_token signed response algorithm")}}',
|
|
71
|
+
'x-component': 'Select',
|
|
72
|
+
'x-decorator': 'FormItem',
|
|
73
|
+
enum: [
|
|
74
|
+
{ label: 'HS256', value: 'HS256' },
|
|
75
|
+
{ label: 'HS384', value: 'HS384' },
|
|
76
|
+
{ label: 'HS512', value: 'HS512' },
|
|
77
|
+
{ label: 'RS256', value: 'RS256' },
|
|
78
|
+
{ label: 'RS384', value: 'RS384' },
|
|
79
|
+
{ label: 'RS512', value: 'RS512' },
|
|
80
|
+
{ label: 'ES256', value: 'ES256' },
|
|
81
|
+
{ label: 'ES384', value: 'ES384' },
|
|
82
|
+
{ label: 'ES512', value: 'ES512' },
|
|
83
|
+
{ label: 'PS256', value: 'PS256' },
|
|
84
|
+
{ label: 'PS384', value: 'PS384' },
|
|
85
|
+
{ label: 'PS512', value: 'PS512' },
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
mapping: {
|
|
91
|
+
type: 'void',
|
|
92
|
+
'x-component': 'FormTab.TabPane',
|
|
93
|
+
'x-component-props': {
|
|
94
|
+
tab: lang('Field mapping'),
|
|
95
|
+
},
|
|
96
|
+
properties: {
|
|
97
|
+
fieldMap: {
|
|
98
|
+
title: '{{t("Field Map")}}',
|
|
99
|
+
type: 'array',
|
|
100
|
+
'x-decorator': 'FormItem',
|
|
101
|
+
'x-component': 'ArrayItems',
|
|
102
|
+
items: {
|
|
103
|
+
type: 'object',
|
|
104
|
+
'x-decorator': 'ArrayItems.Item',
|
|
105
|
+
properties: {
|
|
106
|
+
space: {
|
|
107
|
+
type: 'void',
|
|
108
|
+
'x-component': 'Space',
|
|
109
|
+
properties: {
|
|
110
|
+
source: {
|
|
111
|
+
type: 'string',
|
|
112
|
+
'x-decorator': 'FormItem',
|
|
113
|
+
'x-component': 'Input',
|
|
114
|
+
'x-component-props': {
|
|
115
|
+
placeholder: '{{t("source")}}',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
target: {
|
|
119
|
+
type: 'string',
|
|
120
|
+
'x-decorator': 'FormItem',
|
|
121
|
+
'x-component': 'Input',
|
|
122
|
+
'x-component-props': {
|
|
123
|
+
placeholder: '{{t("target")}}',
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
remove: {
|
|
127
|
+
type: 'void',
|
|
128
|
+
'x-decorator': 'FormItem',
|
|
129
|
+
'x-component': 'ArrayItems.Remove',
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
properties: {
|
|
136
|
+
add: {
|
|
137
|
+
type: 'void',
|
|
138
|
+
title: 'Add',
|
|
139
|
+
'x-component': 'ArrayItems.Addition',
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
userBindField: {
|
|
144
|
+
type: 'string',
|
|
145
|
+
title: '{{t("Use this field to bind the user")}}',
|
|
146
|
+
'x-component': 'Select',
|
|
147
|
+
'x-decorator': 'FormItem',
|
|
148
|
+
default: 'email',
|
|
149
|
+
enum: [
|
|
150
|
+
{ label: lang('Email'), value: 'email' },
|
|
151
|
+
{ label: lang('Username'), value: 'username' },
|
|
152
|
+
],
|
|
153
|
+
required: true,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
advanced: {
|
|
158
|
+
type: 'void',
|
|
159
|
+
'x-component': 'FormTab.TabPane',
|
|
160
|
+
'x-component-props': {
|
|
161
|
+
tab: lang('Advanced configuration'),
|
|
162
|
+
},
|
|
163
|
+
properties: {
|
|
164
|
+
logout: {
|
|
165
|
+
type: 'boolean',
|
|
166
|
+
title: '{{t("RP-initiated logout")}}',
|
|
167
|
+
'x-component': 'Checkbox',
|
|
168
|
+
'x-decorator': 'FormItem',
|
|
169
|
+
'x-decorator-props': {
|
|
170
|
+
tooltip:
|
|
171
|
+
'{{t("Performs logout on the issuer (uses end_session_endpoint in the issuer configuration)")}}',
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
http: {
|
|
175
|
+
type: 'boolean',
|
|
176
|
+
title: '{{t("HTTP")}}',
|
|
177
|
+
'x-component': 'Checkbox',
|
|
178
|
+
'x-decorator': 'FormItem',
|
|
179
|
+
'x-decorator-props': {
|
|
180
|
+
tooltip: '{{t("Check if NocoBase is running on HTTP protocol")}}',
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
port: {
|
|
184
|
+
type: 'number',
|
|
185
|
+
title: '{{t("Port")}}',
|
|
186
|
+
'x-component': 'InputNumber',
|
|
187
|
+
'x-decorator': 'FormItem',
|
|
188
|
+
'x-decorator-props': {
|
|
189
|
+
tooltip: '{{t("The port number of the NocoBase service if it is not 80 or 443")}}',
|
|
190
|
+
},
|
|
191
|
+
'x-component-props': {
|
|
192
|
+
style: {
|
|
193
|
+
width: '15%',
|
|
194
|
+
minWidth: '100px',
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
stateToken: {
|
|
199
|
+
type: 'string',
|
|
200
|
+
title: '{{t("State token")}}',
|
|
201
|
+
'x-component': 'Input',
|
|
202
|
+
'x-decorator': 'FormItem',
|
|
203
|
+
description: lang(
|
|
204
|
+
"The state token helps prevent CSRF attacks. It's recommended to leave it blank for automatic random generation.",
|
|
205
|
+
),
|
|
206
|
+
},
|
|
207
|
+
exchangeBodyKeys: {
|
|
208
|
+
type: 'array',
|
|
209
|
+
title: '{{t("Pass parameters in the authorization code grant exchange")}}',
|
|
210
|
+
'x-decorator': 'FormItem',
|
|
211
|
+
'x-component': 'ArrayItems',
|
|
212
|
+
default: [
|
|
213
|
+
{ paramName: '', optionsKey: 'clientId' },
|
|
214
|
+
{
|
|
215
|
+
paramName: '',
|
|
216
|
+
optionsKey: 'clientSecret',
|
|
217
|
+
},
|
|
218
|
+
],
|
|
219
|
+
items: {
|
|
220
|
+
type: 'object',
|
|
221
|
+
'x-decorator': 'ArrayItems.Item',
|
|
222
|
+
properties: {
|
|
223
|
+
space: {
|
|
224
|
+
type: 'void',
|
|
225
|
+
'x-component': 'Space',
|
|
226
|
+
properties: {
|
|
227
|
+
enabled: {
|
|
228
|
+
type: 'boolean',
|
|
229
|
+
'x-decorator': 'FormItem',
|
|
230
|
+
'x-component': 'Checkbox',
|
|
231
|
+
},
|
|
232
|
+
optionsKey: {
|
|
233
|
+
type: 'string',
|
|
234
|
+
'x-decorator': 'FormItem',
|
|
235
|
+
'x-decorator-props': {
|
|
236
|
+
style: {
|
|
237
|
+
width: '100px',
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
'x-component': 'Select',
|
|
241
|
+
'x-read-pretty': true,
|
|
242
|
+
enum: [
|
|
243
|
+
{ label: lang('Client ID'), value: 'clientId' },
|
|
244
|
+
{ label: lang('Client Secret'), value: 'clientSecret' },
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
paramName: {
|
|
248
|
+
type: 'string',
|
|
249
|
+
'x-decorator': 'FormItem',
|
|
250
|
+
'x-component': 'Input',
|
|
251
|
+
'x-component-props': {
|
|
252
|
+
placeholder: '{{t("Parameter name")}}',
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
userInfoMethod: {
|
|
261
|
+
type: 'string',
|
|
262
|
+
title: '{{t("Method to call the user info endpoint")}}',
|
|
263
|
+
'x- decorator': 'FormItem',
|
|
264
|
+
'x-component': 'Radio.Group',
|
|
265
|
+
default: 'GET',
|
|
266
|
+
enum: [
|
|
267
|
+
{
|
|
268
|
+
label: 'GET',
|
|
269
|
+
value: 'GET',
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
label: 'POST',
|
|
273
|
+
value: 'POST',
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
'x-reactions': [
|
|
277
|
+
{
|
|
278
|
+
dependencies: ['.accessTokenVia'],
|
|
279
|
+
when: '{{$deps[0] === "query"}}',
|
|
280
|
+
fulfill: {
|
|
281
|
+
state: {
|
|
282
|
+
value: 'GET',
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
dependencies: ['.accessTokenVia'],
|
|
288
|
+
when: '{{$deps[0] === "body"}}',
|
|
289
|
+
fulfill: {
|
|
290
|
+
state: {
|
|
291
|
+
value: 'POST',
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
},
|
|
297
|
+
accessTokenVia: {
|
|
298
|
+
type: 'string',
|
|
299
|
+
title: '{{t("Where to put the access token when calling the user info endpoint")}}',
|
|
300
|
+
'x- decorator': 'FormItem',
|
|
301
|
+
'x-component': 'Radio.Group',
|
|
302
|
+
default: 'header',
|
|
303
|
+
enum: [
|
|
304
|
+
{
|
|
305
|
+
label: lang('Header'),
|
|
306
|
+
value: 'header',
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
label: lang('Body (Use with POST method)'),
|
|
310
|
+
value: 'body',
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
label: lang('Query parameters (Use with GET method)'),
|
|
314
|
+
value: 'query',
|
|
315
|
+
},
|
|
316
|
+
],
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
usage: {
|
|
325
|
+
type: 'void',
|
|
326
|
+
'x-component': 'Usage',
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
const Usage = observer(
|
|
332
|
+
() => {
|
|
333
|
+
const { t } = useOidcTranslation();
|
|
334
|
+
const app = useApp();
|
|
335
|
+
|
|
336
|
+
const url = useMemo(() => {
|
|
337
|
+
return app.getApiUrl('oidc:redirect');
|
|
338
|
+
}, [app]);
|
|
339
|
+
|
|
340
|
+
const copy = (text: string) => {
|
|
341
|
+
navigator.clipboard.writeText(text);
|
|
342
|
+
message.success(t('Copied'));
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
return (
|
|
346
|
+
<Card title={t('Usage')} type="inner">
|
|
347
|
+
<FormItem label={t('Redirect URL')}>
|
|
348
|
+
<Input value={url} disabled={true} addonBefore={<CopyOutlined onClick={() => copy(url)} />} />
|
|
349
|
+
</FormItem>
|
|
350
|
+
</Card>
|
|
351
|
+
);
|
|
352
|
+
},
|
|
353
|
+
{ displayName: 'Usage' },
|
|
354
|
+
);
|
|
355
|
+
|
|
356
|
+
export const Options = () => {
|
|
357
|
+
const { t } = useOidcTranslation();
|
|
358
|
+
return <SchemaComponent scope={{ t }} components={{ Usage, ArrayItems, Space, FormTab }} schema={schema} />;
|
|
359
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Plugin } from '@nocobase/client';
|
|
2
|
+
import AuthPlugin from '@nocobase/plugin-auth/client';
|
|
3
|
+
import { authType } from '../constants';
|
|
4
|
+
import { OIDCButton } from './OIDCButton';
|
|
5
|
+
import { Options } from './Options';
|
|
6
|
+
|
|
7
|
+
export class PluginOIDCClient extends Plugin {
|
|
8
|
+
async load() {
|
|
9
|
+
const auth = this.app.pm.get(AuthPlugin);
|
|
10
|
+
auth.registerType(authType, {
|
|
11
|
+
components: {
|
|
12
|
+
SignInButton: OIDCButton,
|
|
13
|
+
AdminSettingsForm: Options,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default PluginOIDCClient;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { i18n } from '@nocobase/client';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
|
|
4
|
+
export const NAMESPACE = 'oidc';
|
|
5
|
+
|
|
6
|
+
// i18n.addResources('zh-CN', NAMESPACE, zhCN);
|
|
7
|
+
// i18n.addResources('en-US', NAMESPACE, enUS);
|
|
8
|
+
// i18n.addResources('ja-JP', NAMESPACE, jaJP);
|
|
9
|
+
// i18n.addResources('ru-RU', NAMESPACE, ruRU);
|
|
10
|
+
// i18n.addResources('tr-TR', NAMESPACE, trTR);
|
|
11
|
+
|
|
12
|
+
export function lang(key: string) {
|
|
13
|
+
return i18n.t(key, { ns: NAMESPACE });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function useOidcTranslation() {
|
|
17
|
+
return useTranslation(NAMESPACE);
|
|
18
|
+
}
|
package/src/constants.ts
ADDED
package/src/index.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Enable": "Enable",
|
|
3
|
+
"Issuer": "Issuer",
|
|
4
|
+
"OIDC manager": "OIDC manager",
|
|
5
|
+
"OIDC Providers": "OIDC Providers",
|
|
6
|
+
"Provider name": "Name",
|
|
7
|
+
"Client id": "Client id",
|
|
8
|
+
"Client secret": "Client secret",
|
|
9
|
+
"Openid configuration": "Openid configuration",
|
|
10
|
+
"Authorization endpoint": "Authorization endpoint",
|
|
11
|
+
"Access token endpoint": "Access token endpoint",
|
|
12
|
+
"JWKS endpoint": "JWKS endpoint",
|
|
13
|
+
"Userinfo endpoint": "Userinfo endpoint",
|
|
14
|
+
"Redirect url": "Redirect url",
|
|
15
|
+
"Logout endpoint": "Logout endpoint",
|
|
16
|
+
"Id token sign alg": "Id token sign alg",
|
|
17
|
+
"Add provider": "Add",
|
|
18
|
+
"Edit provider": "Edit",
|
|
19
|
+
"Delete provider": "Delete",
|
|
20
|
+
"Sign in button name, which will be displayed on the sign in page": "Sign in button name, which will be displayed on the sign in page",
|
|
21
|
+
"Use this field to bind the user": "Use this field to bind the user",
|
|
22
|
+
"Sign up automatically when the user does not exist": "Sign up automatically when the user does not exist",
|
|
23
|
+
"Username must be 2-16 characters in length (excluding @.<>\"'/)": "Username must be 2-16 characters in length (excluding @.<>\"'/)",
|
|
24
|
+
"User not found": "User not found",
|
|
25
|
+
"Basic configuration": "Basic configuration",
|
|
26
|
+
"Field mapping": "Field mapping",
|
|
27
|
+
"Advanced configuration": "Advanced configuration",
|
|
28
|
+
"Usage": "Usage",
|
|
29
|
+
"Redirect URL": "Redirect URL",
|
|
30
|
+
"Check if NocoBase is running on HTTP protocol": "Check if NocoBase is running on HTTP protocol",
|
|
31
|
+
"The port number of the NocoBase service if it is not 80 or 443": "The port number of the NocoBase service if it is not 80 or 443",
|
|
32
|
+
"Pass parameters in the authorization code grant exchange": "Pass parameters in the authorization code grant exchange",
|
|
33
|
+
"Method to call the user info endpoint": "Method to call the user info endpoint",
|
|
34
|
+
"Where to put the access token when calling the user info endpoint": "Where to put the access token when calling the user info endpoint",
|
|
35
|
+
"Header": "Header",
|
|
36
|
+
"Body (Use with POST method)": "Body (Use with POST method)",
|
|
37
|
+
"Query parameters (Use with GET method)": "Query parameters (Use with GET method)",
|
|
38
|
+
"Parameter name": "Parameter name",
|
|
39
|
+
"The state token helps prevent CSRF attacks. It's recommended to leave it blank for automatic random generation.": "The state token helps prevent CSRF attacks. It's recommended to leave it blank for automatic random generation."
|
|
40
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Enable": "Activar",
|
|
3
|
+
"Issuer": "Emisor",
|
|
4
|
+
"Actions": "Acciones",
|
|
5
|
+
"Delete": "Borrar",
|
|
6
|
+
"Edit": "Editar",
|
|
7
|
+
"Button title": "Título del botón",
|
|
8
|
+
"OIDC manager": "Gestor OIDC",
|
|
9
|
+
"OIDC Providers": "Proveedores OIDC",
|
|
10
|
+
"Provider name": "Nombre",
|
|
11
|
+
"Client id": "Id de cliente",
|
|
12
|
+
"Client secret": "Secreto del cliente",
|
|
13
|
+
"Openid configuration": "Configuración Openid",
|
|
14
|
+
"Authorization endpoint": "Endpoint de autorización ",
|
|
15
|
+
"Access token endpoint": "Endpoint de token de acceso",
|
|
16
|
+
"JWKS endpoint": "Endpoint de JWKS",
|
|
17
|
+
"Userinfo endpoint": "Userinfo endpoint",
|
|
18
|
+
"Redirect url": "Redirect url",
|
|
19
|
+
"Logout endpoint": "Endpoint de cierre de sesión",
|
|
20
|
+
"Id token sign alg": "Id token sign alg",
|
|
21
|
+
"Add provider": "Añadir Proveedor",
|
|
22
|
+
"Edit provider": "Editar Proveedor",
|
|
23
|
+
"Delete provider": "Borrar Proveedor",
|
|
24
|
+
"Sign in button name, which will be displayed on the sign in page": "Nombre del botón de inicio de sesión, que se mostrará en la página de inicio de sesión"
|
|
25
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Enable": "Activer",
|
|
3
|
+
"Issuer": "Issuer",
|
|
4
|
+
"OIDC manager": "OIDC manager",
|
|
5
|
+
"OIDC Providers": "OIDC Providers",
|
|
6
|
+
"Provider name": "Nom",
|
|
7
|
+
"Client id": "Client id",
|
|
8
|
+
"Client secret": "Client secret",
|
|
9
|
+
"Openid configuration": "Openid configuration",
|
|
10
|
+
"Authorization endpoint": "Authorization endpoint",
|
|
11
|
+
"Access token endpoint": "Access token endpoint",
|
|
12
|
+
"JWKS endpoint": "JWKS endpoint",
|
|
13
|
+
"Userinfo endpoint": "Userinfo endpoint",
|
|
14
|
+
"Redirect url": "Redirect url",
|
|
15
|
+
"Logout endpoint": "Logout endpoint",
|
|
16
|
+
"Id token sign alg": "Id token sign alg",
|
|
17
|
+
"Add provider": "Ajouter",
|
|
18
|
+
"Edit provider": "Modifier",
|
|
19
|
+
"Delete provider": "Supprimer",
|
|
20
|
+
"Sign in button name, which will be displayed on the sign in page": "Nom du bouton de connexion, qui sera affiché sur la page de connexion"
|
|
21
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Enable": "활성화",
|
|
3
|
+
"Actions": "작업",
|
|
4
|
+
"Delete": "삭제",
|
|
5
|
+
"Edit": "편집",
|
|
6
|
+
"Copied": "복사됨",
|
|
7
|
+
"Field Map": "필드 매핑",
|
|
8
|
+
"id_token signed response algorithm": "id_token 서명 응답 알고리즘",
|
|
9
|
+
"Use this field to bind the user": "이 필드를 사용하여 사용자를 바인딩합니다",
|
|
10
|
+
"Sign up automatically when the user does not exist": "사용자가 존재하지 않을 때 자동으로 가입",
|
|
11
|
+
"Username must be 2-16 characters in length (excluding @.<>\"'/)": "사용자 이름은 2-16 자여야합니다 (@.<>\"'/ 제외)",
|
|
12
|
+
"User not found": "사용자를 찾을 수 없음",
|
|
13
|
+
"Basic configuration": "기본 설정",
|
|
14
|
+
"Field mapping": "필드 매핑",
|
|
15
|
+
"Advanced configuration": "고급 설정",
|
|
16
|
+
"Usage": "사용 방법",
|
|
17
|
+
"Redirect URL": "리디렉션 URL",
|
|
18
|
+
"Check if NocoBase is running on HTTP protocol": "NocoBase가 HTTP 프로토콜에서 실행 중인지 확인",
|
|
19
|
+
"The port number of the NocoBase service if it is not 80 or 443": "NocoBase 서비스의 포트 번호, 기본값은 443/80",
|
|
20
|
+
"Pass parameters in the authorization code grant exchange": "권한 부여 코드 교환 중에 매개 변수를 전달",
|
|
21
|
+
"Method to call the user info endpoint": "사용자 정보 엔드포인트를 호출하는 방법",
|
|
22
|
+
"Where to put the access token when calling the user info endpoint": "사용자 정보 엔드포인트를 호출할 때 access_token을 어디에 두어야 하는지",
|
|
23
|
+
"Header": "헤더 (기본값)",
|
|
24
|
+
"Body (Use with POST method)": "바디 (POST 방식과 함께 사용)",
|
|
25
|
+
"Query parameters (Use with GET method)": "쿼리 매개 변수 (GET 방식과 함께 사용)",
|
|
26
|
+
"Parameter name": "매개 변수 이름",
|
|
27
|
+
"The state token helps prevent CSRF attacks. It's recommended to leave it blank for automatic random generation.": "상태 토큰은 CSRF 공격을 방지하는 데 도움이 됩니다. 자동으로 무작위로 생성하려면 비워 두는 것이 좋습니다."
|
|
28
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Enable": "Habilitar",
|
|
3
|
+
"Issuer": "Emissor",
|
|
4
|
+
"OIDC manager": "Gerenciador OIDC",
|
|
5
|
+
"OIDC Providers": "Provedores OIDC",
|
|
6
|
+
"Provider name": "Nome do provedor",
|
|
7
|
+
"Client id": "ID do cliente",
|
|
8
|
+
"Client secret": "Segredo do cliente",
|
|
9
|
+
"Openid configuration": "Configuração OpenID",
|
|
10
|
+
"Authorization endpoint": "Endpoint de autorização",
|
|
11
|
+
"Access token endpoint": "Endpoint de token de acesso",
|
|
12
|
+
"JWKS endpoint": "Endpoint JWKS",
|
|
13
|
+
"Userinfo endpoint": "Endpoint de informações do usuário",
|
|
14
|
+
"Redirect url": "URL de redirecionamento",
|
|
15
|
+
"Logout endpoint": "Endpoint de logout",
|
|
16
|
+
"Id token sign alg": "Algoritmo de assinatura do token de ID",
|
|
17
|
+
"Add provider": "Adicionar",
|
|
18
|
+
"Edit provider": "Editar",
|
|
19
|
+
"Delete provider": "Excluir",
|
|
20
|
+
"Sign in button name, which will be displayed on the sign in page": "Nome do botão de login, que será exibido na página de login"
|
|
21
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Enable": "启用",
|
|
3
|
+
"Actions": "操作",
|
|
4
|
+
"Delete": "删除",
|
|
5
|
+
"Edit": "编辑",
|
|
6
|
+
"Copied": "已复制",
|
|
7
|
+
"Field Map": "字段映射",
|
|
8
|
+
"id_token signed response algorithm": "id_token签名算法",
|
|
9
|
+
"Use this field to bind the user": "使用此字段绑定用户",
|
|
10
|
+
"Sign up automatically when the user does not exist": "用户不存在时自动注册",
|
|
11
|
+
"Username must be 2-16 characters in length (excluding @.<>\"'/)": "用户名必须为2-16个字符并且不包含@.<>\"'/)",
|
|
12
|
+
"User not found": "用户不存在",
|
|
13
|
+
"Basic configuration": "基础配置",
|
|
14
|
+
"Field mapping": "字段映射",
|
|
15
|
+
"Advanced configuration": "高级配置",
|
|
16
|
+
"Usage": "使用",
|
|
17
|
+
"Redirect URL": "回调 URL",
|
|
18
|
+
"Check if NocoBase is running on HTTP protocol": "NocoBase 应用为HTTP协议时勾选",
|
|
19
|
+
"The port number of the NocoBase service if it is not 80 or 443": "NocoBase 应用端口,默认 443/80",
|
|
20
|
+
"Pass parameters in the authorization code grant exchange": "使用 code 交换 token 时需要传递的参数",
|
|
21
|
+
"Method to call the user info endpoint": "访问获取用户信息的 API 的 HTTP 方法",
|
|
22
|
+
"Where to put the access token when calling the user info endpoint": "访问获取用户信息的 API 时 access_token 的传递方式",
|
|
23
|
+
"Header": "请求头 (Header, 默认)",
|
|
24
|
+
"Body (Use with POST method)": "请求体(Body, 配合 POST 方法使用)",
|
|
25
|
+
"Query parameters (Use with GET method)": "请求 URL 参数(Query, 配合 GET 方法使用)",
|
|
26
|
+
"Parameter name": "参数名",
|
|
27
|
+
"The state token helps prevent CSRF attacks. It's recommended to leave it blank for automatic random generation.": "state token 用于防止 CSRF 攻击,建议留空使用自动生成的随机值。"
|
|
28
|
+
}
|