@authing/react-ui-components 2.4.58 → 2.4.59-alpha.0
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/lib/index.d.ts +1241 -0
- package/lib/index.min.css +1 -1
- package/lib/index.min.js +1 -1
- package/lib/index.min.js.LICENSE.txt +9 -0
- package/package.json +6 -7
- package/src/components/AuthingGuard/Forms/LdapLoginForm/index.tsx +1 -5
- package/src/components/AuthingGuard/Forms/QrCodeLoginForm/index.tsx +3 -1
- package/src/components/AuthingGuard/Forms/SocialAndIdpLogin/index.tsx +3 -3
- package/src/components/AuthingGuard/GuardLayout/index.tsx +6 -1
- package/src/components/AuthingGuard/LoginLayout/index.tsx +67 -23
- package/src/components/AuthingGuard/api/appConfig.ts +3 -2
- package/src/components/AuthingGuard/api/userPoolConfig.ts +2 -0
- package/src/components/AuthingGuard/types/Forms.ts +1 -0
- package/src/components/AuthingGuard/types/GuardConfig.ts +1 -0
- package/src/index.tsx +16 -5
|
@@ -4,6 +4,15 @@
|
|
|
4
4
|
http://jedwatson.github.io/classnames
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @license
|
|
9
|
+
* Lodash <https://lodash.com/>
|
|
10
|
+
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
|
11
|
+
* Released under MIT license <https://lodash.com/license>
|
|
12
|
+
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|
13
|
+
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|
14
|
+
*/
|
|
15
|
+
|
|
7
16
|
/** @license React v16.13.1
|
|
8
17
|
* react-is.production.min.js
|
|
9
18
|
*
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@authing/react-ui-components",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.59-alpha.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"main": "lib/index.min.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"antd": "^4.8.0",
|
|
9
|
-
"authing-js-sdk": "4.
|
|
9
|
+
"authing-js-sdk": "4.23.1",
|
|
10
10
|
"qs": "^6.9.4"
|
|
11
11
|
},
|
|
12
12
|
"peerDependencies": {
|
|
13
|
-
"react": "16.14.0",
|
|
14
|
-
"react-dom": "16.14.0"
|
|
13
|
+
"react": "^16.14.0",
|
|
14
|
+
"react-dom": "^16.14.0"
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
17
|
"start": "PORT=3006 node scripts/start.js",
|
|
@@ -184,6 +184,5 @@
|
|
|
184
184
|
"webpack-dev-server": "3.11.0",
|
|
185
185
|
"webpack-manifest-plugin": "2.2.0",
|
|
186
186
|
"workbox-webpack-plugin": "5.1.4"
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -68,12 +68,8 @@ export const LdapLoginForm = forwardRef<FormInstance, PasswordLoginFormProps>(
|
|
|
68
68
|
try {
|
|
69
69
|
const identity = values.identity && values.identity.trim()
|
|
70
70
|
const password = values.password && values.password.trim()
|
|
71
|
-
const captchaCode = values.captchaCode && values.captchaCode.trim()
|
|
72
71
|
|
|
73
|
-
const user = await authClient.loginByLdap(identity, password
|
|
74
|
-
autoRegister,
|
|
75
|
-
captchaCode,
|
|
76
|
-
})
|
|
72
|
+
const user = await authClient.loginByLdap(identity, password)
|
|
77
73
|
onSuccess && onSuccess(user)
|
|
78
74
|
} catch (error) {
|
|
79
75
|
if (typeof error.message === 'string') {
|
|
@@ -14,6 +14,7 @@ export const QrCodeLoginForm: FC<QrLoginFormProps> = ({
|
|
|
14
14
|
onFail,
|
|
15
15
|
onSuccess,
|
|
16
16
|
type,
|
|
17
|
+
idpId,
|
|
17
18
|
}) => {
|
|
18
19
|
const {
|
|
19
20
|
state: { authClient, config },
|
|
@@ -31,6 +32,7 @@ export const QrCodeLoginForm: FC<QrLoginFormProps> = ({
|
|
|
31
32
|
|
|
32
33
|
useEffect(() => {
|
|
33
34
|
client.startScanning('authingGuardQrcode', {
|
|
35
|
+
extIdpConnId: idpId,
|
|
34
36
|
autoExchangeUserInfo: true,
|
|
35
37
|
...config.qrCodeScanOptions,
|
|
36
38
|
onStart(timer) {
|
|
@@ -46,7 +48,7 @@ export const QrCodeLoginForm: FC<QrLoginFormProps> = ({
|
|
|
46
48
|
},
|
|
47
49
|
})
|
|
48
50
|
return () => clearInterval(timerRef.current)
|
|
49
|
-
}, [client, config.qrCodeScanOptions, onFail, onSuccess])
|
|
51
|
+
}, [client, config.qrCodeScanOptions, idpId, onFail, onSuccess])
|
|
50
52
|
|
|
51
53
|
return (
|
|
52
54
|
<div className="authing-guard-qr-form">
|
|
@@ -218,7 +218,7 @@ export const SocialAndIdpLogin: FC<SocialAndIdpLoginProps> = ({
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
const onLogin = () => {
|
|
221
|
-
authClient.social.authorize(item.
|
|
221
|
+
authClient.social.authorize(item.identifier, {
|
|
222
222
|
onSuccess(user) {
|
|
223
223
|
onSuccess(user)
|
|
224
224
|
},
|
|
@@ -254,12 +254,12 @@ export const SocialAndIdpLogin: FC<SocialAndIdpLoginProps> = ({
|
|
|
254
254
|
}
|
|
255
255
|
onClick={onLogin}
|
|
256
256
|
>
|
|
257
|
-
{item.tooltip?.[i18n.language as Lang] || item.
|
|
257
|
+
{item.tooltip?.[i18n.language as Lang] || item.displayName}
|
|
258
258
|
</Button>
|
|
259
259
|
) : (
|
|
260
260
|
<Tooltip
|
|
261
261
|
key={item.provider}
|
|
262
|
-
title={item.tooltip?.[i18n.language as Lang] || item.
|
|
262
|
+
title={item.tooltip?.[i18n.language as Lang] || item.displayName}
|
|
263
263
|
>
|
|
264
264
|
<div className="authing-social-login-item" onClick={onLogin}>
|
|
265
265
|
<IconFont type={iconType} />
|
|
@@ -157,7 +157,7 @@ const useGuardConfig = () => {
|
|
|
157
157
|
defaultGuardConfig.loginMethods
|
|
158
158
|
|
|
159
159
|
// 扫码多源配置
|
|
160
|
-
const qrcodeTabsSettings = appConfig.qrcodeTabsSettings
|
|
160
|
+
const qrcodeTabsSettings = appConfig.qrcodeTabsSettings ?? {}
|
|
161
161
|
|
|
162
162
|
// 账密登录的登录拆分
|
|
163
163
|
const passwordLoginMethods =
|
|
@@ -171,6 +171,8 @@ const useGuardConfig = () => {
|
|
|
171
171
|
appConfig.loginTabs?.default ||
|
|
172
172
|
defaultGuardConfig.defaultLoginMethod
|
|
173
173
|
|
|
174
|
+
const loginMethodTitleMapping = appConfig.loginTabs?.title
|
|
175
|
+
|
|
174
176
|
// 注册方式
|
|
175
177
|
const registerMethods =
|
|
176
178
|
userConfig.registerMethods ||
|
|
@@ -239,12 +241,15 @@ const useGuardConfig = () => {
|
|
|
239
241
|
qrcodeTabsSettings,
|
|
240
242
|
agreementEnabled: appConfig.agreementEnabled,
|
|
241
243
|
agreements: appConfig.agreements,
|
|
244
|
+
loginMethodTitleMapping: loginMethodTitleMapping,
|
|
242
245
|
}
|
|
243
246
|
)
|
|
244
247
|
}, [
|
|
245
248
|
userConfig,
|
|
246
249
|
appConfig.loginTabs?.list,
|
|
250
|
+
appConfig.loginTabs?.defaultV2,
|
|
247
251
|
appConfig.loginTabs?.default,
|
|
252
|
+
appConfig.loginTabs?.title,
|
|
248
253
|
appConfig.qrcodeTabsSettings,
|
|
249
254
|
appConfig.passwordTabConfig?.enabledLoginMethods,
|
|
250
255
|
appConfig.registerTabs?.list,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { message } from 'antd'
|
|
2
2
|
import { User } from 'authing-js-sdk'
|
|
3
3
|
import { FormInstance } from 'antd/lib/form'
|
|
4
|
-
import React, { useCallback, useRef } from 'react'
|
|
4
|
+
import React, { useCallback, useMemo, useRef } from 'react'
|
|
5
5
|
|
|
6
6
|
import { useGuardContext } from '../../../context/global/context'
|
|
7
7
|
import {
|
|
@@ -75,36 +75,36 @@ const useNormalLoginTabs = ({ onSuccess, onFail }: BaseFormProps) => {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
const LOGIN_FORM_MAP = {
|
|
78
|
-
[LoginMethods.Password]: (
|
|
78
|
+
[LoginMethods.Password]: (props: any) => (
|
|
79
79
|
<PasswordLoginForm
|
|
80
|
-
{...
|
|
80
|
+
{...props}
|
|
81
81
|
ref={(v) => (formRef.current[LoginMethods.Password] = v!)}
|
|
82
82
|
/>
|
|
83
83
|
),
|
|
84
|
-
[LoginMethods.PhoneCode]: (
|
|
84
|
+
[LoginMethods.PhoneCode]: (props: any) => (
|
|
85
85
|
<PhoneCodeLoginForm
|
|
86
|
-
{...
|
|
86
|
+
{...props}
|
|
87
87
|
ref={(v) => (formRef.current[LoginMethods.PhoneCode] = v!)}
|
|
88
88
|
/>
|
|
89
89
|
),
|
|
90
|
-
[LoginMethods.AppQr]: (
|
|
91
|
-
<QrCodeLoginForm type={LoginMethods.AppQr} {...
|
|
90
|
+
[LoginMethods.AppQr]: (props: any) => (
|
|
91
|
+
<QrCodeLoginForm type={LoginMethods.AppQr} {...props} />
|
|
92
92
|
),
|
|
93
|
-
[LoginMethods.WxMinQr]: (
|
|
94
|
-
<QrCodeLoginForm type={LoginMethods.WxMinQr} {...
|
|
93
|
+
[LoginMethods.WxMinQr]: (props: any) => (
|
|
94
|
+
<QrCodeLoginForm type={LoginMethods.WxMinQr} {...props} />
|
|
95
95
|
),
|
|
96
|
-
[LoginMethods.LDAP]: (
|
|
96
|
+
[LoginMethods.LDAP]: (props: any) => (
|
|
97
97
|
<LdapLoginForm
|
|
98
|
-
{...
|
|
98
|
+
{...props}
|
|
99
99
|
ref={(v) => (formRef.current[LoginMethods.LDAP] = v!)}
|
|
100
100
|
/>
|
|
101
101
|
),
|
|
102
|
-
[LoginMethods.WechatMpQrcode]: (
|
|
103
|
-
<QrCodeLoginForm type={LoginMethods.WechatMpQrcode} {...
|
|
102
|
+
[LoginMethods.WechatMpQrcode]: (props: any) => (
|
|
103
|
+
<QrCodeLoginForm type={LoginMethods.WechatMpQrcode} {...props} />
|
|
104
104
|
),
|
|
105
|
-
[LoginMethods.AD]: (
|
|
105
|
+
[LoginMethods.AD]: (props: any) => (
|
|
106
106
|
<ADLoginForm
|
|
107
|
-
{...
|
|
107
|
+
{...props}
|
|
108
108
|
ref={(v) => (formRef.current[LoginMethods.AD] = v!)}
|
|
109
109
|
/>
|
|
110
110
|
),
|
|
@@ -113,14 +113,46 @@ const useNormalLoginTabs = ({ onSuccess, onFail }: BaseFormProps) => {
|
|
|
113
113
|
const {
|
|
114
114
|
state: { config },
|
|
115
115
|
} = useGuardContext()
|
|
116
|
-
const {
|
|
116
|
+
const {
|
|
117
|
+
loginMethods = [],
|
|
118
|
+
loginMethodTitleMapping,
|
|
119
|
+
qrcodeTabsSettings,
|
|
120
|
+
} = config
|
|
117
121
|
|
|
118
|
-
|
|
119
|
-
key: item,
|
|
120
|
-
label: LOGIN_METHODS_MAP()?.[item]!,
|
|
121
|
-
component: LOGIN_FORM_MAP[item],
|
|
122
|
-
}))
|
|
122
|
+
let tabs: any[] = []
|
|
123
123
|
|
|
124
|
+
// 兼容 密码登陆 donglyc
|
|
125
|
+
let filterLoginMethods = loginMethods.filter(
|
|
126
|
+
(d) => d.indexOf('password') === -1
|
|
127
|
+
)
|
|
128
|
+
const hasPassword = loginMethods.some((d) => d.indexOf('password') !== -1)
|
|
129
|
+
if (hasPassword) filterLoginMethods.push(LoginMethods.Password)
|
|
130
|
+
|
|
131
|
+
filterLoginMethods.forEach((method: LoginMethods) => {
|
|
132
|
+
if (
|
|
133
|
+
[LoginMethods.WechatMpQrcode, LoginMethods.WxMinQr].includes(method) &&
|
|
134
|
+
qrcodeTabsSettings[method]
|
|
135
|
+
) {
|
|
136
|
+
tabs.push(
|
|
137
|
+
...qrcodeTabsSettings[method].map((idp) => {
|
|
138
|
+
return {
|
|
139
|
+
key: idp.id,
|
|
140
|
+
label: idp.title || loginMethodTitleMapping[method],
|
|
141
|
+
component: LOGIN_FORM_MAP[method]({
|
|
142
|
+
...formProps,
|
|
143
|
+
idp,
|
|
144
|
+
}),
|
|
145
|
+
}
|
|
146
|
+
})
|
|
147
|
+
)
|
|
148
|
+
} else {
|
|
149
|
+
tabs.push({
|
|
150
|
+
key: method,
|
|
151
|
+
label: LOGIN_METHODS_MAP()[method],
|
|
152
|
+
component: LOGIN_FORM_MAP[method](formProps),
|
|
153
|
+
})
|
|
154
|
+
}
|
|
155
|
+
})
|
|
124
156
|
return {
|
|
125
157
|
tabs,
|
|
126
158
|
}
|
|
@@ -133,13 +165,25 @@ const SHOW_SOCIAL_LOGIN_TAB = [
|
|
|
133
165
|
]
|
|
134
166
|
export const LoginLayout = () => {
|
|
135
167
|
const {
|
|
136
|
-
state: { activeTabs },
|
|
168
|
+
state: { activeTabs, config },
|
|
137
169
|
setValue,
|
|
138
170
|
} = useGuardContext()
|
|
171
|
+
const { qrcodeTabsSettings } = config
|
|
139
172
|
|
|
140
173
|
const { onFail, onSuccess } = useFormActions()
|
|
141
174
|
const { tabs } = useNormalLoginTabs({ onSuccess, onFail })
|
|
142
175
|
|
|
176
|
+
const activeKey = useMemo(() => {
|
|
177
|
+
const activeTab = activeTabs[GuardScenes.Login]
|
|
178
|
+
if (
|
|
179
|
+
[LoginMethods.WechatMpQrcode, LoginMethods.WxMinQr].includes(activeTab) &&
|
|
180
|
+
qrcodeTabsSettings[activeTab]
|
|
181
|
+
) {
|
|
182
|
+
return qrcodeTabsSettings[activeTab].find((item) => item.isDefault)?.id
|
|
183
|
+
}
|
|
184
|
+
return activeTab
|
|
185
|
+
}, [activeTabs, qrcodeTabsSettings])
|
|
186
|
+
|
|
143
187
|
return (
|
|
144
188
|
<>
|
|
145
189
|
<AuthingTabs
|
|
@@ -150,7 +194,7 @@ export const LoginLayout = () => {
|
|
|
150
194
|
[GuardScenes.Login]: t,
|
|
151
195
|
})
|
|
152
196
|
}
|
|
153
|
-
activeKey={
|
|
197
|
+
activeKey={activeKey}
|
|
154
198
|
/>
|
|
155
199
|
|
|
156
200
|
{SHOW_SOCIAL_LOGIN_TAB.includes(activeTabs[GuardScenes.Login]) && (
|
|
@@ -31,11 +31,11 @@ export const ApplicationMfaTypeLabel: () => Record<
|
|
|
31
31
|
|
|
32
32
|
export type QrcodeTabsSettings = Record<
|
|
33
33
|
LoginMethods,
|
|
34
|
-
{
|
|
34
|
+
Array<{
|
|
35
35
|
id: string
|
|
36
36
|
title: string
|
|
37
37
|
isDefault?: boolean
|
|
38
|
-
}
|
|
38
|
+
}>
|
|
39
39
|
>
|
|
40
40
|
|
|
41
41
|
export interface OidcClientMetadata {
|
|
@@ -102,6 +102,7 @@ export interface ApplicationConfig {
|
|
|
102
102
|
loginTabs: {
|
|
103
103
|
list: string[]
|
|
104
104
|
default: string
|
|
105
|
+
defaultV2?: string
|
|
105
106
|
title: { [x: string]: string }
|
|
106
107
|
}
|
|
107
108
|
socialConnections: SocialConnectionItem[]
|
|
@@ -72,8 +72,10 @@ export interface ICasConnectionConfig {
|
|
|
72
72
|
}
|
|
73
73
|
export interface SocialConnectionItem {
|
|
74
74
|
name: string
|
|
75
|
+
displayName: string
|
|
75
76
|
logo: string
|
|
76
77
|
description: string
|
|
78
|
+
identifier: string
|
|
77
79
|
provider: SocialConnectionProvider
|
|
78
80
|
authorizationUrl: string
|
|
79
81
|
tooltip: Record<Lang, string>
|
|
@@ -27,6 +27,7 @@ export interface LdapLoginFormProps extends BaseFormProps {
|
|
|
27
27
|
|
|
28
28
|
export interface QrLoginFormProps extends BaseFormProps {
|
|
29
29
|
type: LoginMethods.AppQr | LoginMethods.WxMinQr | LoginMethods.WechatMpQrcode
|
|
30
|
+
idpId?: string
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
export interface EmailRegisterFormProps extends BaseFormProps {
|
|
@@ -413,6 +413,7 @@ export interface GuardConfig extends UserConfig {
|
|
|
413
413
|
publicKey: ApplicationConfig['publicKey']
|
|
414
414
|
agreementEnabled: boolean
|
|
415
415
|
agreements: Agreement[]
|
|
416
|
+
loginMethodTitleMapping: Record<string, string>
|
|
416
417
|
qrcodeTabsSettings: QrcodeTabsSettings
|
|
417
418
|
}
|
|
418
419
|
|
package/src/index.tsx
CHANGED
|
@@ -4,6 +4,8 @@ import ReactDOM from 'react-dom'
|
|
|
4
4
|
import { Lang } from './components'
|
|
5
5
|
import { AuthingGuard } from './components/AuthingGuard'
|
|
6
6
|
|
|
7
|
+
import { SocialConnectionProvider } from 'authing-js-sdk'
|
|
8
|
+
|
|
7
9
|
import {
|
|
8
10
|
GuardMode,
|
|
9
11
|
// LoginMethods,
|
|
@@ -21,8 +23,9 @@ const App = () => {
|
|
|
21
23
|
|
|
22
24
|
const config: UserConfig = {
|
|
23
25
|
mode: GuardMode.Modal,
|
|
24
|
-
appHost: 'https://core.dev2.authing-inc.co
|
|
25
|
-
|
|
26
|
+
// appHost: 'https://core.dev2.authing-inc.co',
|
|
27
|
+
apiHost: 'http://console.authing.localhost:3000',
|
|
28
|
+
// appHost: 'http://0w9ugz.authing.localhost:3000',
|
|
26
29
|
// apiHost: 'http://192.168.50.57:3000',
|
|
27
30
|
// loginMethods: Object.values(LoginMethods),
|
|
28
31
|
// logo:
|
|
@@ -53,7 +56,7 @@ const App = () => {
|
|
|
53
56
|
// }
|
|
54
57
|
// `,
|
|
55
58
|
// // autoRegister: true,
|
|
56
|
-
|
|
59
|
+
socialConnections: [SocialConnectionProvider.WECHATPC],
|
|
57
60
|
}
|
|
58
61
|
|
|
59
62
|
const [visible, setVisible] = useState(false)
|
|
@@ -70,6 +73,14 @@ const App = () => {
|
|
|
70
73
|
return (
|
|
71
74
|
// eslint-disable-next-line react/jsx-no-undef
|
|
72
75
|
<>
|
|
76
|
+
<Button
|
|
77
|
+
type="primary"
|
|
78
|
+
onClick={() => {
|
|
79
|
+
//
|
|
80
|
+
}}
|
|
81
|
+
>
|
|
82
|
+
add socialConnections
|
|
83
|
+
</Button>
|
|
73
84
|
<Button
|
|
74
85
|
type="primary"
|
|
75
86
|
onClick={() => {
|
|
@@ -114,8 +125,8 @@ const App = () => {
|
|
|
114
125
|
}}
|
|
115
126
|
// onLoad={(a) => console.log(a, '加载完成')}
|
|
116
127
|
// onPwdResetError={(e) => console.log(e)}
|
|
117
|
-
appId="
|
|
118
|
-
tenantId="
|
|
128
|
+
appId="61ada57aef5ed526528ed5b6"
|
|
129
|
+
// tenantId="61a5ed126cddae656cce9007"
|
|
119
130
|
// appId="5fd877fb0ba0421962eced94"
|
|
120
131
|
config={config}
|
|
121
132
|
/>
|