@authing/react-ui-components 2.4.54-alpha.0 → 2.4.55-alpha.2

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.
Files changed (66) hide show
  1. package/build/asset-manifest.json +18 -18
  2. package/build/index.html +1 -1
  3. package/build/static/css/{2.40c24d2f.chunk.css → 2.e5f4a1ca.chunk.css} +2 -2
  4. package/build/static/css/2.e5f4a1ca.chunk.css.map +1 -0
  5. package/build/static/css/main.4dd73333.chunk.css +2 -0
  6. package/build/static/css/main.4dd73333.chunk.css.map +1 -0
  7. package/build/static/js/2.b28e1968.chunk.js +3 -0
  8. package/build/static/js/2.b28e1968.chunk.js.LICENSE.txt +70 -0
  9. package/build/static/js/2.b28e1968.chunk.js.map +1 -0
  10. package/build/static/js/{3.edcab7cd.chunk.js → 3.584da164.chunk.js} +2 -2
  11. package/build/static/js/{3.edcab7cd.chunk.js.map → 3.584da164.chunk.js.map} +1 -1
  12. package/build/static/js/main.eeb41586.chunk.js +2 -0
  13. package/build/static/js/main.eeb41586.chunk.js.map +1 -0
  14. package/build/static/js/{runtime-main.1b4b9135.js → runtime-main.6174f3e9.js} +2 -2
  15. package/build/static/js/{runtime-main.1b4b9135.js.map → runtime-main.6174f3e9.js.map} +1 -1
  16. package/lib/index.min.css +1 -2
  17. package/lib/index.min.js +1 -1
  18. package/lib/index.min.js.LICENSE.txt +0 -64
  19. package/package.json +3 -5
  20. package/src/common/AuthingDropdown/index.tsx +20 -58
  21. package/src/common/AuthingDropdown/style.less +8 -33
  22. package/src/components/AuthingGuard/AppMFALayout/index.tsx +15 -30
  23. package/src/components/AuthingGuard/Forms/QrCodeLoginForm/index.tsx +3 -1
  24. package/src/components/AuthingGuard/GuardLayout/index.tsx +16 -32
  25. package/src/components/AuthingGuard/GuardLayout/style.less +0 -4
  26. package/src/components/AuthingGuard/Header/index.tsx +5 -2
  27. package/src/components/AuthingGuard/Header/style.less +23 -11
  28. package/src/components/AuthingGuard/IconFont/iconfont.js +74 -1
  29. package/src/components/AuthingGuard/LoginLayout/index.tsx +53 -22
  30. package/src/components/AuthingGuard/api/appConfig.ts +3 -2
  31. package/src/components/AuthingGuard/api/http.ts +32 -9
  32. package/src/components/AuthingGuard/constants.ts +2 -0
  33. package/src/components/AuthingGuard/hooks/index.tsx +0 -37
  34. package/src/components/AuthingGuard/index.tsx +8 -3
  35. package/src/components/AuthingGuard/locales/en/common.json +1 -2
  36. package/src/components/AuthingGuard/locales/en/login.json +1 -1
  37. package/src/components/AuthingGuard/locales/zh/common.json +1 -16
  38. package/src/components/AuthingGuard/types/Forms.ts +1 -2
  39. package/src/components/AuthingGuard/types/GuardConfig.ts +2 -1
  40. package/src/context/global/reducer.tsx +0 -4
  41. package/src/index.tsx +16 -28
  42. package/src/utils/index.ts +0 -23
  43. package/yarn-error.log +19616 -0
  44. package/build/static/css/2.40c24d2f.chunk.css.map +0 -1
  45. package/build/static/css/main.ee0e3901.chunk.css +0 -2
  46. package/build/static/css/main.ee0e3901.chunk.css.map +0 -1
  47. package/build/static/js/2.354276b9.chunk.js +0 -3
  48. package/build/static/js/2.354276b9.chunk.js.LICENSE.txt +0 -156
  49. package/build/static/js/2.354276b9.chunk.js.map +0 -1
  50. package/build/static/js/main.6c028b56.chunk.js +0 -2
  51. package/build/static/js/main.6c028b56.chunk.js.map +0 -1
  52. package/lib/index.d.ts +0 -1374
  53. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/BindTotpForm/AppDownload.tsx +0 -198
  54. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/BindTotpForm/BindSuccess.tsx +0 -48
  55. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/BindTotpForm/CopyIcon.tsx +0 -52
  56. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/BindTotpForm/InputSaftyCode.tsx +0 -25
  57. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/BindTotpForm/SaveSecretKey.tsx +0 -34
  58. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/BindTotpForm/ScanQrcode.tsx +0 -44
  59. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/BindTotpForm/index.tsx +0 -40
  60. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/BindTotpForm/styles.less +0 -454
  61. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/MobileSteps/index.tsx +0 -49
  62. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/MobileSteps/style.less +0 -10
  63. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/UserMfa/index.tsx +0 -361
  64. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/UserMfa/style.less +0 -12
  65. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/VerifyTotpForm.tsx +0 -120
  66. package/src/components/AuthingGuard/Forms/TotpMfaVerifyForm/index.tsx +0 -35
@@ -1 +0,0 @@
1
- {"version":3,"sources":["components/AuthingGuard/hooks/index.tsx","context/global/reducer.tsx","context/base.tsx","context/global/context.tsx","components/AuthingGuard/api/http.ts","utils/popupCenter.ts","utils/index.ts","components/AuthingGuard/MfaLayout/Steps.ts","components/AuthingGuard/Header/index.tsx","components/AuthingGuard/hooks/useScreenSize.tsx","components/AuthingGuard/Forms/LoginFormFooter/index.tsx","components/AuthingGuard/Forms/ADLoginForm/index.tsx","components/AuthingGuard/Forms/ResetPwdForm/Step1.tsx","components/AuthingGuard/Forms/SendPhoneCode/SendCodeBtn.tsx","components/AuthingGuard/Forms/SendPhoneCode/index.tsx","components/AuthingGuard/Forms/ResetPwdForm/Step2.tsx","components/AuthingGuard/Forms/ResetPwdForm/Step3.tsx","components/AuthingGuard/Forms/ResetPwdForm/Step4.tsx","components/AuthingGuard/Forms/ResetPwdForm/Footer.tsx","components/AuthingGuard/Forms/ResetPwdForm/index.tsx","common/VerifyCodeInput/index.tsx","components/AuthingGuard/Forms/MfaVerifyForm/index.tsx","components/AuthingGuard/Forms/LdapLoginForm/index.tsx","components/AuthingGuard/Forms/QrCodeLoginForm/index.tsx","components/AuthingGuard/Forms/MfaResetCodeForm/Step1.tsx","common/CopyAbleText/index.tsx","utils/clipboard.ts","components/AuthingGuard/Forms/MfaResetCodeForm/Step2.tsx","components/AuthingGuard/Forms/MfaResetCodeForm/index.tsx","components/AuthingGuard/Forms/RegisterFormFooter/index.tsx","components/AuthingGuard/Forms/EmailRegisterForm/index.tsx","components/AuthingGuard/Forms/PhoneRegisterForm/index.tsx","components/AuthingGuard/Forms/PasswordLoginForm/index.tsx","components/AuthingGuard/IconFont/index.tsx","components/AuthingGuard/api/appConfig.ts","components/AuthingGuard/Forms/SocialAndIdpLogin/index.tsx","components/AuthingGuard/Forms/PhoneCodeLoginForm/index.tsx","components/AuthingGuard/Forms/SmsMfaVerifyForm/CheckPhoneForm.tsx","components/AuthingGuard/Forms/SmsMfaVerifyForm/VerifyCodeForm.tsx","components/AuthingGuard/Forms/SmsMfaVerifyForm/index.tsx","components/AuthingGuard/Forms/EmailMfaVerifyForm/CheckEmailForm.tsx","components/AuthingGuard/Forms/EmailMfaVerifyForm/VerifyCodeForm.tsx","components/AuthingGuard/Forms/EmailMfaVerifyForm/index.tsx","components/AuthingGuard/MfaLayout/index.tsx","common/AuthingTabs/index.tsx","components/AuthingGuard/LoginLayout/index.tsx","components/AuthingGuard/RegisterLayout/index.tsx","components/AuthingGuard/ResetPwdLayout/index.tsx","components/AuthingGuard/api/userPoolConfig.ts","components/AuthingGuard/Forms/UploadImage/index.tsx","components/AuthingGuard/Forms/CompleteUserInfoForm/index.tsx","components/AuthingGuard/CompleteUserInfoLayout/index.tsx","common/AuthingDropdown/index.tsx","components/AuthingGuard/AppMFALayout/index.tsx","components/AuthingGuard/ToggleLang/index.tsx","components/AuthingGuard/GuardLayout/index.tsx","components/AuthingGuard/api/sso.ts","components/AuthingGuard/index.tsx","components/index.ts","components/AuthingGuard/types/GuardState.ts","components/AuthingGuard/types/Locales.ts","components/AuthingGuard/constants.ts","components/AuthingGuard/locales/index.ts","components/AuthingGuard/IconFont/iconfont.js","reportWebVitals.ts","index.tsx","components/AuthingGuard/types/index.ts","components/AuthingGuard/types/GuardConfig.ts"],"names":["authClient","initAuthClient","config","realHost","appHost","appDomain","host","parsedUrl","URL","defaultGuardConfig","protocol","port","encryptFunction","text","publicKey","encrypt","JSEncrypt","setPublicKey","Promise","resolve","AuthenticationClient","getAuthClient","Error","handlers","state","payloads","key","value","reducer","type","handler","ctx","React","createContext","undefined","ctxConst","useContext","createBaseContext","Context","useBaseContext","useGuardContext","GuardContext","children","useReducer","dispatch","getValue","setValue","Provider","requestClient","a","fetch","res","json","get","path","query","init","baseUrl","qs","stringify","addQueryPrefix","headers","i18n","language","post","data","method","body","JSON","setBaseUrl","base","replace","popupCenter","url","w","h","dualScreenLeft","window","screenLeft","screenX","dualScreenTop","screenTop","screenY","width","innerWidth","document","documentElement","clientWidth","screen","height","innerHeight","clientHeight","systemZoom","availWidth","left","top","newWindow","open","focus","VALIDATE_PATTERN","email","phone","ip","validate","val","test","getRequiredRules","msg","required","message","getDeviceName","userAgent","navigator","platform","os","indexOf","insertStyles","styles","styleElt","styleSheet","createStyleSheet","head","getElementsByTagName","createElement","appendChild","styleSheets","length","innerHTML","cssText","i","selector","insertRule","rule","addRule","getClassnames","classnames","filter","Boolean","join","isObject","item","Array","isArray","deepMerge","target","sources","source","shift","Object","assign","Steps","getUserRegisterParams","parse","location","search","ignoreQueryPrefix","keys","map","GuardHeader","props","logo","title","className","src","size","ScreenSize","LoginFormFooter","loading","needRestPwd","needRegister","t","useTranslation","htmlType","block","loginBtn","normal","disableResetPwd","onClick","GuardScenes","RestPassword","disableRegister","Register","ADLoginForm","forwardRef","ref","onSuccess","onValidateFail","onFail","useState","setLoading","useForm","rawForm","onFinish","values","identity","trim","password","loginByAd","user","errorData","useImperativeHandle","form","onSubmitCapture","onFinishFailed","errorInfo","Item","name","rules","autoComplete","placeholder","prefix","UserOutlined","style","color","Password","visibilityToggle","LockOutlined","ResetPasswordStep1","guardEvents","phoneOrEmail","sendEmail","EmailScene","ResetPassword","onPwdEmailSend","success","ResetPwdMethods","Email","onPwdEmailSendError","Phone","validateTrigger","validator","reject","SendCodeBtn","beforeSend","btnRef","countDown","setCountDown","timerRef","useRef","useEffect","clearInterval","current","enabled","useMemo","send","setInterval","prev","useSentCounter","disabled","e","time","SendPhoneCode","onSend","onError","error","sendSmsCode","ResetPasswordStep2","onStep2Finish","code","resetPasswordByPhoneCode","initialValue","readOnly","concat","len","SafetyOutlined","suffix","onPwdPhoneSendError","onPwdPhoneSend","getFieldValue","ResetPasswordStep3","reseting","setReseting","sending","setSending","onSendResetMail","onStep3Finish","resetPasswordByEmailCode","marginBottom","padding","ghost","ResetPasswordStep4","Login","textAlign","fontSize","fontFamily","number","ResetPwdFormFooter","ResetPasswordForm","step","setStep","setPhone","setEmail","onStep1Finish","onStep2OrStep3Finish","onStep2OrStep3Fail","getForm","VerifyCodeInput","verifyCode","setVerifyCode","onEnter","inputRef","handleChange","index","num","parseInt","isNaN","String","codes","split","slice","fill","_","el","autoFocus","onKeyDown","evt","currentVal","keyCode","handleKeyDown","onChange","Math","floor","MFAVerifyForm","goReset","mfaToken","mfaData","MfaCode","setMFACode","mfa","verifyTotpMfa","totp","some","getCaptchaUrl","Date","LdapLoginForm","autoRegister","needCaptcha","setNeedCaptcha","verifyCodeUrl","setVerifyCodeUrl","captchaCode","loginByLdap","NEED_CAPTCHA","formItems","component","addonAfter","alt","cursor","hide","QrCodeLoginForm","client","LoginMethods","AppQr","qrcode","WxMinQr","wxqrcode","startScanning","autoExchangeUserInfo","qrCodeScanOptions","onStart","timer","id","MfaResetStep1","goVerify","verifyTotpRecoveryCode","recoveryCode","recoverCode","CopyAbleText","divRef","copied","setCopied","startTimer","useCallback","clearTimeout","setTimeout","CheckOutlined","data-tips","CopyOutlined","str","setAttribute","position","selected","getSelection","rangeCount","getRangeAt","select","execCommand","removeChild","removeAllRanges","addRange","console","warn","copyToClipboard","innerText","MfaResetStep2","valuePropName","r","v","MfaResetCodeForm","setUser","setRecoverCode","stepMap","1","2","RegisterFormFooter","registerBtn","EmailRegisterForm","validateFields","registerByEmail","browser","device","generateToken","params","pattern","PhoneRegisterForm","registerByPhoneCode","PasswordLoginForm","loginByPhonePassword","loginByEmail","loginByUsername","IconFont","xlinkHref","inRange","n","start","end","ApplicationMfaType","SCREEN_SIZE_RANG","Mobile","range","Desktop","Infinity","getScreenSize","viewportWidth","find","useScreenSize","screenSize","setScreenSize","onResize","fn","delay","immediate","context","this","args","arguments","apply","debounce","addEventListener","removeEventListener","SocialAndIdpLogin","userPoolId","appId","noForm","loginMethods","onMessage","errMsg","event","eventType","parsedMsg","authingCode","OTP_MFA_CODE","APP_MFA_CODE","includes","localStorage","setItem","token","idpButtons","enterpriseConnectionObjs","Protocol","OIDC","configItem","shortid","generate","client_id","clientId","redirect_uri","redirectUri","scope","scopes","response_type","responseType","nonce","authorizationEdpoint","identifier","icon","marginRight","referer","href","connection","providerIentifier","displayName","SAML","samlRequest","CAS","casConnectionLoginUrl","OAUTH","authUrl","AZURE_AD","authorizationUrl","socialLoginButtons","socialConnectionObjs","isWechatBrowser","provider","SocialConnectionProvider","WECHATMP","iconType","authorization_params","BAIDU","display","onLogin","social","authorize","idp","direction","socialLogin","flex","minHeight","PhoneCodeLoginForm","rulesMap","loginByPhoneCode","CheckPhoneForm","phoneOrEmailBindable","VerifyCodeForm","sendCodeRef","sent","setSent","verifyAppSmsMfa","sendVerifyCode","SmsMfaVerifyForm","userPhone","click","CheckEmailForm","verifyAppEmailMfa","MfaVerify","EmailMfaVerifyForm","userEmail","MfaLayout","Verify","formProps","onLoginError","formMap","Reset","AuthingTabs","tabs","showLen","activeKey","onTabClick","activeIndex","findIndex","showTabs","startIndex","max","hideTabs","showKeys","label","EllipsisOutlined","SHOW_SOCIAL_LOGIN_TAB","LDAP","PhoneCode","LoginLayout","activeTabs","AppMfaVerify","useFormActions","formRef","LOGIN_FORM_MAP","AD","LOGIN_METHODS_MAP","useNormalLoginTabs","RegisterLayout","registerMethods","extendsFields","CompleteUserInfo","onRegister","onRegisterError","REGISTER_FORM_MAP","RegisterMethods","REGISTER_METHODS_MAP","next","ResetPwdLayout","onPwdResetError","onPwdReset","OIDCConnectionMode","ApplicationMfaTypeLabel","SMS","EMAIL","UploadImage","uploading","setUploading","apiHost","uploadButton","PlusOutlined","marginTop","accept","listType","showUploadList","action","info","status","file","response","spinning","CompleteUserInfoForm","submitting","setSubmitting","definitions","setDefinitions","internalFields","userFields","entries","forEach","nameOrId","push","udfs","definition","def","updateProfile","authorization","onRegisterInfoCompleted","onRegisterInfoCompletedError","getCurrentUser","INPUT_MAP","image","formFields","inputType","layout","CompleteUserInfoLayout","guardTitle","AuthingDropdown","menus","visible","setVisible","onMouseEnter","onMouseLeave","DownOutlined","AppMfaLayout","setType","availableMfaType","applicationMfa","mfaPolicy","sort","b","ToggleLang","overlay","changeLang","LANG_MAP","alignSelf","useGuardConfig","userConfig","appConfig","setAppConfig","errorMsg","setErrorMsg","errorDetail","setErrorDetail","checkConfig","fetchAppConfig","then","catch","finally","css","contentCss","guardConfig","socialConnections","socials","HIDE_SOCIALS","enterpriseConnections","identityProviders","loginTabs","list","defaultLoginMethod","default","registerTabs","defaultRegisterMethod","ssoPageComponentDisplay","autoRegisterThenLoginHintInfo","GuardLayout","guardScenes","localesConfig","isModal","mode","GuardMode","Modal","isControlled","localVisible","setLocalVisible","realVisible","toggleLocalVisible","useModal","onLoginTabChange","login","onRegisterTabChange","register","hidden","setHidden","closeHandler","onClose","onLoadError","onLoad","isSSO","credentials","sessionData","typedData","userInfo","escCloseable","layoutMap","zIndex","onTransitionEnd","clickCloseable","isShowChange","PREFIX_CLS","prefixCls","AuthingGuard","defaultScenes","lang","defaultLocalesConfig","initI18n","changeLanguage","setLang","requestFrom","jsencrypt","Normal","defaultLang","langChangeFN","use","LanguageDetector","initReactI18next","detection","order","resources","translation","enUsTrans","zhCnTrans","fallbackLng","debug","interpolation","escapeValue","c","l","o","getAttribute","__iconfont__svg__cssinject__","write","log","m","overflow","firstChild","parentNode","insertBefore","readyState","attachEvent","doScroll","onreadystatechange","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","App","SocialConnections","AppleWeb","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.6c028b56.chunk.js","sourcesContent":["import {\n AuthenticationClient,\n AuthenticationClientOptions,\n} from 'authing-js-sdk'\nimport JSEncrypt from 'jsencrypt'\nimport { defaultGuardConfig } from '../constants'\n\nlet authClient: AuthenticationClient | null = null\n\nexport interface AuthClientConfig extends AuthenticationClientOptions {\n /**\n * @deprecated 使用 appHost\n */\n appDomain?: string\n /**\n * @deprecated 无需传入\n */\n isSSO?: boolean\n /**\n * @deprecated 使用 appHost\n */\n host?: string\n}\n\nexport const initAuthClient = (config: AuthClientConfig) => {\n if (authClient) {\n return authClient\n }\n\n const { appHost, appDomain, host } = config\n\n /**\n * 兼容之前的参数\n */\n let realHost\n if (appHost) {\n realHost = appHost\n } else if (appDomain) {\n const parsedUrl = new URL(host || defaultGuardConfig.appHost!)\n realHost = `${parsedUrl.protocol}//${appDomain}${\n parsedUrl.port ? ':' + parsedUrl.port : ''\n }`\n } else if (host) {\n realHost = host\n } else {\n realHost = defaultGuardConfig.appHost\n }\n config.appHost = realHost!\n\n config.encryptFunction = (text, publicKey) => {\n const encrypt = new JSEncrypt() // 实例化加密对象\n encrypt.setPublicKey(publicKey) // 设置公钥\n return Promise.resolve(encrypt.encrypt(text)) // 加密明文\n }\n authClient = new AuthenticationClient(config)\n\n return authClient\n}\n\nexport const useAuthing = (config?: AuthClientConfig) => {\n return { authClient: getAuthClient(config) }\n}\n\nexport const getAuthClient = (config?: AuthClientConfig) => {\n if (!authClient && !config) {\n throw new Error(\n 'Please `initAuthClient` first or pass `AuthClientConfig` to useAuthing.'\n )\n }\n\n if (config) {\n initAuthClient(config)\n }\n\n return authClient\n}\n","import {\n GuardConfig,\n ActiveTabs,\n GuardScenes,\n UserConfig,\n GuardEventsHandler,\n LocalesConfig,\n} from '../../components/AuthingGuard/types'\nimport { AuthenticationClient } from 'authing-js-sdk'\nimport { IBaseAction } from '../base'\nimport { ApplicationMfaType } from '../../components/AuthingGuard/api/appConfig'\n\nexport type IState = {\n config: GuardConfig // 处理后的 Guard 配置\n userConfig: UserConfig // 用户传入的配置\n authClient: AuthenticationClient\n activeTabs: ActiveTabs // 登录、注册方式\n guardScenes: GuardScenes // 当前在哪个界面\n guardTitle: string\n // 需要 mfa 登录时后端返回的错误信息\n mfaData: {\n mfaToken: string\n phone?: string\n email?: string\n applicationMfa?: {\n status: 0 | 1\n mfaPolicy: ApplicationMfaType\n sort: number\n }[]\n }\n userPoolId: string\n appId: string\n guardEvents: GuardEventsHandler\n localesConfig: LocalesConfig\n}\n\nconst handlers: any = {\n // eslint-disable-next-line\n ['SET_VALUE']: (state: IState, payloads: any) => {\n return {\n ...state,\n [payloads.key]: payloads.value,\n }\n },\n}\n\nexport const reducer = (state: IState, { type, ...payloads }: IBaseAction) => {\n const handler = handlers[type]\n if (handler) {\n return handler(state, payloads)\n }\n return state\n}\n","import React from 'react'\n\n// create context with no upfront defaultValue\n// without having to do undefined check all the time\nexport function createBaseContext<C>() {\n const ctx = React.createContext<C | undefined>(undefined)\n function useBaseContext() {\n const ctxConst = React.useContext(ctx)\n if (!ctxConst)\n throw new Error('useBaseContext must be inside a Provider with a value')\n return ctxConst\n }\n // make TypeScript infer a tuple, not an array of union types\n return [ctx, useBaseContext] as const\n}\n\nexport interface IBaseAction<ActionType = string> {\n type: ActionType & string\n payload?: any\n [key: string]: string\n}\n\nexport interface IBaseContext<S> {\n state: S\n [k: string]: any\n}\n\nexport type BaseContextComponent<Props> = React.PropsWithChildren<Props>\n","import React, { useReducer } from 'react'\nimport { createBaseContext, IBaseContext, BaseContextComponent } from '../base'\nimport { reducer, IState } from './reducer'\n\n// 页面上下文,除了状态外还有公开的方法\nexport interface IGuardContext extends IBaseContext<IState> {\n dispatch: Function\n getValue: (key: keyof IState) => any\n setValue: (key: keyof IState, value: any) => void\n}\n\n// 实例化上下文,这里避免了为空检查\nconst [Context, useBaseContext] = createBaseContext<IGuardContext>()\n\nexport function useGuardContext(): IGuardContext {\n const guardContext = useBaseContext()\n // TODO: custom some\n return guardContext\n}\n\nexport function GuardContext({\n children = null,\n value,\n}: BaseContextComponent<Record<string, any>>) {\n const [state, dispatch] = useReducer(reducer, value)\n const getValue = (key: keyof IState) => state[key]\n const setValue = (key: keyof IState, value: any) => {\n dispatch({ type: 'SET_VALUE', key, value })\n }\n\n let ctx: IGuardContext = {\n state,\n dispatch,\n getValue,\n setValue,\n }\n\n return <Context.Provider value={ctx}>{children}</Context.Provider>\n}\n","import qs from 'qs'\nimport { i18n } from '../locales'\n\nexport const requestClient = async (...rest: Parameters<typeof fetch>) => {\n const res = await fetch(...rest)\n return res.json()\n}\n\nexport interface AuthingResponse<T = any> {\n code: number\n message?: string\n data?: T\n}\n\nrequestClient.get = async <T>(\n path: string,\n query: Record<string, any> = {},\n init?: RequestInit\n): Promise<AuthingResponse<T>> => {\n const res = await fetch(\n `${requestClient.baseUrl}${path}${qs.stringify(query, {\n addQueryPrefix: true,\n })}`,\n {\n ...init,\n headers: {\n ...init?.headers,\n 'x-authing-lang': i18n.language,\n },\n }\n )\n\n return res.json()\n}\n\nrequestClient.post = async <T>(\n path: string,\n data: any,\n config?: {\n headers: any\n }\n): Promise<AuthingResponse<T>> => {\n const res = await fetch(`${requestClient.baseUrl}${path}`, {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n ...config?.headers,\n 'Content-Type': 'application/json',\n 'x-authing-lang': i18n.language,\n },\n })\n return res.json()\n}\n\nrequestClient.baseUrl = ''\nrequestClient.setBaseUrl = (base: string) => {\n requestClient.baseUrl = base.replace(/\\/$/, '')\n}\n","/**\n * 在屏幕中心弹出新窗口加载 url\n * @param url\n * @param param1\n */\nexport const popupCenter = (\n url: string,\n { w, h }: { w: number; h: number } = { w: 585, h: 649 }\n) => {\n // Fixes dual-screen position Most browsers Firefox\n const dualScreenLeft =\n window.screenLeft !== undefined ? window.screenLeft : window.screenX\n const dualScreenTop =\n window.screenTop !== undefined ? window.screenTop : window.screenY\n\n const width = window.innerWidth\n ? window.innerWidth\n : document.documentElement.clientWidth\n ? document.documentElement.clientWidth\n : window.screen.width\n const height = window.innerHeight\n ? window.innerHeight\n : document.documentElement.clientHeight\n ? document.documentElement.clientHeight\n : window.screen.height\n\n const systemZoom = width / window.screen.availWidth\n const left = (width - w) / 2 / systemZoom + dualScreenLeft\n const top = (height - h) / 2 / systemZoom + dualScreenTop\n const newWindow = window.open(\n url,\n '_blank',\n `\n toolbar=no,\n menubar=no,\n scrollbars=no,\n resizable=no,\n location=no,\n status=no\n width=${w / systemZoom}, \n height=${h / systemZoom}, \n top=${top}, \n left=${left}\n `\n )\n\n newWindow?.focus()\n}\n","import { useEffect } from 'react'\nimport { Rule } from 'antd/lib/form'\nimport { useGuardContext } from '../context/global/context'\nimport qs from 'qs'\n\nexport * from './popupCenter'\nexport * from './clipboard'\n\nexport const VALIDATE_PATTERN = {\n // https://emailregex.com/\n // eslint-disable-next-line no-control-regex\n email: /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])/,\n // 以下的来自 authing-user-portal 项目\n phone: /^1[3-9]\\d{9}$/,\n ip: /^((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}$/,\n host: /^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.?$/,\n} as const\n\nexport const validate = (type: keyof typeof VALIDATE_PATTERN, val: string) => {\n return VALIDATE_PATTERN[type].test(val)\n}\n\nexport const getRequiredRules = (msg: string): Rule[] => {\n return [\n {\n required: true,\n message: msg,\n },\n ]\n}\n\nexport function getDeviceName() {\n const userAgent = window.navigator.userAgent\n const platform = window.navigator.platform\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K']\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE']\n const iosPlatforms = ['iPhone', 'iPad', 'iPod']\n\n let os = null\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS'\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS'\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows'\n } else if (/Android/.test(userAgent)) {\n os = 'Android'\n } else if (!os && /Linux/.test(platform)) {\n os = 'Linux'\n }\n\n return os\n}\n\n/**\n * 传对象 {'background-color': 'red'}\n * 传字符串 \"CSS 样式\"\n */\nexport const insertStyles = (styles: string | any) => {\n let styleElt, styleSheet\n if ((document as any).createStyleSheet) {\n // IE\n styleSheet = (document as any).createStyleSheet()\n } else {\n let head = document.getElementsByTagName('head')[0]\n styleElt = document.createElement('style')\n head.appendChild(styleElt)\n styleSheet = document.styleSheets[document.styleSheets.length - 1]\n }\n if (typeof styles === 'string') {\n if (styleElt) styleElt.innerHTML = styles\n else styleSheet.cssText = styles // IE\n } else {\n let i = 0\n for (let selector in styles) {\n if (styleSheet.insertRule) {\n let rule = selector + ' {' + styles[selector] + '}'\n styleSheet.insertRule(rule, i++)\n } else {\n styleSheet.addRule(selector, styles[selector], i++)\n }\n }\n }\n}\n\nexport const useTitle = (title: string, prefix?: string) => {\n const {\n state: { config },\n } = useGuardContext()\n\n useEffect(() => {\n document.title = `${prefix ?? `${config.title} `} ${title}`\n }, [config.title, prefix, title])\n}\n\nexport const getClassnames = (classnames: (string | boolean | undefined)[]) => {\n return classnames.filter(Boolean).join(' ')\n}\n\n/**\n * https://www.itranslater.com/qa/details/2115518846294557696\n * Simple object check.\n * @param item\n * @returns {boolean}\n */\nexport function isObject(item: any) {\n return item && typeof item === 'object' && !Array.isArray(item)\n}\n\n/**\n * https://www.itranslater.com/qa/details/2115518846294557696\n * Deep merge two objects.\n * @param target\n * @param ...sources\n */\nexport function deepMerge<T extends any = any>(\n target: T,\n ...sources: any[]\n): T {\n if (!sources.length) return target\n const source = sources.shift()\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n // @ts-ignore\n if (!target[key]) {\n Object.assign(target, { [key]: {} })\n }\n // @ts-ignore\n deepMerge(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n\n return deepMerge(target, ...sources)\n}\n\nexport const getUserRegisterParams = () => {\n const query = qs.parse(window.location.search, {\n ignoreQueryPrefix: true,\n })\n return Object.keys(query).map((key) => ({\n key,\n value: query[key],\n }))\n}\n\nexport const isWechatBrowser = () =>\n /MicroMessenger/i.test(navigator?.userAgent)\n","export enum Steps {\n Verify,\n Reset,\n}\n","import React, { FC } from 'react'\nimport { Avatar } from 'antd'\n\nimport { useGuardContext } from '../../../context/global/context'\n\nimport './style.less'\n\nexport interface HeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const GuardHeader: FC<HeaderProps> = (props) => {\n const {\n state: {\n config: { logo, title },\n },\n } = useGuardContext()\n\n return (\n <div className=\"authing-guard-header\">\n {Boolean(logo) && (\n <Avatar className=\"authing-guard-logo\" src={logo} size={50}></Avatar>\n )}\n <div className=\"authing-guard-title\">{title}</div>\n </div>\n )\n}\n","import { useState, useEffect } from 'react'\n// import { inRange, debounce } from 'lodash'\n\nfunction debounce(fn: Function, delay: number, immediate = true) {\n let timer: any\n\n return function (this: any) {\n let context = this\n let args = arguments\n timer && clearTimeout(timer)\n\n if (immediate && !timer) {\n fn.apply(context, args)\n }\n\n timer = setTimeout(function () {\n fn.apply(context, args)\n }, delay)\n }\n}\n\nfunction inRange(n: number, start: number, end?: number): boolean {\n if (end || end === 0) {\n return n >= start && n <= end\n }\n return n >= start\n}\n\nexport enum ScreenSize {\n Mobile = 'mobile',\n Desktop = 'desktop',\n}\nexport const SCREEN_SIZE_RANG: {\n size: ScreenSize\n range: [number, number]\n}[] = [\n {\n size: ScreenSize.Mobile,\n range: [0, 719],\n },\n {\n size: ScreenSize.Desktop,\n range: [720, Infinity],\n },\n]\n\nexport const getScreenSize = () => {\n const viewportWidth = document.body.clientWidth\n return (\n SCREEN_SIZE_RANG.find((item) => inRange(viewportWidth, ...item.range))\n ?.size ?? ScreenSize.Desktop\n )\n}\n\nexport const useScreenSize = () => {\n const [screenSize, setScreenSize] = useState(getScreenSize)\n\n useEffect(() => {\n const onResize = debounce(() => {\n setScreenSize(getScreenSize())\n }, 200)\n window.addEventListener('resize', onResize)\n\n return () => window.removeEventListener('resize', onResize)\n }, [])\n\n return [screenSize]\n}\n","import { Button, Divider } from 'antd'\nimport React, { FC } from 'react'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { GuardScenes } from '../../../../components/AuthingGuard/types'\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nexport interface LoginFormFooterProps {\n loading: boolean\n needRestPwd?: boolean\n needRegister?: boolean\n}\n\nexport const LoginFormFooter: FC<LoginFormFooterProps> = ({\n loading,\n needRestPwd = false,\n needRegister = false,\n}) => {\n const { t } = useTranslation()\n\n const {\n setValue,\n state: { config },\n } = useGuardContext()\n\n return (\n <>\n <Button\n htmlType=\"submit\"\n className=\"authing-guard-form-submit-btn\"\n size=\"large\"\n type=\"primary\"\n loading={loading}\n block\n >\n {loading\n ? t(\n `map.${config.text?.loginBtn?.loading}`,\n config.text?.loginBtn?.loading\n )\n : t(\n `map.${config.text?.loginBtn?.normal}`,\n config.text?.loginBtn?.normal\n )}\n </Button>\n\n <div className=\"authing-guard-form-actions\">\n {needRestPwd && !config.disableResetPwd && (\n <Button\n onClick={() => setValue('guardScenes', GuardScenes.RestPassword)}\n className=\"authing-guard-text-btn\"\n type=\"text\"\n >\n {t('common.hasForgotPwd')}\n </Button>\n )}\n {needRestPwd &&\n needRegister &&\n !config.disableResetPwd &&\n !config.disableRegister && <Divider type=\"vertical\" />}\n {needRegister && !config.disableRegister && (\n <div className=\"authing-guard-tip-btn-comb\">\n <span className=\"authing-guard-tip\">{t('common.noAccYet')}</span>\n <Button\n onClick={() => setValue('guardScenes', GuardScenes.Register)}\n className=\"authing-guard-text-btn\"\n type=\"text\"\n >\n {t('common.registerImmediate')}\n </Button>\n </div>\n )}\n </div>\n </>\n )\n}\n","import { Input, Form } from 'antd'\nimport { FormInstance } from 'antd/lib/form'\nimport { UserOutlined, LockOutlined } from '@ant-design/icons'\nimport React, { forwardRef, useImperativeHandle, useState } from 'react'\n\nimport { getRequiredRules } from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { ADLoginFormProps } from '../../../../components/AuthingGuard/types'\nimport { LoginFormFooter } from '../../../../components/AuthingGuard/Forms/LoginFormFooter'\nimport { useTranslation } from 'react-i18next'\n\nexport const ADLoginForm = forwardRef<FormInstance, ADLoginFormProps>(\n ({ onSuccess, onValidateFail, onFail }, ref) => {\n const { t } = useTranslation()\n const { state } = useGuardContext()\n const { authClient } = state\n\n const [loading, setLoading] = useState(false)\n\n const onFinishFailed = (errorInfo: any) => {\n setLoading(false)\n onValidateFail && onValidateFail(errorInfo)\n }\n\n const [rawForm] = Form.useForm()\n\n const onFinish = async (values: any) => {\n try {\n const identity = values.identity && values.identity.trim()\n const password = values.password && values.password.trim()\n const user = await authClient.loginByAd(identity, password)\n onSuccess && onSuccess(user)\n } catch (error) {\n if (typeof error.message === 'string') {\n // js sdk httpclient 的报错,这里只有一种情况就是用户开启了 mfa 的报错\n try {\n const errorData = JSON.parse(error.message)\n onFail && onFail(errorData)\n return\n } catch (_) {\n // do nothing\n }\n }\n onFail && onFail(error)\n } finally {\n setLoading(false)\n }\n }\n\n useImperativeHandle(ref, () => rawForm)\n\n return (\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinishFailed={onFinishFailed}\n onFinish={onFinish}\n >\n <Form.Item\n name=\"identity\"\n rules={getRequiredRules(t('login.inputAdUsername'))}\n >\n <Input\n autoComplete=\"email,username,tel\"\n size=\"large\"\n placeholder={t('login.inputAdUsername')}\n prefix={<UserOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <Form.Item\n name=\"password\"\n rules={getRequiredRules(t('login.inputAdPwd'))}\n >\n <Input.Password\n autoComplete=\"current-password\"\n size=\"large\"\n visibilityToggle={false}\n placeholder={t('login.inputAdPwd')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <LoginFormFooter loading={loading}></LoginFormFooter>\n </Form>\n )\n }\n)\n","import React, { FC, useState } from 'react'\nimport { Form, Input, Button, message } from 'antd'\n\nimport { validate } from '../../../../utils'\nimport {\n ResetPasswordStep1Props,\n ResetPwdMethods,\n} from '../../../../components/AuthingGuard/types'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { EmailScene } from 'authing-js-sdk'\nimport { useTranslation } from 'react-i18next'\n\nexport const ResetPasswordStep1: FC<ResetPasswordStep1Props> = ({\n onSuccess,\n}) => {\n const {\n state: { authClient, guardEvents },\n } = useGuardContext()\n const { t } = useTranslation()\n\n const [loading, setLoading] = useState(false)\n\n const onFinish = async (values: any) => {\n const value = values.phoneOrEmail\n\n if (validate('email', value)) {\n try {\n setLoading(true)\n await authClient.sendEmail(value, EmailScene.ResetPassword)\n\n guardEvents.onPwdEmailSend?.(authClient)\n message.success(t('login.emailSent'))\n onSuccess(ResetPwdMethods.Email, value)\n } catch (e) {\n guardEvents.onPwdEmailSendError?.(e, authClient)\n } finally {\n setLoading(false)\n }\n } else if (validate('phone', value)) {\n onSuccess(ResetPwdMethods.Phone, value)\n }\n }\n\n return (\n <Form\n onSubmitCapture={() => setLoading(true)}\n onFinishFailed={() => setLoading(false)}\n onFinish={onFinish}\n >\n <Form.Item\n name=\"phoneOrEmail\"\n validateTrigger=\"onBlur\"\n rules={[\n {\n validator: (rule, value) => {\n if (!value) {\n return Promise.reject(t('login.inputPhoneOrEmail'))\n }\n if (validate('email', value) || validate('phone', value)) {\n return Promise.resolve()\n } else {\n return Promise.reject(t('login.inputCorrectPhone'))\n }\n },\n },\n ]}\n >\n <Input\n size=\"large\"\n autoComplete=\"tel,email\"\n placeholder={t('login.inputPhoneOrEmail')}\n />\n </Form.Item>\n <Button\n className=\"authing-reset-pwd-btn\"\n block\n type=\"primary\"\n size=\"large\"\n htmlType=\"submit\"\n loading={loading}\n >\n {t('login.resetPwd')}\n </Button>\n </Form>\n )\n}\n","import React, { FC, useState, useRef, useEffect, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\n\nconst TIME = 60\nexport interface SendCodeProps {\n beforeSend: () => Promise<boolean>\n btnRef?: React.RefObject<HTMLButtonElement>\n}\n\nconst useSentCounter = () => {\n const [countDown, setCountDown] = useState(0)\n const timerRef = useRef<any>(0)\n\n useEffect(() => {\n return () => clearInterval(timerRef.current)\n }, [])\n\n useEffect(() => {\n if (countDown <= 0) {\n clearInterval(timerRef.current)\n }\n }, [countDown])\n\n const enabled = useMemo(() => countDown <= 0, [countDown])\n\n const send = () => {\n setCountDown(TIME)\n\n timerRef.current = setInterval(() => {\n setCountDown((prev) => {\n return prev - 1\n })\n }, 1000)\n }\n\n return {\n enabled,\n send,\n countDown,\n }\n}\n\nexport const SendCodeBtn: FC<SendCodeProps> = ({ beforeSend, btnRef }) => {\n const { enabled, send, countDown } = useSentCounter()\n const [loading, setLoading] = useState(false)\n const { t } = useTranslation()\n const disabled = useMemo(() => {\n return !enabled || loading\n }, [enabled, loading])\n\n const onClick = async (e: React.MouseEvent<HTMLButtonElement>) => {\n setLoading(true)\n if (disabled) {\n return\n }\n\n if (!(await beforeSend())) {\n setLoading(false)\n return\n }\n setLoading(false)\n send()\n }\n\n return (\n <button\n type=\"button\"\n className=\"authing-send-code-btn\"\n disabled={disabled}\n onClick={onClick}\n ref={btnRef}\n >\n {enabled\n ? t('common.sendVerifyCode')\n : t('common.retryAfterTime', {\n time: countDown,\n })}\n </button>\n )\n}\n","import { message } from 'antd'\nimport React, { FC } from 'react'\nimport { CommonMessage } from 'authing-js-sdk'\n\nimport { SendCodeBtn } from './SendCodeBtn'\nimport { validate } from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nexport interface SendPhoneCodeProps {\n phone: string\n onSend?: () => void\n onError?: (error: CommonMessage) => void\n}\n\nexport const SendPhoneCode: FC<SendPhoneCodeProps> = ({\n phone,\n onSend,\n onError,\n}) => {\n const { t } = useTranslation()\n const {\n state: { authClient },\n } = useGuardContext()\n\n return (\n <SendCodeBtn\n beforeSend={async () => {\n if (!phone) {\n message.error(t('login.inputPhone'))\n return false\n }\n if (!validate('phone', phone)) {\n message.error(t('common.phoneFormateError'))\n return false\n }\n try {\n await authClient.sendSmsCode(phone)\n onSend?.()\n return true\n } catch (error) {\n onError?.(error)\n return false\n }\n }}\n />\n )\n}\n","import React, { FC, useState } from 'react'\nimport { Form, Input, Button } from 'antd'\nimport { SafetyOutlined, LockOutlined, UserOutlined } from '@ant-design/icons'\n\nimport { getRequiredRules } from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { ResetPasswordStep2Props } from '../../../../components/AuthingGuard/types'\nimport { SendPhoneCode } from '../../../../components/AuthingGuard/Forms/SendPhoneCode'\nimport { useTranslation } from 'react-i18next'\n\nexport const ResetPasswordStep2: FC<ResetPasswordStep2Props> = ({\n phone,\n onSuccess,\n onFail,\n}) => {\n const [rawForm] = Form.useForm()\n const { t } = useTranslation()\n\n const [loading, setLoading] = useState(false)\n\n const {\n state: { authClient, guardEvents },\n } = useGuardContext()\n\n const onStep2Finish = async (values: any) => {\n const code = values.code\n const password = values.password\n\n try {\n await authClient.resetPasswordByPhoneCode(phone, code, password)\n onSuccess()\n } catch (e) {\n onFail?.(e)\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <Form\n form={rawForm}\n onFinishFailed={() => setLoading(false)}\n onSubmitCapture={() => setLoading(true)}\n onFinish={onStep2Finish}\n >\n <Form.Item\n name=\"phone\"\n initialValue={phone}\n rules={getRequiredRules(t('common.phoneNotNull'))}\n >\n <Input\n autoComplete=\"tel\"\n name=\"phone\"\n readOnly\n size=\"large\"\n placeholder={t('login.inputPhone')}\n prefix={<UserOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <Form.Item\n name=\"code\"\n rules={getRequiredRules(t('common.inputVerifyCode')).concat({\n len: 4,\n message: t('common.inputFourVerifyCode', {\n length: 4,\n }),\n })}\n >\n <Input\n name=\"code\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: 4,\n })}\n prefix={<SafetyOutlined style={{ color: '#ddd' }} />}\n suffix={\n <SendPhoneCode\n onError={(error) =>\n guardEvents.onPwdPhoneSendError?.(error, authClient)\n }\n onSend={() => guardEvents.onPwdPhoneSend?.(authClient)}\n phone={phone}\n />\n }\n />\n </Form.Item>\n <Form.Item\n name=\"password\"\n rules={getRequiredRules(t('common.passwordNotNull'))}\n >\n <Input.Password\n name=\"password\"\n size=\"large\"\n placeholder={t('user.newPwd')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <Form.Item\n name=\"repeat-password\"\n rules={getRequiredRules(t('common.repeatPassword')).concat({\n validator: async (rule, value) => {\n if (rawForm.getFieldValue('password') !== value) {\n throw new Error(t('login.twoPwdNeedSame'))\n }\n },\n })}\n >\n <Input.Password\n name=\"repeat-password\"\n size=\"large\"\n placeholder={t('login.inputPwdAgain')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <Button\n className=\"authing-reset-pwd-btn\"\n block\n loading={loading}\n type=\"primary\"\n size=\"large\"\n htmlType=\"submit\"\n >\n {t('login.resetPwd')}\n </Button>\n </Form>\n )\n}\n","import React, { FC, useState } from 'react'\nimport { Form, Button, Input, message } from 'antd'\nimport { SafetyOutlined, LockOutlined } from '@ant-design/icons'\nimport { EmailScene } from 'authing-js-sdk'\n\nimport { getRequiredRules } from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { ResetPasswordStep3Props } from '../../../../components/AuthingGuard/types'\nimport { useTranslation } from 'react-i18next'\n\nexport const ResetPasswordStep3: FC<ResetPasswordStep3Props> = ({\n email,\n onSuccess = () => {},\n onFail,\n}) => {\n const {\n state: { authClient, guardEvents },\n } = useGuardContext()\n const [rawForm] = Form.useForm()\n const { t } = useTranslation()\n\n const [reseting, setReseting] = useState(false)\n const [sending, setSending] = useState(false)\n\n const onSendResetMail = async () => {\n setSending(true)\n try {\n await authClient.sendEmail(email, EmailScene.ResetPassword)\n message.success(t('login.emailSent'))\n guardEvents.onPwdEmailSend?.(authClient)\n } catch (e) {\n guardEvents.onPwdEmailSendError?.(e, authClient)\n } finally {\n setSending(false)\n }\n }\n\n const onStep3Finish = async (values: any) => {\n const code = values.code\n const password = values.password\n try {\n await authClient.resetPasswordByEmailCode(email, code, password)\n onSuccess()\n } catch (error) {\n onFail?.(error)\n } finally {\n setReseting(false)\n }\n }\n\n return (\n <>\n <p\n style={{\n marginBottom: 24,\n padding: '0 12px',\n }}\n >\n {t('login.resetEmailSent', {\n email: email,\n })}\n </p>\n\n <Form\n form={rawForm}\n onFinishFailed={() => setReseting(false)}\n onSubmitCapture={() => setReseting(true)}\n onFinish={onStep3Finish}\n >\n <Form.Item\n name=\"code\"\n rules={getRequiredRules(t('common.repeatPassword')).concat({\n len: 4,\n message: t('common.inputFourVerifyCode', {\n length: 4,\n }),\n })}\n >\n <Input\n name=\"code\"\n size=\"large\"\n placeholder={t('login.fourVerifyCode', {\n length: 4,\n })}\n prefix={<SafetyOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <Form.Item\n name=\"password\"\n rules={getRequiredRules(t('common.passwordNotNull'))}\n >\n <Input.Password\n name=\"password\"\n size=\"large\"\n placeholder={t('user.newPwd')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <Form.Item\n name=\"repeat-password\"\n rules={getRequiredRules(t('common.repeatPassword')).concat({\n validator: async (rule, value) => {\n if (rawForm.getFieldValue('password') !== value) {\n throw new Error(t('login.twoPwdNeedSame'))\n }\n },\n })}\n >\n <Input.Password\n name=\"repeat-password\"\n size=\"large\"\n placeholder={t('login.inputPwdAgain')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <Form.Item>\n <Button\n className=\"authing-reset-pwd-btn\"\n block\n loading={reseting}\n type=\"primary\"\n size=\"large\"\n htmlType=\"submit\"\n >\n {t('login.resetPwd')}\n </Button>\n </Form.Item>\n <Button\n block\n type=\"primary\"\n ghost\n loading={sending}\n size=\"large\"\n onClick={onSendResetMail}\n >\n {t('login.resetPwdEmail')}\n </Button>\n </Form>\n </>\n )\n}\n","import { useGuardContext } from '../../../../context/global/context'\nimport React, { FC, useEffect, useRef, useState } from 'react'\n\nimport { GuardScenes } from '../../../../components/AuthingGuard/types'\nimport { useTranslation } from 'react-i18next'\n\nconst TIME = 3\nexport const ResetPasswordStep4: FC = () => {\n const [countDown, setCountDown] = useState(TIME)\n const timerRef = useRef<any>(0)\n const { t } = useTranslation()\n const { setValue } = useGuardContext()\n\n useEffect(() => {\n timerRef.current = setInterval(() => {\n setCountDown((prev) => {\n return prev - 1\n })\n }, 1000)\n\n return () => clearInterval(timerRef.current)\n }, [])\n\n useEffect(() => {\n if (countDown <= 0) {\n clearInterval(timerRef.current)\n\n setValue('guardScenes', GuardScenes.Login)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [countDown])\n\n return (\n <div style={{ textAlign: 'center' }}>\n <h3\n style={{\n fontSize: 20,\n fontFamily: 'PingFangSC-Medium',\n marginBottom: 0,\n }}\n >\n {t('common.pwdModifySuccess')}\n </h3>\n <p style={{ fontSize: 12 }}>\n {t('common.jumpAfterCount', {\n number: countDown,\n })}\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { Button } from 'antd'\n\nimport { useGuardContext } from '../../../../context/global/context'\nimport { GuardScenes } from '../../../../components/AuthingGuard/types'\nimport { useTranslation } from 'react-i18next'\n\nexport const ResetPwdFormFooter = () => {\n const { setValue } = useGuardContext()\n const { t } = useTranslation()\n return (\n <Button\n onClick={() => setValue('guardScenes', GuardScenes.Login)}\n className=\"authing-guard-text-btn authing-guard-form-actions\"\n type=\"text\"\n htmlType=\"button\"\n >\n {t('login.otherAccLogin')}\n </Button>\n )\n}\n","import React, { FC, useEffect, useState } from 'react'\n\nimport { ResetPasswordStep1 } from './Step1'\nimport { ResetPasswordStep2 } from './Step2'\nimport { ResetPasswordStep3 } from './Step3'\nimport { ResetPasswordStep4 } from './Step4'\nimport { ResetPwdFormFooter } from './Footer'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { ResetPasswordFormProps } from '../../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nexport const ResetPasswordForm: FC<ResetPasswordFormProps> = ({\n onSuccess,\n onFail,\n}) => {\n const { setValue } = useGuardContext()\n const { t } = useTranslation()\n\n const [step, setStep] = useState(1)\n const [phone, setPhone] = useState('')\n const [email, setEmail] = useState('')\n\n useEffect(() => {\n switch (step) {\n case 1:\n setValue('guardTitle', t('common.retrievePassword'))\n break\n case 2:\n case 3:\n case 4:\n setValue('guardTitle', t('login.resetPwd'))\n break\n default:\n setValue('guardTitle', t('common.retrievePassword'))\n break\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [step])\n\n const onStep1Finish = async (type: string, value: string) => {\n if (type === 'phone') {\n setPhone(value)\n setStep(2)\n } else if (type === 'email') {\n setEmail(value)\n setStep(3)\n }\n }\n\n const onStep2OrStep3Finish = () => {\n setStep(4)\n onSuccess?.()\n }\n\n const onStep2OrStep3Fail = (error: any) => {\n onFail?.(error)\n }\n\n const getForm = () => {\n switch (step) {\n case 1:\n return (\n <ResetPasswordStep1 onSuccess={onStep1Finish}></ResetPasswordStep1>\n )\n case 2:\n return (\n <ResetPasswordStep2\n phone={phone}\n onFail={onStep2OrStep3Fail}\n onSuccess={onStep2OrStep3Finish}\n ></ResetPasswordStep2>\n )\n case 3:\n return (\n <ResetPasswordStep3\n email={email}\n onFail={onStep2OrStep3Fail}\n onSuccess={onStep2OrStep3Finish}\n ></ResetPasswordStep3>\n )\n case 4:\n return <ResetPasswordStep4></ResetPasswordStep4>\n default:\n return null\n }\n }\n\n return (\n <div>\n {getForm()}\n {step !== 4 && <ResetPwdFormFooter />}\n </div>\n )\n}\n","import { Divider, Input } from 'antd'\nimport React, { FC, Fragment, useRef } from 'react'\n\nimport './style.less'\n\ninterface VerifyCodeInputProps extends React.HTMLAttributes<HTMLDivElement> {\n verifyCode: string[]\n setVerifyCode: (code: string[]) => void\n length?: number\n onEnter?: Function\n}\n\nexport const VerifyCodeInput: FC<VerifyCodeInputProps> = ({\n verifyCode,\n setVerifyCode,\n length = 6,\n onEnter,\n}) => {\n const inputRef = useRef<any[]>([])\n\n const handleChange = (val: string | undefined = '', index: number) => {\n const num = parseInt(val)\n if (isNaN(num)) {\n val = ''\n } else {\n val = String(num)\n }\n const codes = [...verifyCode]\n codes[index] = val.split('').slice(-1)[0] || ''\n setVerifyCode(codes)\n\n if (val && inputRef.current[index + 1]) {\n inputRef.current[index + 1].focus()\n }\n }\n\n const handleKeyDown = (evt: any, index: number) => {\n const currentVal = verifyCode[index]\n\n switch (evt.keyCode) {\n case 8:\n if (!currentVal && inputRef.current[index - 1]) {\n handleChange('', index - 1)\n inputRef.current[index - 1].focus()\n }\n break\n\n case 13:\n onEnter?.()\n break\n default:\n break\n }\n }\n\n return (\n <div className=\"authing-code-input\">\n {new Array(length).fill(0).map((_, index) => (\n <Fragment key={index}>\n <Input\n ref={(el) => (inputRef.current[index] = el)}\n className=\"authing-code-input-item\"\n size=\"large\"\n autoFocus={index === 0}\n onKeyDown={(evt) => handleKeyDown(evt, index)}\n value={verifyCode[index]}\n onChange={(evt) => handleChange(evt.target.value, index)}\n />\n {index === Math.floor(length / 2 - 1) && (\n <Divider className=\"authing-code-input-divider\" />\n )}\n </Fragment>\n ))}\n </div>\n )\n}\n","import { User } from 'authing-js-sdk'\nimport React, { FC, useState } from 'react'\nimport { Button, Form } from 'antd'\n\nimport { VerifyCodeInput } from '../../../../common/VerifyCodeInput'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { MfaVerifyForm } from '../../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nconst CODE_LEN = 6\n\nexport const MFAVerifyForm: FC<MfaVerifyForm> = ({\n onSuccess,\n onFail,\n goReset,\n}) => {\n const {\n state: {\n authClient,\n mfaData: { mfaToken },\n },\n } = useGuardContext()\n\n const { t } = useTranslation()\n\n const [rawForm] = Form.useForm()\n\n const [MfaCode, setMFACode] = useState(new Array(CODE_LEN).fill(''))\n const [loading, setLoading] = useState(false)\n\n const onFinish = async (values: any) => {\n try {\n const user: User = await authClient.mfa.verifyTotpMfa({\n mfaToken,\n totp: MfaCode.join(''),\n })\n onSuccess && onSuccess(user)\n } catch (e) {\n onFail?.(e)\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <>\n <h3 className=\"authing-guard-mfa-title\">\n {t('login.accPwdLoginVerify')}\n </h3>\n <p className=\"authing-guard-mfa-tips\">{t('login.inputSixCode')}</p>\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinish={onFinish}\n onFinishFailed={() => setLoading(false)}\n >\n <Form.Item\n name=\"mfaCode\"\n rules={[\n {\n validateTrigger: [],\n validator() {\n if (MfaCode.some((item) => !item)) {\n return Promise.reject(t('login.inputFullMfaCode'))\n }\n return Promise.resolve()\n },\n },\n ]}\n >\n <VerifyCodeInput verifyCode={MfaCode} setVerifyCode={setMFACode} />\n </Form.Item>\n\n <Button\n className=\"authing-guard-mfa-confirm-btn\"\n loading={loading}\n block\n htmlType=\"submit\"\n type=\"primary\"\n size=\"large\"\n >\n {t('common.sure')}\n </Button>\n\n <div className=\"authing-guard-form-actions\">\n <div className=\"authing-guard-tip-btn-comb\">\n <span className=\"authing-guard-tip\">\n {t('common.hasLooseSaftyCode')}\n </span>\n <Button\n htmlType=\"button\"\n onClick={goReset}\n className=\"authing-guard-text-btn\"\n type=\"text\"\n >\n {t('common.useRecoverCode')}\n </Button>\n </div>\n </div>\n </Form>\n </>\n )\n}\n","import { Input, Form } from 'antd'\nimport { FormInstance } from 'antd/lib/form'\nimport { UserOutlined, LockOutlined } from '@ant-design/icons'\nimport React, { forwardRef, useImperativeHandle, useState } from 'react'\n\nimport { getRequiredRules } from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { NEED_CAPTCHA } from '../../../../components/AuthingGuard/constants'\nimport { PasswordLoginFormProps } from '../../../../components/AuthingGuard/types'\nimport { LoginFormFooter } from '../../../../components/AuthingGuard/Forms/LoginFormFooter'\nimport { useTranslation } from 'react-i18next'\n\nconst captchaUrl = '/api/v2/security/captcha'\nconst getCaptchaUrl = () => `${captchaUrl}?r=${+new Date()}`\n\nexport const LdapLoginForm = forwardRef<FormInstance, PasswordLoginFormProps>(\n ({ onSuccess, onValidateFail, onFail }, ref) => {\n const { t } = useTranslation()\n\n const { state } = useGuardContext()\n const { config, authClient } = state\n const autoRegister = config.autoRegister\n\n const [rawForm] = Form.useForm()\n\n const [needCaptcha, setNeedCaptcha] = useState(false)\n const [verifyCodeUrl, setVerifyCodeUrl] = useState<string | null>(null)\n const [loading, setLoading] = useState(false)\n\n const onFinishFailed = (errorInfo: any) => {\n setLoading(false)\n onValidateFail && onValidateFail(errorInfo)\n }\n\n const onFinish = async (values: any) => {\n try {\n const identity = values.identity && values.identity.trim()\n const password = values.password && values.password.trim()\n const captchaCode = values.captchaCode && values.captchaCode.trim()\n\n const user = await authClient.loginByLdap(identity, password, {\n autoRegister,\n captchaCode,\n })\n onSuccess && onSuccess(user)\n } catch (error) {\n if (typeof error.message === 'string') {\n // js sdk httpclient 的报错,这里只有一种情况就是用户开启了 mfa 的报错\n try {\n const errorData = JSON.parse(error.message)\n onFail && onFail(errorData)\n return\n } catch (_) {}\n }\n\n if (error.code === NEED_CAPTCHA && verifyCodeUrl === null) {\n setNeedCaptcha(true)\n setVerifyCodeUrl(getCaptchaUrl())\n }\n\n onFail && onFail(error)\n } finally {\n setLoading(false)\n }\n }\n\n useImperativeHandle(ref, () => rawForm)\n\n const formItems = [\n {\n component: (\n <Input\n autoComplete=\"ldap,username\"\n size=\"large\"\n placeholder={t('login.inputLdapUsername')}\n prefix={<UserOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'identity',\n rules: getRequiredRules(t('common.LDAPAccountNotNull')),\n },\n {\n component: (\n <Input.Password\n size=\"large\"\n placeholder={t('login.inputLdapPwd')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'password',\n rules: getRequiredRules(t('common.passwordNotNull')),\n },\n {\n component: (\n <Input\n size=\"large\"\n placeholder={t('login.inputCaptchaCode')}\n addonAfter={\n <img\n src={verifyCodeUrl ?? ''}\n alt={t('login.captchaCode')}\n style={{ height: '2em', cursor: 'pointer' }}\n onClick={() => setVerifyCodeUrl(getCaptchaUrl())}\n />\n }\n />\n ),\n name: 'captchaCode',\n rules: getRequiredRules(t('common.captchaCodeNotNull')),\n hide: !needCaptcha,\n },\n ]\n\n return (\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinishFailed={onFinishFailed}\n onFinish={onFinish}\n >\n {formItems.map(\n (item) =>\n !item.hide && (\n <Form.Item key={item.name} name={item.name} rules={item.rules}>\n {item.component}\n </Form.Item>\n )\n )}\n\n <LoginFormFooter loading={loading}></LoginFormFooter>\n </Form>\n )\n }\n)\n","import { Spin } from 'antd'\nimport React, { FC, useEffect, useMemo, useRef } from 'react'\n\nimport { useGuardContext } from '../../../../context/global/context'\nimport {\n LoginMethods,\n QrLoginFormProps,\n} from '../../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { User } from 'authing-js-sdk'\n\nexport const QrCodeLoginForm: FC<QrLoginFormProps> = ({\n onFail,\n onSuccess,\n type,\n}) => {\n const {\n state: { authClient, config },\n } = useGuardContext()\n\n const timerRef = useRef<any>()\n\n const client = useMemo(() => {\n return {\n [LoginMethods.AppQr]: authClient.qrcode,\n [LoginMethods.WxMinQr]: authClient.wxqrcode,\n }[type]\n }, [type, authClient])\n\n useEffect(() => {\n client.startScanning('authingGuardQrcode', {\n autoExchangeUserInfo: true,\n ...config.qrCodeScanOptions,\n onStart(timer) {\n timerRef.current = timer\n },\n onSuccess(user) {\n onSuccess && onSuccess(user as User)\n },\n onError: (message) => {\n config.qrCodeScanOptions?.onError?.(message)\n\n onFail && onFail(`${message}`)\n },\n })\n }, [client, config.qrCodeScanOptions, onFail, onSuccess])\n\n useEffect(() => {\n return () => clearInterval(timerRef.current)\n }, [])\n\n return (\n <div className=\"authing-guard-qr-form\">\n <div className=\"authing-guard-qr-loading\">\n <Spin size=\"large\" />\n </div>\n <div id=\"authingGuardQrcode\"></div>\n </div>\n )\n}\n","import { Input, Form, Button } from 'antd'\nimport React, { FC, useState } from 'react'\nimport { LockOutlined } from '@ant-design/icons'\nimport { getRequiredRules } from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { User } from 'authing-js-sdk'\nimport { useTranslation } from 'react-i18next'\n\nexport const MfaResetStep1: FC<{\n mfaToken: string\n onSuccess: (\n user: User & {\n recoveryCode: string\n }\n ) => void\n goVerify: () => void\n onFail?: (error: any) => void\n}> = ({ mfaToken, onSuccess, goVerify, onFail }) => {\n const [loading, setLoading] = useState(false)\n const { t } = useTranslation()\n\n const {\n state: { authClient },\n } = useGuardContext()\n\n const onFinish = async (values: any) => {\n try {\n const user = await authClient.mfa.verifyTotpRecoveryCode({\n recoveryCode: values.recoverCode,\n mfaToken,\n })\n onSuccess(\n user as User & {\n recoveryCode: string\n }\n )\n } catch (e) {\n onFail?.(e)\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <Form\n onSubmitCapture={() => setLoading(true)}\n onFinishFailed={() => setLoading(false)}\n onFinish={onFinish}\n >\n <Form.Item\n rules={getRequiredRules(t('common.recoverCodeNotNull'))}\n name=\"recoverCode\"\n >\n <Input\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n placeholder={t('login.inputRecoverCode')}\n size=\"large\"\n ></Input>\n </Form.Item>\n\n <Button\n className=\"authing-guard-mfa-confirm-btn\"\n loading={loading}\n htmlType=\"submit\"\n block\n type=\"primary\"\n size=\"large\"\n >\n {t('common.sure')}\n </Button>\n\n <div className=\"authing-guard-form-actions\">\n <div className=\"authing-guard-tip-btn-comb\">\n <Button\n htmlType=\"button\"\n onClick={goVerify}\n className=\"authing-guard-text-btn\"\n type=\"text\"\n >\n {t('login.findedSafetyCode')}\n </Button>\n </div>\n </div>\n </Form>\n )\n}\n","import React, { FC, useCallback, useEffect, useRef, useState } from 'react'\nimport { CopyOutlined, CheckOutlined } from '@ant-design/icons'\nimport { copyToClipboard, getClassnames } from '../../utils'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nexport interface CopyTextProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const CopyAbleText: FC<CopyTextProps> = ({ children, className }) => {\n const { t } = useTranslation()\n const divRef = useRef<HTMLDivElement>(null)\n const [copied, setCopied] = useState(false)\n const timer = useRef(-1)\n\n const startTimer = useCallback(() => {\n setCopied(true)\n clearTimeout(timer.current)\n timer.current = (setTimeout(\n () => setCopied(false),\n 3000\n ) as unknown) as number\n }, [timer])\n\n useEffect(() => {\n return () => clearTimeout(timer.current)\n }, [])\n\n const handleCopy = () => {\n copyToClipboard(divRef.current!.innerText)\n startTimer()\n }\n\n return (\n <div\n className={getClassnames(['authing-copy-text', className])}\n ref={divRef}\n >\n {children}\n {copied ? (\n <CheckOutlined\n className=\"authing-data-tips authing-data-tips__top authing-guard-pointer authing-copy-text-icon authing-copy-text-icon__success\"\n data-tips={t('common.copied')}\n />\n ) : (\n <CopyOutlined\n className=\"authing-data-tips authing-data-tips__top authing-guard-pointer authing-copy-text-icon\"\n data-tips={t('common.copy')}\n onClick={handleCopy}\n />\n )}\n </div>\n )\n}\n","// https://juejin.im/post/6844903857290477582\nexport const copyToClipboard = (str: string) => {\n const el = document.createElement('textarea') // 创建一个 <textarea> 元素\n el.value = str // 设置它的值为你想复制的字符串\n el.setAttribute('readonly', '') // 设置为只读以防止干扰\n el.style.position = 'absolute'\n el.style.left = '-9999px' // 移出屏幕外以使其不可见\n document.body.appendChild(el) // 插入 <textarea> 元素到 HTML 文档中\n try {\n const selected =\n document.getSelection()!.rangeCount > 0 // 检查是否之前曾选中过内容\n ? document.getSelection()!.getRangeAt(0) // 如果找到,则保存选中\n : false // 标记为 false 以表示不存在之前选中的内容\n el.select() // 选中 <textarea> 的内容\n document.execCommand('copy') // 复制 - 仅当作为用户操作的响应结果时才可以工作(比如,点击事件)\n document.body.removeChild(el) // 移除 <textarea> 元素\n if (selected) {\n // 如果在复制前已存在选中的内容\n document.getSelection()!.removeAllRanges() // 取消 HTML 文档中所有的选中部分\n document.getSelection()!.addRange(selected) // 恢复原来的选中\n }\n } catch (e) {\n console.warn('复制失败')\n }\n}\n","import React, { FC } from 'react'\n\nimport { Button, Checkbox, Form } from 'antd'\nimport { CopyAbleText } from '../../../../common/CopyAbleText'\nimport { useTranslation } from 'react-i18next'\n\nexport interface MfaResetStep2Props {\n recoverCode: string\n onFinish: () => void\n}\n\nexport const MfaResetStep2: FC<MfaResetStep2Props> = ({\n recoverCode,\n onFinish,\n}) => {\n const { t } = useTranslation()\n return (\n <Form onFinish={onFinish}>\n <CopyAbleText className=\"authing-guard-secret-block\">\n {recoverCode}\n </CopyAbleText>\n <Form.Item\n valuePropName=\"checked\"\n rules={[\n {\n validateTrigger: [],\n validator(r, v) {\n return new Promise((resolve, reject) => {\n if (!v) {\n reject(t('login.confirmSavedCode'))\n }\n resolve(true)\n })\n },\n },\n ]}\n name=\"MfaCopyRecoverCode\"\n >\n <Checkbox>{t('login.rememberedSecret')}</Checkbox>\n </Form.Item>\n\n <Button\n className=\"authing-guard-mfa-confirm-btn\"\n htmlType=\"submit\"\n block\n type=\"primary\"\n size=\"large\"\n >\n {t('common.sure')}\n </Button>\n </Form>\n )\n}\n","import { User } from 'authing-js-sdk'\nimport React, { FC, useState } from 'react'\n\nimport { MfaResetStep1 } from './Step1'\nimport { MfaResetStep2 } from './Step2'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { MfaResetForm } from '../../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nexport const MfaResetCodeForm: FC<MfaResetForm> = ({\n goVerify,\n onSuccess,\n onFail,\n}) => {\n const { t } = useTranslation()\n\n const {\n state: {\n mfaData: { mfaToken },\n },\n } = useGuardContext()\n\n const [step, setStep] = useState(1)\n const [user, setUser] = useState<User | null>(null)\n const [recoverCode, setRecoverCode] = useState('')\n\n const onReset = (\n user: User & {\n recoveryCode: string\n }\n ) => {\n setStep(2)\n setUser(user)\n setRecoverCode(user.recoveryCode)\n }\n\n const stepMap: Record<number, JSX.Element | undefined> = {\n 1: (\n <MfaResetStep1\n onFail={onFail}\n goVerify={goVerify}\n onSuccess={onReset}\n mfaToken={mfaToken}\n />\n ),\n 2: (\n <MfaResetStep2\n onFinish={() => onSuccess?.(user!)}\n recoverCode={recoverCode}\n />\n ),\n }\n\n return (\n <>\n <h2 className=\"authing-guard-mfa-reset-title\">\n {t('common.useRecoverCode')}\n </h2>\n <p className=\"authing-guard-mfa-reset-tips\">{t('login.mfaAfterReset')}</p>\n {stepMap[step]}\n </>\n )\n}\n","import { Button } from 'antd'\nimport React, { FC } from 'react'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { GuardScenes } from '../../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nexport interface RegisterFormFooterProps {\n loading: boolean\n}\n\nexport const RegisterFormFooter: FC<RegisterFormFooterProps> = ({\n loading,\n}) => {\n const {\n setValue,\n state: { config },\n } = useGuardContext()\n const { t } = useTranslation()\n\n return (\n <>\n <Button\n htmlType=\"submit\"\n size=\"large\"\n type=\"primary\"\n loading={loading}\n block\n >\n {loading\n ? t(\n `map.${config.text?.registerBtn?.loading}`,\n config.text?.registerBtn?.loading\n )\n : t(\n `map.${config.text?.registerBtn?.normal}`,\n config.text?.registerBtn?.normal\n )}\n </Button>\n\n <div className=\"authing-guard-form-actions\">\n <div className=\"authing-guard-tip-btn-comb\">\n <span className=\"authing-guard-tip\">{t('common.alreadyHasAcc')}</span>\n <Button\n onClick={() => setValue('guardScenes', GuardScenes.Login)}\n className=\"authing-guard-text-btn\"\n type=\"text\"\n >\n {t('common.loginImmediate')}\n </Button>\n </div>\n </div>\n </>\n )\n}\n","import React, { forwardRef, useImperativeHandle, useState } from 'react'\nimport { Input, Form } from 'antd'\nimport { FormInstance } from 'antd/lib/form'\nimport { UserOutlined, LockOutlined } from '@ant-design/icons'\n\nimport {\n getDeviceName,\n getRequiredRules,\n getUserRegisterParams,\n VALIDATE_PATTERN,\n} from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { EmailRegisterFormProps } from '../../../../components/AuthingGuard/types'\nimport { RegisterFormFooter } from '../../../../components/AuthingGuard/Forms/RegisterFormFooter'\nimport { useTranslation } from 'react-i18next'\n\nexport const EmailRegisterForm = forwardRef<\n FormInstance,\n EmailRegisterFormProps\n>(({ onSuccess, onFail, onValidateFail }, ref) => {\n const { t } = useTranslation()\n const {\n state: { authClient },\n } = useGuardContext()\n\n const [rawForm] = Form.useForm()\n\n const [loading, setLoading] = useState(false)\n\n const onFinishFailed = (errorInfo: any) => {\n setLoading(false)\n onValidateFail && onValidateFail(errorInfo)\n }\n\n const onFinish = async (values: any) => {\n try {\n await rawForm.validateFields()\n const { email, password } = values\n // 注册并获取登录态\n const user = await authClient.registerByEmail(\n email,\n password,\n {\n browser: navigator.userAgent,\n device: getDeviceName(),\n },\n {\n generateToken: true,\n params: getUserRegisterParams(),\n }\n )\n onSuccess && onSuccess(user)\n } catch (error) {\n onFail && onFail(error)\n } finally {\n setLoading(false)\n }\n }\n\n useImperativeHandle(ref, () => rawForm)\n\n const formItems = [\n {\n component: (\n <Input\n autoComplete=\"email\"\n size=\"large\"\n placeholder={t('login.inputEmail')}\n prefix={<UserOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'email',\n rules: getRequiredRules(t('common.emailNotNull')).concat({\n pattern: VALIDATE_PATTERN.email,\n message: t('login.emailError'),\n }),\n },\n {\n component: (\n <Input.Password\n size=\"large\"\n placeholder={t('common.setPassword')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'password',\n rules: getRequiredRules(t('common.passwordNotNull')),\n },\n {\n component: (\n <Input.Password\n size=\"large\"\n placeholder={t('login.inputPwdAgain')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'new-password',\n rules: getRequiredRules(t('common.repeatPassword')).concat({\n validator: (rule, value) => {\n if (value !== rawForm.getFieldValue('password')) {\n return Promise.reject(t('common.repeatPasswordDoc'))\n } else {\n return Promise.resolve()\n }\n },\n }),\n },\n ]\n\n return (\n <Form\n form={rawForm}\n onFinish={onFinish}\n onSubmitCapture={() => setLoading(true)}\n onFinishFailed={onFinishFailed}\n >\n {formItems.map((item) => (\n <Form.Item key={item.name} name={item.name} rules={item.rules}>\n {item.component}\n </Form.Item>\n ))}\n\n <RegisterFormFooter loading={loading} />\n </Form>\n )\n})\n","import { Input, Form } from 'antd'\nimport { FormInstance } from 'antd/lib/form'\nimport React, { forwardRef, useImperativeHandle, useState } from 'react'\nimport { UserOutlined, LockOutlined, SafetyOutlined } from '@ant-design/icons'\n\nimport { useGuardContext } from '../../../../context/global/context'\nimport { PhoneRegisterFormProps } from '../../../../components/AuthingGuard/types'\nimport {\n getDeviceName,\n getRequiredRules,\n getUserRegisterParams,\n VALIDATE_PATTERN,\n} from '../../../../utils'\nimport { SendPhoneCode } from '../../../../components/AuthingGuard/Forms/SendPhoneCode'\nimport { RegisterFormFooter } from '../../../../components/AuthingGuard/Forms/RegisterFormFooter'\nimport { useTranslation } from 'react-i18next'\n\nexport const PhoneRegisterForm = forwardRef<\n FormInstance,\n PhoneRegisterFormProps\n>(({ onSuccess, onFail, onValidateFail }, ref) => {\n const {\n state: { authClient },\n } = useGuardContext()\n const { t } = useTranslation()\n\n const [rawForm] = Form.useForm()\n\n const [phone, setPhone] = useState('')\n const [loading, setLoading] = useState(false)\n\n const onFinishFailed = (errorInfo: any) => {\n setLoading(false)\n onValidateFail && onValidateFail(errorInfo)\n }\n\n const onFinish = async (values: any) => {\n try {\n await rawForm.validateFields()\n const { phone, code, password } = values\n const user = await authClient.registerByPhoneCode(\n phone,\n code,\n password,\n {\n browser: navigator.userAgent,\n device: getDeviceName(),\n },\n {\n generateToken: true,\n params: getUserRegisterParams(),\n }\n )\n onSuccess && onSuccess(user)\n } catch (error) {\n onFail && onFail(error)\n } finally {\n setLoading(false)\n }\n }\n\n useImperativeHandle(ref, () => rawForm)\n\n const formItems = [\n {\n component: (\n <Input\n autoComplete=\"tel\"\n onChange={(e) => {\n setPhone(e.target.value)\n }}\n size=\"large\"\n placeholder={t('login.inputPhone')}\n prefix={<UserOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'phone',\n rules: getRequiredRules(t('common.phoneNotNull')).concat({\n pattern: VALIDATE_PATTERN.phone,\n message: t('login.phoneError'),\n }),\n },\n {\n component: (\n <Input.Password\n size=\"large\"\n placeholder={t('common.setPassword')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'password',\n rules: getRequiredRules(t('common.passwordNotNull')),\n },\n {\n component: (\n <Input.Password\n size=\"large\"\n placeholder={t('login.inputPwdAgain')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'new-password',\n rules: getRequiredRules(t('common.repeatPassword')).concat({\n validator: (rule, value) => {\n if (value !== rawForm.getFieldValue('password')) {\n return Promise.reject(t('common.repeatPasswordDoc'))\n } else {\n return Promise.resolve()\n }\n },\n }),\n },\n {\n component: (\n <Input\n autoComplete=\"one-time-code\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: 4,\n })}\n prefix={<SafetyOutlined style={{ color: '#ddd' }} />}\n addonAfter={<SendPhoneCode phone={phone} />}\n />\n ),\n name: 'code',\n rules: getRequiredRules(t('common.captchaCodeNotNull')),\n },\n ]\n\n return (\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinishFailed={onFinishFailed}\n onFinish={onFinish}\n >\n {formItems.map((item) => (\n <Form.Item name={item.name} key={item.name} rules={item.rules}>\n {item.component}\n </Form.Item>\n ))}\n\n <RegisterFormFooter loading={loading} />\n </Form>\n )\n})\n","import { Input, Form, Alert } from 'antd'\nimport { FormInstance } from 'antd/lib/form'\nimport { UserOutlined, LockOutlined } from '@ant-design/icons'\nimport React, { forwardRef, useImperativeHandle, useState } from 'react'\n\nimport {\n getRequiredRules,\n getUserRegisterParams,\n validate,\n} from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { NEED_CAPTCHA } from '../../../../components/AuthingGuard/constants'\nimport { PasswordLoginFormProps } from '../../../../components/AuthingGuard/types'\nimport { LoginFormFooter } from '../../../../components/AuthingGuard/Forms/LoginFormFooter'\nimport { useTranslation } from 'react-i18next'\n\nconst captchaUrl = '/api/v2/security/captcha'\nconst getCaptchaUrl = () => `${captchaUrl}?r=${+new Date()}`\n\nexport const PasswordLoginForm = forwardRef<\n FormInstance,\n PasswordLoginFormProps\n>(({ onSuccess, onValidateFail, onFail }, ref) => {\n const { state } = useGuardContext()\n const { t } = useTranslation()\n\n const { config, authClient } = state\n const autoRegister = config.autoRegister\n\n const [rawForm] = Form.useForm()\n\n const [needCaptcha, setNeedCaptcha] = useState(false)\n const [verifyCodeUrl, setVerifyCodeUrl] = useState<string | null>(null)\n const [loading, setLoading] = useState(false)\n\n const onFinishFailed = (errorInfo: any) => {\n setLoading(false)\n onValidateFail && onValidateFail(errorInfo)\n }\n\n const onFinish = async (values: any) => {\n try {\n const identity = values.identity && values.identity.trim()\n const password = values.password && values.password.trim()\n const captchaCode = values.captchaCode && values.captchaCode.trim()\n\n const user = validate('phone', identity)\n ? await authClient.loginByPhonePassword(identity, password, {\n autoRegister,\n captchaCode,\n params: getUserRegisterParams(),\n })\n : validate('email', identity)\n ? await authClient.loginByEmail(identity, password, {\n autoRegister,\n captchaCode,\n params: getUserRegisterParams(),\n })\n : await authClient.loginByUsername(identity, password, {\n autoRegister,\n captchaCode,\n params: getUserRegisterParams(),\n })\n\n onSuccess && onSuccess(user)\n } catch (error) {\n if (error.code === NEED_CAPTCHA && verifyCodeUrl === null) {\n setNeedCaptcha(true)\n setVerifyCodeUrl(getCaptchaUrl())\n }\n\n onFail && onFail(error)\n } finally {\n setLoading(false)\n }\n }\n\n useImperativeHandle(ref, () => rawForm)\n\n const formItems = [\n {\n component: (\n <Input\n autoComplete=\"email,username,tel\"\n size=\"large\"\n placeholder={t('login.inputEmailUsernamePhone')}\n prefix={<UserOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'identity',\n rules: getRequiredRules(t('common.accNotNull')),\n },\n {\n component: (\n <Input.Password\n size=\"large\"\n placeholder={t('login.inputLoginPwd')}\n prefix={<LockOutlined style={{ color: '#ddd' }} />}\n />\n ),\n name: 'password',\n rules: getRequiredRules(t('common.passwordNotNull')),\n },\n {\n component: (\n <Input\n size=\"large\"\n placeholder={t('login.inputCaptchaCode')}\n addonAfter={\n <img\n src={verifyCodeUrl ?? ''}\n alt={t('login.captchaCode')}\n style={{ height: '2em', cursor: 'pointer' }}\n onClick={() => setVerifyCodeUrl(getCaptchaUrl())}\n />\n }\n />\n ),\n name: 'captchaCode',\n rules: getRequiredRules(t('common.captchaCodeNotNull')),\n hide: !needCaptcha,\n },\n ]\n\n return (\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinishFailed={onFinishFailed}\n onFinish={onFinish}\n >\n {autoRegister && (\n <Alert message={t('login.autoRegister')} style={{ marginBottom: 24 }} />\n )}\n {formItems.map(\n (item) =>\n !item.hide && (\n <Form.Item key={item.name} name={item.name} rules={item.rules}>\n {item.component}\n </Form.Item>\n )\n )}\n\n <LoginFormFooter\n needRegister\n needRestPwd\n loading={loading}\n ></LoginFormFooter>\n </Form>\n )\n})\n","import React, { FC } from 'react'\nimport { getClassnames } from '../../../utils'\nimport './iconfont'\nimport './style.less'\n\nexport const IconFont: FC<{\n type: string\n style?: React.CSSProperties\n className?: string\n}> = ({ type, style, className }) => {\n return (\n <svg\n style={{ ...style }}\n className={getClassnames(['authing-icon', className])}\n >\n <use xlinkHref={`#${type}`}></use>\n </svg>\n )\n}\n","import { requestClient } from './http'\nimport { Protocol } from '../../../components/AuthingGuard/types'\nimport {\n IAzureAdConnectionConfig,\n ICasConnectionConfig,\n ISamlConnectionConfig,\n OIDCConnectionConfig,\n SocialConnectionItem,\n} from './userPoolConfig'\nimport { i18n } from '../locales'\n\nexport enum ApplicationMfaType {\n SMS = 'SMS',\n EMAIL = 'EMAIL',\n // OTP = 'OTP',\n // FACE = 'FACE',\n // FINGERPRINT = 'FINGERPRINT',\n}\n\nexport const ApplicationMfaTypeLabel: () => Record<\n ApplicationMfaType,\n string\n> = () => ({\n [ApplicationMfaType.SMS]: i18n.t('common.SMS'),\n [ApplicationMfaType.EMAIL]: i18n.t('common.EmailVerification'),\n})\n\nexport interface OidcClientMetadata {\n grant_types: string[]\n client_id: string\n redirect_uris: string[]\n scope: string\n response_types: ResponseType[]\n}\nexport interface InternalExtendsField {\n type: 'internal'\n name: string\n label: string\n inputType: string\n}\n\nexport interface UserExtendsField {\n type: 'user'\n id: string\n name: string\n label: string\n inputType: string\n}\n\nexport type ExtendsField = InternalExtendsField | UserExtendsField\n\nexport interface ApplicationConfig {\n id: string\n cdnBase: string\n userPoolId: string\n rootUserPoolId: string\n publicKey: string\n // 登录框自定义 css 代码\n css: string\n name: string\n logo: string\n redirectUris: string[]\n registerDisabled: boolean\n registerTabs: {\n list: string[]\n default: string\n title: { [x: string]: string }\n }\n loginTabs: {\n list: string[]\n default: string\n title: { [x: string]: string }\n }\n socialConnections: SocialConnectionItem[]\n\n extendsFieldsEnabled: boolean\n extendsFields: ExtendsField[]\n\n identityProviders: {\n identifier: string\n protocol: Protocol\n displayName: string\n logo: string\n config:\n | ISamlConnectionConfig\n | OIDCConnectionConfig\n | ICasConnectionConfig\n | IAzureAdConnectionConfig\n }[]\n\n ssoPageComponentDisplay: {\n autoRegisterThenLoginHintInfo: boolean\n forgetPasswordBtn: boolean\n idpBtns: boolean\n loginBtn: boolean\n loginByPhoneCodeTab: boolean\n loginByUserPasswordTab: boolean\n loginMethodNav: boolean\n phoneCodeInput: boolean\n registerBtn: boolean\n registerByEmailTab: boolean\n registerByPhoneTab: boolean\n registerMethodNav: boolean\n socialLoginBtns: boolean\n userPasswordInput: boolean\n wxMpScanTab: boolean\n }\n\n protocol: Protocol\n oidcConfig: OidcClientMetadata\n}\n\nexport const fetchAppConfig = (appId: string) =>\n requestClient.get<ApplicationConfig>(\n `/api/v2/applications/${appId}/public-config`\n )\n","import qs from 'qs'\nimport shortid from 'shortid'\nimport React, { FC, useEffect } from 'react'\nimport { Button, Avatar, Space, Tooltip, message } from 'antd'\n\nimport { isWechatBrowser, popupCenter } from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport {\n APP_MFA_CODE,\n OTP_MFA_CODE,\n} from '../../../../components/AuthingGuard/constants'\nimport {\n Protocol,\n SocialAndIdpLoginProps,\n} from '../../../../components/AuthingGuard/types'\nimport {\n OIDCConnectionConfig,\n ICasConnectionConfig,\n ISamlConnectionConfig,\n IAzureAdConnectionConfig,\n IOAuthConnectionConfig,\n} from '../../../../components/AuthingGuard/api'\nimport { requestClient } from '../../api/http'\n\nimport './style.less'\nimport { IconFont } from '../../IconFont'\nimport { useScreenSize } from '../../hooks/useScreenSize'\nimport { SocialConnectionProvider } from 'authing-js-sdk'\nimport { useTranslation } from 'react-i18next'\n\nexport const SocialAndIdpLogin: FC<SocialAndIdpLoginProps> = ({\n onFail = () => {},\n onSuccess = () => {},\n}) => {\n const {\n state: { config, userPoolId, appId, authClient },\n } = useGuardContext()\n const { t } = useTranslation()\n\n const noForm = !config.loginMethods?.length\n\n const [screenSize] = useScreenSize()\n\n useEffect(() => {\n const onMessage = (evt: MessageEvent) => {\n // TODO: event.origin是指发送的消息源,一定要进行验证!!!\n\n const { code, message: errMsg, data, event } = evt.data\n\n const { source, eventType } = event || {}\n\n // 社会化登录是用 authing-js-sdk 实现的,不用再在这里回调了\n if (source === 'authing' && eventType === 'socialLogin') {\n return\n }\n\n try {\n const parsedMsg = JSON.parse(errMsg)\n const { code: authingCode } = parsedMsg\n if ([OTP_MFA_CODE, APP_MFA_CODE].includes(authingCode)) {\n onFail(parsedMsg)\n return\n }\n } catch (e) {\n // do nothing...\n }\n\n if (code !== undefined) {\n if (code === 200) {\n localStorage.setItem('_authing_token', data?.token)\n onSuccess(data)\n } else {\n message.error(errMsg)\n }\n }\n }\n window.addEventListener('message', onMessage)\n return () => {\n window.removeEventListener('message', onMessage)\n }\n }, [onFail, onSuccess])\n\n const idpButtons = config.enterpriseConnectionObjs.map((i) => {\n if (i.protocol === Protocol.OIDC) {\n const configItem = i.config as OIDCConnectionConfig\n const state = shortid.generate()\n\n const query = qs.stringify({\n client_id: configItem.clientId,\n redirect_uri: configItem.redirectUri,\n scope: configItem.scopes,\n response_type: configItem.responseType,\n state,\n nonce: shortid.generate(),\n })\n const url = `${configItem.authorizationEdpoint}?${query}`\n\n return (\n <Button\n key={i.identifier}\n className=\"authing-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n await requestClient.post(\n '/api/v2/connections/oidc/start-interaction',\n {\n state,\n protocol: i.protocol,\n userPoolId,\n appId,\n referer: window.location.href,\n connection: { providerIentifier: i.identifier },\n }\n )\n popupCenter(url)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else if (i.protocol === Protocol.SAML) {\n const config = i.config as ISamlConnectionConfig\n return (\n <Button\n key={i.identifier}\n className=\"authing-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n popupCenter(config.samlRequest!)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else if (i.protocol === Protocol.CAS) {\n const config = i.config as ICasConnectionConfig\n\n return (\n <Button\n key={i.identifier}\n className=\"authing-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n popupCenter(config.casConnectionLoginUrl!)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else if (i.protocol === Protocol.OAUTH) {\n const config = i.config as IOAuthConnectionConfig\n\n return (\n <Button\n key={i.identifier}\n className=\"authing-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n popupCenter(config.authUrl!)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else if (i.protocol === Protocol.AZURE_AD) {\n const configItem = i.config as IAzureAdConnectionConfig\n return (\n <Button\n key={i.identifier}\n className=\"authing-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n popupCenter(configItem.authorizationUrl)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else {\n return null\n }\n })\n\n const socialLoginButtons = config.socialConnectionObjs\n .filter((item) =>\n isWechatBrowser()\n ? item.provider === SocialConnectionProvider.WECHATMP\n : item.provider !== SocialConnectionProvider.WECHATMP\n )\n .map((item) => {\n const iconType = `authing-${item.provider.replace(/:/g, '-')}`\n\n const authorization_params: Record<string, any> = {}\n if (item.provider === SocialConnectionProvider.BAIDU) {\n authorization_params.display = screenSize\n }\n\n const onLogin = () => {\n authClient.social.authorize(item.provider, {\n onSuccess(user) {\n onSuccess(user)\n },\n onError(code, msg) {\n try {\n const parsedMsg = JSON.parse(msg)\n const { code: authingCode } = parsedMsg\n if ([OTP_MFA_CODE, APP_MFA_CODE].includes(authingCode)) {\n onFail(parsedMsg)\n return\n }\n } catch (e) {\n // do nothing...\n }\n\n message.error(msg)\n },\n authorization_params,\n })\n }\n\n return noForm ? (\n <Button\n key={item.provider}\n block\n size=\"large\"\n className=\"authing-guard-third-login-btn\"\n icon={\n <IconFont\n type={iconType}\n style={{ fontSize: 20, marginRight: 8 }}\n />\n }\n onClick={onLogin}\n >\n {item.name}\n </Button>\n ) : (\n <Tooltip key={item.provider} title={item.name}>\n <div className=\"authing-social-login-item\" onClick={onLogin}>\n <IconFont type={iconType} />\n </div>\n </Tooltip>\n )\n })\n\n const idp =\n config.enterpriseConnectionObjs.length > 0 ? (\n <>\n {!noForm && <div className=\"authing-social-login-title\">OR</div>}\n <Space\n size={12}\n className=\"authing-guard-full-width-space\"\n direction=\"vertical\"\n >\n {idpButtons}\n </Space>\n </>\n ) : null\n\n const socialLogin =\n socialLoginButtons.length > 0 && noForm ? (\n <Space\n size={12}\n className=\"authing-guard-full-width-space\"\n direction=\"vertical\"\n >\n {socialLoginButtons}\n </Space>\n ) : (\n socialLoginButtons.length > 0 && (\n <>\n <div className=\"authing-social-login-title\">\n {t('login.thridAccLogin')}\n </div>\n <div className=\"authing-social-login-list\">{socialLoginButtons}</div>\n </>\n )\n )\n\n return (\n <>\n {!noForm && (\n <div\n style={{\n flex: 1,\n minHeight: 26,\n }}\n ></div>\n )}\n <Space\n size={12}\n direction=\"vertical\"\n className=\"authing-guard-full-width-space\"\n >\n {idp}\n {socialLogin}\n </Space>\n </>\n )\n}\n","import React, { forwardRef, useImperativeHandle, useState } from 'react'\nimport { FormInstance, Rule } from 'antd/lib/form'\nimport { Alert, Form, Input } from 'antd'\nimport { UserOutlined, SafetyOutlined } from '@ant-design/icons'\n\nimport {\n getRequiredRules,\n getUserRegisterParams,\n VALIDATE_PATTERN,\n} from '../../../../utils'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { PhoneCodeLoginFormProps } from '../../../../components/AuthingGuard/types'\nimport { SendPhoneCode } from '../../../../components/AuthingGuard/Forms/SendPhoneCode'\nimport { LoginFormFooter } from '../../../../components/AuthingGuard/Forms/LoginFormFooter'\nimport { useTranslation } from 'react-i18next'\n\nexport const PhoneCodeLoginForm = forwardRef<\n FormInstance,\n PhoneCodeLoginFormProps\n>(({ onSuccess, onFail, onValidateFail }, ref) => {\n const {\n state: { authClient, config },\n } = useGuardContext()\n const { t } = useTranslation()\n\n const rulesMap: Record<string, Rule[]> = {\n phone: getRequiredRules(t('login.inputPhone')).concat({\n pattern: VALIDATE_PATTERN.phone,\n message: t('common.phoneFormateError'),\n }),\n code: getRequiredRules(t('common.inputVerifyCode')),\n }\n\n const [rawForm] = Form.useForm()\n\n const [phone, setPhone] = useState('')\n const [loading, setLoading] = useState(false)\n\n const onFinishFailed = (errorInfo: any) => {\n setLoading(false)\n onValidateFail && onValidateFail(errorInfo)\n }\n\n const onFinish = async (values: any) => {\n try {\n const { phone, code } = values\n const user = await authClient.loginByPhoneCode(phone, code, {\n params: getUserRegisterParams(),\n })\n onSuccess && onSuccess(user)\n } catch (error) {\n onFail && onFail(error)\n } finally {\n setLoading(false)\n }\n }\n\n useImperativeHandle(ref, () => rawForm)\n\n return (\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinishFailed={onFinishFailed}\n onFinish={onFinish}\n >\n {config.autoRegister && (\n <Alert\n message={t('login.phoneAutoRegister')}\n style={{ marginBottom: 24 }}\n />\n )}\n <Form.Item name=\"phone\" rules={rulesMap.phone}>\n <Input\n autoComplete=\"tel\"\n onChange={(e) => {\n setPhone(e.target.value)\n }}\n size=\"large\"\n placeholder={t('login.inputPhone')}\n prefix={<UserOutlined style={{ color: '#ddd' }} />}\n />\n </Form.Item>\n <Form.Item name=\"code\" rules={rulesMap.code}>\n <Input\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: 4,\n })}\n prefix={<SafetyOutlined style={{ color: '#ddd' }} />}\n suffix={<SendPhoneCode phone={phone} />}\n />\n </Form.Item>\n\n <LoginFormFooter needRegister loading={loading}></LoginFormFooter>\n </Form>\n )\n})\n","import React, { FC, useState } from 'react'\nimport { Button, Form, Input, message } from 'antd'\n\nimport { useGuardContext } from '../../../../context/global/context'\nimport { MFACheckPhoneFormProps } from '../../types'\n\nimport './style.less'\nimport { VALIDATE_PATTERN } from '../../../../utils'\nimport { useTranslation } from 'react-i18next'\n\nexport const CheckPhoneForm: FC<MFACheckPhoneFormProps> = ({\n onSuccess,\n mfaToken,\n}) => {\n const {\n state: { authClient },\n } = useGuardContext()\n const { t } = useTranslation()\n\n const [rawForm] = Form.useForm()\n\n const [loading, setLoading] = useState(false)\n\n const onFinish = async ({ phone }: any) => {\n try {\n const bindable = await authClient.mfa.phoneOrEmailBindable({\n mfaToken,\n phone,\n })\n if (!bindable) {\n message.error(\n t('common.unBindEmaileDoc', {\n email: phone,\n })\n )\n return\n }\n onSuccess(phone!)\n } catch (e) {\n // do nothing\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <>\n <h3 className=\"authing-guard-mfa-title\">{t('common.bindPhone')}</h3>\n <p className=\"authing-guard-mfa-tips\">{t('login.bindPhoneInfo')}</p>\n <Form\n className=\"authing-mfa-check-phone-from\"\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinish={onFinish}\n onFinishFailed={() => setLoading(false)}\n >\n <Form.Item\n name=\"phone\"\n rules={[\n {\n required: true,\n message: t('login.inputPhone'),\n },\n {\n pattern: VALIDATE_PATTERN.phone,\n message: t('login.phoneError'),\n },\n ]}\n >\n <Input size=\"large\" placeholder={t('login.inputPhone')} />\n </Form.Item>\n\n <Button\n className=\"authing-guard-mfa-confirm-btn\"\n loading={loading}\n block\n htmlType=\"submit\"\n type=\"primary\"\n size=\"large\"\n >\n {t('common.sure')}\n </Button>\n </Form>\n </>\n )\n}\n","import { User } from 'authing-js-sdk'\nimport React, { FC, useState } from 'react'\nimport { Button, Form } from 'antd'\n\nimport { VerifyCodeInput } from '../../../../common/VerifyCodeInput'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { SmsMFAVerifyFormProps } from '../../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { SendCodeBtn } from '../SendPhoneCode/SendCodeBtn'\nimport { useTranslation } from 'react-i18next'\n\nconst CODE_LEN = 4\n\nexport const VerifyCodeForm: FC<SmsMFAVerifyFormProps> = ({\n onSuccess,\n onFail,\n phone,\n mfaToken,\n sendCodeRef,\n}) => {\n const {\n state: { authClient },\n } = useGuardContext()\n const { t } = useTranslation()\n\n const [rawForm] = Form.useForm()\n\n const [MfaCode, setMFACode] = useState(new Array(CODE_LEN).fill(''))\n const [loading, setLoading] = useState(false)\n const [sending, setSending] = useState(false)\n const [sent, setSent] = useState(false)\n\n const onFinish = async (values: any) => {\n try {\n const user: User = await authClient.mfa.verifyAppSmsMfa({\n mfaToken,\n phone: phone!,\n code: MfaCode.join(''),\n })\n onSuccess && onSuccess(user)\n } catch (e) {\n onFail?.(e)\n } finally {\n setLoading(false)\n }\n }\n\n const sendVerifyCode = async () => {\n setSending(true)\n try {\n await authClient.sendSmsCode(phone!)\n setSent(true)\n return true\n } catch (e) {\n return false\n } finally {\n setSending(false)\n }\n }\n\n return (\n <>\n <h3 className=\"authing-guard-mfa-title\">{t('login.inputPhoneCode')}</h3>\n <p className=\"authing-guard-mfa-tips\">\n {sending\n ? t('login.sendingVerifyCode')\n : sent\n ? `${t('login.verifyCodeSended')} ${phone}`\n : t('login.clickSent')}\n </p>\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinish={onFinish}\n onFinishFailed={() => setLoading(false)}\n >\n <Form.Item\n name=\"mfaCode\"\n rules={[\n {\n validateTrigger: [],\n validator() {\n if (MfaCode.some((item) => !item)) {\n return Promise.reject(t('login.inputFullMfaCode'))\n }\n return Promise.resolve()\n },\n },\n ]}\n >\n <VerifyCodeInput\n length={CODE_LEN}\n verifyCode={MfaCode}\n setVerifyCode={setMFACode}\n />\n </Form.Item>\n <SendCodeBtn btnRef={sendCodeRef} beforeSend={() => sendVerifyCode()} />\n\n <Button\n className=\"authing-guard-mfa-confirm-btn\"\n loading={loading}\n block\n htmlType=\"submit\"\n type=\"primary\"\n size=\"large\"\n >\n {t('common.sure')}\n </Button>\n </Form>\n </>\n )\n}\n","import React, { FC, useRef, useState } from 'react'\nimport { useGuardContext } from 'src/context/global/context'\nimport { CheckPhoneForm } from './CheckPhoneForm'\nimport { VerifyCodeForm } from './VerifyCodeForm'\nimport { SmsMFAFormProps } from '../../types'\n\nexport const SmsMfaVerifyForm: FC<SmsMFAFormProps> = ({\n onSuccess,\n onFail,\n}) => {\n const {\n state: {\n mfaData: { mfaToken, phone: userPhone },\n },\n } = useGuardContext()\n const [phone, setPhone] = useState(userPhone)\n const sendCodeRef = useRef<HTMLButtonElement>(null)\n\n return (\n <>\n {phone ? (\n <VerifyCodeForm\n sendCodeRef={sendCodeRef}\n onSuccess={onSuccess}\n onFail={onFail}\n phone={phone!}\n mfaToken={mfaToken}\n ></VerifyCodeForm>\n ) : (\n <CheckPhoneForm\n mfaToken={mfaToken}\n onSuccess={(phone) => {\n setPhone(phone)\n sendCodeRef.current?.click()\n }}\n ></CheckPhoneForm>\n )}\n </>\n )\n}\n","import React, { FC, useState } from 'react'\nimport { Button, Form, Input, message } from 'antd'\n\nimport { useGuardContext } from '../../../../context/global/context'\nimport { MFACheckEmailFormProps } from '../../types'\n\nimport './style.less'\nimport { VALIDATE_PATTERN } from '../../../../utils'\nimport { useTranslation } from 'react-i18next'\n\nexport const CheckEmailForm: FC<MFACheckEmailFormProps> = ({\n onSuccess,\n mfaToken,\n}) => {\n const {\n state: { authClient },\n } = useGuardContext()\n\n const { t } = useTranslation()\n\n const [rawForm] = Form.useForm()\n\n const [loading, setLoading] = useState(false)\n\n const onFinish = async ({ email }: any) => {\n try {\n const bindable = await authClient.mfa.phoneOrEmailBindable({\n mfaToken,\n email,\n })\n if (!bindable) {\n message.error(\n t('common.unBindEmaileDoc', {\n email: email,\n })\n )\n return\n }\n onSuccess(email!)\n } catch (e) {\n // do nothing\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <>\n <h3 className=\"authing-guard-mfa-title\">{t('common.bindEmail')}</h3>\n <p className=\"authing-guard-mfa-tips\">{t('common.bindEmailDoc')}</p>\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinish={onFinish}\n onFinishFailed={() => setLoading(false)}\n >\n <Form.Item\n name=\"email\"\n rules={[\n {\n required: true,\n message: t('login.inputEmail'),\n },\n {\n pattern: VALIDATE_PATTERN.email,\n message: t('login.emailError'),\n },\n ]}\n >\n <Input placeholder={t('login.inputEmail')}></Input>\n </Form.Item>\n\n <Button\n className=\"authing-guard-mfa-confirm-btn\"\n loading={loading}\n block\n htmlType=\"submit\"\n type=\"primary\"\n size=\"large\"\n >\n {t('common.sure')}\n </Button>\n </Form>\n </>\n )\n}\n","import { EmailScene, User } from 'authing-js-sdk'\nimport React, { FC, useState } from 'react'\nimport { Button, Form } from 'antd'\n\nimport { VerifyCodeInput } from '../../../../common/VerifyCodeInput'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { EmailMFAVerifyFormProps } from '../../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { SendCodeBtn } from '../SendPhoneCode/SendCodeBtn'\nimport { useTranslation } from 'react-i18next'\n\nconst CODE_LEN = 4\n\nexport const VerifyCodeForm: FC<EmailMFAVerifyFormProps> = ({\n onSuccess,\n onFail,\n email,\n mfaToken,\n sendCodeRef,\n}) => {\n const {\n state: { authClient },\n } = useGuardContext()\n\n const { t } = useTranslation()\n\n const [rawForm] = Form.useForm()\n\n const [MfaCode, setMFACode] = useState(new Array(CODE_LEN).fill(''))\n const [loading, setLoading] = useState(false)\n\n const [sending, setSending] = useState(false)\n const [sent, setSent] = useState(false)\n\n const onFinish = async (values: any) => {\n try {\n const user: User = await authClient.mfa.verifyAppEmailMfa({\n mfaToken,\n email: email!,\n code: MfaCode.join(''),\n })\n onSuccess && onSuccess(user)\n } catch (e) {\n onFail?.(e)\n } finally {\n setLoading(false)\n }\n }\n\n const sendVerifyCode = async () => {\n try {\n setSending(true)\n await authClient.sendEmail(email!, EmailScene.MfaVerify)\n setSent(true)\n return true\n } catch (e) {\n return false\n } finally {\n setSending(false)\n }\n }\n\n return (\n <>\n <h3 className=\"authing-guard-mfa-title\">{t('login.inputEmailCode')}</h3>\n <p className=\"authing-guard-mfa-tips\">\n {sending\n ? t('login.sendingVerifyCode')\n : sent\n ? `${t('login.verifyCodeSended')} ${email}`\n : t('login.clickSent')}\n </p>\n <Form\n form={rawForm}\n onSubmitCapture={() => setLoading(true)}\n onFinish={onFinish}\n onFinishFailed={() => setLoading(false)}\n >\n <Form.Item\n name=\"mfaCode\"\n rules={[\n {\n validateTrigger: [],\n validator() {\n if (MfaCode.some((item) => !item)) {\n return Promise.reject(t('login.inputFullMfaCode'))\n }\n return Promise.resolve()\n },\n },\n ]}\n >\n <VerifyCodeInput\n length={CODE_LEN}\n verifyCode={MfaCode}\n setVerifyCode={setMFACode}\n />\n </Form.Item>\n\n <SendCodeBtn btnRef={sendCodeRef} beforeSend={() => sendVerifyCode()} />\n\n <Button\n className=\"authing-guard-mfa-confirm-btn\"\n loading={loading}\n block\n htmlType=\"submit\"\n type=\"primary\"\n size=\"large\"\n >\n {t('common.sure')}\n </Button>\n </Form>\n </>\n )\n}\n","import React, { FC, useRef, useState } from 'react'\nimport { useGuardContext } from 'src/context/global/context'\nimport { CheckEmailForm } from './CheckEmailForm'\nimport { VerifyCodeForm } from './VerifyCodeForm'\nimport { SmsMFAFormProps } from '../../types'\n\nexport const EmailMfaVerifyForm: FC<SmsMFAFormProps> = ({\n onSuccess,\n onFail,\n}) => {\n const {\n state: {\n mfaData: { mfaToken, email: userEmail },\n },\n } = useGuardContext()\n const [email, setEmail] = useState(userEmail)\n const sendCodeRef = useRef<HTMLButtonElement>(null)\n\n return (\n <>\n {email ? (\n <VerifyCodeForm\n sendCodeRef={sendCodeRef}\n onSuccess={onSuccess}\n onFail={onFail}\n email={email!}\n mfaToken={mfaToken}\n ></VerifyCodeForm>\n ) : (\n <CheckEmailForm\n mfaToken={mfaToken}\n onSuccess={(email) => {\n setEmail(email)\n sendCodeRef.current?.click()\n }}\n ></CheckEmailForm>\n )}\n </>\n )\n}\n","import { message } from 'antd'\nimport { User } from 'authing-js-sdk'\nimport React, { FC, useState } from 'react'\n\nimport { Steps } from './Steps'\nimport {\n MfaResetCodeForm,\n MFAVerifyForm,\n} from '../../../components/AuthingGuard/Forms'\nimport { useGuardContext } from '../../../context/global/context'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nexport interface MfaLayoutProps {}\n\nexport const MfaLayout: FC<MfaLayoutProps> = () => {\n const { t } = useTranslation()\n const {\n state: { guardEvents, authClient },\n } = useGuardContext()\n\n const [step, setStep] = useState(Steps.Verify)\n\n const onSuccess = (user: User) => {\n message.success(t('common.LoginSuccess'))\n guardEvents.onLogin?.(user, authClient)\n }\n\n const onFail = (error: any) => {\n guardEvents.onLoginError?.(error, authClient)\n }\n\n const formProps = {\n onSuccess,\n onFail,\n }\n\n const formMap = {\n [Steps.Verify]: (\n <MFAVerifyForm {...formProps} goReset={() => setStep(Steps.Reset)} />\n ),\n [Steps.Reset]: (\n <MfaResetCodeForm {...formProps} goVerify={() => setStep(Steps.Verify)} />\n ),\n }\n\n return <div>{formMap[step]}</div>\n}\n","import { Button } from 'antd'\nimport React, { FC, useMemo } from 'react'\nimport { EllipsisOutlined } from '@ant-design/icons'\n\nimport { getClassnames } from '../../utils'\n\nimport './style.less'\n\nexport interface AuthingTabsProps extends React.HTMLAttributes<HTMLDivElement> {\n activeKey?: string\n onTabClick: (key: string) => void\n showLen?: number\n tabs: {\n key: string\n label: string\n component: JSX.Element\n }[]\n}\n\nexport const AuthingTabs: FC<AuthingTabsProps> = ({\n tabs,\n showLen = 3,\n className,\n activeKey,\n onTabClick,\n}) => {\n const activeIndex = useMemo(\n () => tabs.findIndex((item) => item.key === activeKey),\n [tabs, activeKey]\n )\n\n const showTabs = useMemo(() => {\n if (tabs.length <= showLen) {\n return [...tabs]\n }\n\n let startIndex = Math.max(activeIndex - 1, 0)\n if (startIndex + showLen > tabs.length - 1) {\n startIndex = tabs.length - showLen\n }\n\n return tabs.slice(startIndex, startIndex + showLen)\n }, [showLen, activeIndex, tabs])\n\n const hideTabs = useMemo(() => {\n const showKeys = showTabs.map((item) => item.key)\n return tabs.filter((item) => !showKeys.find((key) => item.key === key))\n }, [tabs, showTabs])\n\n return (\n <>\n <div className={getClassnames(['authing-tabs', className])}>\n <div\n className={getClassnames([\n 'authing-tabs-inner',\n Boolean(hideTabs.length) && 'authing-tabs-inner--more',\n ])}\n >\n {showTabs.map((item, index) => (\n <div\n onClick={() => onTabClick(item.key)}\n className={getClassnames([\n 'authing-tab-item',\n activeKey === item.key && 'authing-tab-item__active',\n ])}\n key={item.key}\n >\n {item.label}\n </div>\n ))}\n </div>\n {Boolean(hideTabs.length) && (\n <Button\n className=\"authing-tabs-show-more\"\n type=\"text\"\n icon={<EllipsisOutlined />}\n >\n <ul className=\"authing-tabs-more-panel\">\n {hideTabs.map((item) => (\n <li\n key={item.key}\n onClick={() => onTabClick(item.key)}\n className=\"authing-tabs-more-panel-item\"\n >\n {item.label}\n </li>\n ))}\n </ul>\n </Button>\n )}\n </div>\n\n <div className=\"authing-tab-pane\">\n {tabs.find((item) => item.key === activeKey)?.component}\n </div>\n </>\n )\n}\n","import { message } from 'antd'\nimport { User } from 'authing-js-sdk'\nimport { FormInstance } from 'antd/lib/form'\nimport React, { useRef } from 'react'\n\nimport { useGuardContext } from '../../../context/global/context'\nimport {\n ADLoginForm,\n LdapLoginForm,\n QrCodeLoginForm,\n SocialAndIdpLogin,\n PasswordLoginForm,\n PhoneCodeLoginForm,\n} from '../../../components/AuthingGuard/Forms'\nimport {\n OTP_MFA_CODE,\n APP_MFA_CODE,\n LOGIN_METHODS_MAP,\n} from '../../../components/AuthingGuard/constants'\nimport { AuthingTabs } from '../../../common/AuthingTabs'\nimport {\n BaseFormProps,\n GuardScenes,\n LoginMethods,\n} from '../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nconst useFormActions = () => {\n const { t } = useTranslation()\n\n const {\n setValue,\n state: { guardEvents, authClient },\n } = useGuardContext()\n\n const onSuccess = (user: User) => {\n message.success(t('common.LoginSuccess'))\n guardEvents.onLogin?.(user, authClient)\n }\n\n const onFail = (error: any) => {\n if (OTP_MFA_CODE === error?.code) {\n setValue('mfaData', error.data)\n setValue('guardScenes', GuardScenes.MfaVerify)\n }\n if (APP_MFA_CODE === error?.code) {\n setValue('mfaData', error.data)\n setValue('guardScenes', GuardScenes.AppMfaVerify)\n }\n guardEvents.onLoginError?.(error, authClient)\n }\n\n return {\n onFail,\n onSuccess,\n }\n}\n\nconst useNormalLoginTabs = ({ onSuccess, onFail }: BaseFormProps) => {\n const formRef = useRef<Record<LoginMethods, FormInstance>>(\n {} as Record<LoginMethods, FormInstance>\n )\n\n const formProps = {\n onFail,\n onSuccess,\n }\n\n const LOGIN_FORM_MAP = {\n [LoginMethods.Password]: (\n <PasswordLoginForm\n {...formProps}\n ref={(v) => (formRef.current[LoginMethods.Password] = v!)}\n />\n ),\n [LoginMethods.PhoneCode]: (\n <PhoneCodeLoginForm\n {...formProps}\n ref={(v) => (formRef.current[LoginMethods.PhoneCode] = v!)}\n />\n ),\n [LoginMethods.AppQr]: (\n <QrCodeLoginForm type={LoginMethods.AppQr} {...formProps} />\n ),\n [LoginMethods.WxMinQr]: (\n <QrCodeLoginForm type={LoginMethods.WxMinQr} {...formProps} />\n ),\n [LoginMethods.LDAP]: (\n <LdapLoginForm\n {...formProps}\n ref={(v) => (formRef.current[LoginMethods.LDAP] = v!)}\n />\n ),\n [LoginMethods.AD]: (\n <ADLoginForm\n {...formProps}\n ref={(v) => (formRef.current[LoginMethods.AD] = v!)}\n />\n ),\n }\n\n const {\n state: { config },\n } = useGuardContext()\n const { loginMethods = [] } = config\n\n const tabs = loginMethods.map((item) => ({\n key: item,\n label: LOGIN_METHODS_MAP()?.[item]!,\n component: LOGIN_FORM_MAP[item],\n }))\n\n return {\n tabs,\n }\n}\n\nconst SHOW_SOCIAL_LOGIN_TAB = [\n LoginMethods.LDAP,\n LoginMethods.Password,\n LoginMethods.PhoneCode,\n]\nexport const LoginLayout = () => {\n const {\n state: { activeTabs },\n setValue,\n } = useGuardContext()\n\n const { onFail, onSuccess } = useFormActions()\n const { tabs } = useNormalLoginTabs({ onSuccess, onFail })\n\n return (\n <>\n <AuthingTabs\n tabs={tabs}\n onTabClick={(t) =>\n setValue('activeTabs', {\n ...activeTabs,\n [GuardScenes.Login]: t,\n })\n }\n activeKey={activeTabs[GuardScenes.Login]}\n ></AuthingTabs>\n\n {SHOW_SOCIAL_LOGIN_TAB.includes(activeTabs[GuardScenes.Login]) && (\n <SocialAndIdpLogin onFail={onFail} onSuccess={onSuccess} />\n )}\n </>\n )\n}\n","import { message } from 'antd'\nimport { User } from 'authing-js-sdk'\nimport React, { FC } from 'react'\n\nimport { useGuardContext } from '../../../context/global/context'\nimport {\n GuardScenes,\n LoginMethods,\n RegisterMethods,\n} from '../../../components/AuthingGuard/types'\nimport { AuthingTabs } from '../../../common/AuthingTabs'\nimport { REGISTER_METHODS_MAP } from '../../../components/AuthingGuard/constants'\nimport {\n EmailRegisterForm,\n PhoneRegisterForm,\n} from '../../../components/AuthingGuard/Forms'\nimport { useTranslation } from 'react-i18next'\n\nexport const RegisterLayout: FC = () => {\n const {\n state: {\n config: { registerMethods, extendsFields },\n activeTabs,\n guardEvents,\n authClient,\n },\n setValue,\n } = useGuardContext()\n\n const { t } = useTranslation()\n const onSuccess = (user: User) => {\n message.success(t('common.registrationSuccess'))\n if (extendsFields?.length > 0) {\n setValue('guardScenes', GuardScenes.CompleteUserInfo)\n } else {\n setValue('guardScenes', GuardScenes.Login)\n }\n guardEvents.onRegister?.(user, authClient)\n }\n\n const onFail = (error: any) => {\n guardEvents.onRegisterError?.(error, authClient)\n }\n\n const formProps = {\n onSuccess,\n onFail,\n }\n\n const onTabClick = (t: string) => {\n const next = {\n ...activeTabs,\n [GuardScenes.Register]: t,\n }\n switch (t) {\n case RegisterMethods.Email:\n next[GuardScenes.Login] = LoginMethods.Password\n break\n case RegisterMethods.Phone:\n next[GuardScenes.Login] = LoginMethods.PhoneCode\n break\n default:\n break\n }\n\n setValue('activeTabs', next)\n }\n\n const REGISTER_FORM_MAP = {\n [RegisterMethods.Email]: <EmailRegisterForm {...formProps} />,\n [RegisterMethods.Phone]: <PhoneRegisterForm {...formProps} />,\n }\n\n const tabs = registerMethods!.map((item) => ({\n key: item,\n label: REGISTER_METHODS_MAP()[item],\n component: REGISTER_FORM_MAP[item],\n }))\n\n return (\n <AuthingTabs\n activeKey={activeTabs[GuardScenes.Register]}\n onTabClick={onTabClick}\n tabs={tabs}\n ></AuthingTabs>\n )\n}\n","import React from 'react'\n\nimport { useGuardContext } from '../../../context/global/context'\nimport { ResetPasswordForm } from '../../../components/AuthingGuard/Forms'\n\nexport const ResetPwdLayout = () => {\n const {\n state: { guardEvents, authClient },\n } = useGuardContext()\n\n const onFail = (error: any) => {\n guardEvents.onPwdResetError?.(error, authClient)\n }\n\n const onSuccess = () => {\n guardEvents.onPwdReset?.(authClient)\n }\n\n return <ResetPasswordForm onFail={onFail} onSuccess={onSuccess} />\n}\n","import { Protocol } from '../../../components/AuthingGuard/types'\nimport { SocialConnectionProvider } from 'authing-js-sdk'\n\nexport interface OIDCConnectionConfig {\n issuerUrl: string\n authorizationEdpoint: string\n responseType: string\n mode: OIDCConnectionMode\n clientId: string\n clientSecret: string\n scopes: string\n redirectUri: string\n}\n\nexport interface IOAuthConnectionConfig {\n authEndPoint: string\n tokenEndPoint: string\n scope: string\n clientId: string\n clientSecret: string\n authUrlTemplate: string\n codeToTokenScript: string\n tokenToUserInfoScript: string\n tokenToUserInfoScriptFuncId: string\n codeToTokenScriptFuncId: string\n authUrl?: string // 根据模板拼接出来的授权 url\n}\n\nexport interface IAzureAdConnectionConfig {\n microsoftAzureAdDomain: string\n clientId: string\n syncUserProfileOnLogin: string\n emailVerifiedDefault: boolean\n authorizationUrl: string\n callbackUrl: string\n}\n\nexport enum OIDCConnectionMode {\n FRONT_CHANNEL = 'FRONT_CHANNEL',\n BACK_CHANNEL = 'BACK_CHANNEL',\n}\n\nexport interface ISamlConnectionConfig {\n signInEndPoint: string\n samlRequest?: string\n\n // saml assertion 验签公钥\n\n samlIdpCert: string\n\n // saml request 验签公钥\n\n samlSpCert: string\n\n // saml request 签名私钥\n\n samlSpKey: string\n\n signOutEndPoint: string\n\n signSamlRequest: boolean\n\n signatureAlgorithm: string\n\n digestAlgorithm: string\n\n protocolBinding: string\n}\n\nexport interface ICasConnectionConfig {\n casConnectionLoginUrl: string\n}\nexport interface SocialConnectionItem {\n name: string\n logo: string\n description: string\n provider: SocialConnectionProvider\n authorizationUrl: string\n}\n\nexport interface EnterpriseConnectionItem {\n id: string\n createdAt: Date\n updatedAt: Date\n userPoolId: string\n protocol: Protocol\n identifier: string\n displayName: string\n logo: string\n enabled: boolean\n config:\n | OIDCConnectionConfig\n | ISamlConnectionConfig\n | ICasConnectionConfig\n | IAzureAdConnectionConfig\n | IOAuthConnectionConfig\n}\n\nexport interface UserPoolConfig {\n name: string\n logo: string\n socialConnections: SocialConnectionItem[]\n enterpriseConnections: EnterpriseConnectionItem[]\n}\n\n// export const fetchUserPoolConfig = (userPoolId: string) =>\n// requestClient.get<UserPoolConfig>(\n// `/api/v2/userpools/${userPoolId}/public-config`\n// )\n","import { PlusOutlined } from '@ant-design/icons'\nimport { message, Spin, Upload } from 'antd'\nimport { UploadChangeParam } from 'antd/lib/upload'\nimport React, { FC, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useGuardContext } from '../../../../context/global/context'\n\nexport const UploadImage: FC<{\n value?: string\n onChange?: (value: string) => void\n}> = ({ value, onChange }) => {\n const [uploading, setUploading] = useState(false)\n const { t } = useTranslation()\n const {\n state: {\n config: { apiHost },\n },\n } = useGuardContext()\n\n const onStatusChange = (info: UploadChangeParam) => {\n const { status } = info.file\n\n if (status === 'uploading') {\n setUploading(true)\n } else {\n setUploading(false)\n }\n\n if (status === 'done') {\n const { code, message: errMsg, data } = info.file.response\n if (code !== 200) {\n return message.error(errMsg)\n }\n const { url } = data\n onChange?.(url)\n } else if (status === 'error') {\n message.error(\n t('common.uploadFail', {\n name: info.file.name,\n })\n )\n }\n }\n\n const uploadButton = (\n <div>\n <PlusOutlined />\n <div style={{ marginTop: 8 }}>Upload</div>\n </div>\n )\n\n return (\n <Upload\n name=\"file\"\n accept=\"image/*\"\n listType=\"picture-card\"\n showUploadList={false}\n action={`${apiHost}/api/v2/upload?folder=photos`}\n onChange={onStatusChange}\n >\n <Spin size=\"small\" spinning={uploading}>\n {value ? (\n <img src={value} alt=\"\" style={{ width: '100%' }} />\n ) : (\n uploadButton\n )}\n </Spin>\n </Upload>\n )\n}\n","import { Button, Form, Input, message, Spin } from 'antd'\nimport { useForm } from 'antd/lib/form/Form'\nimport React, { FC, useEffect, useState } from 'react'\nimport { useGuardContext } from '../../../../context/global/context'\nimport { User } from 'authing-js-sdk'\nimport { UploadImage } from '../UploadImage'\nimport { requestClient } from '../../api/http'\nimport { CompleteUserInfoFormProps } from '../../types'\nimport { useTranslation } from 'react-i18next'\n\nexport const CompleteUserInfoForm: FC<CompleteUserInfoFormProps> = ({\n onSuccess,\n}) => {\n const { t } = useTranslation()\n const [rawForm] = useForm()\n const [submitting, setSubmitting] = useState(false)\n\n const [loading, setLoading] = useState(false)\n\n const {\n state: { config, authClient, guardEvents, userPoolId },\n } = useGuardContext()\n\n const { extendsFields } = config\n\n const [user, setUser] = useState<User | null>()\n const [definitions, setDefinitions] = useState<any[]>([])\n\n const onFinish = async (values: any) => {\n const internalFields: any = {}\n const userFields: any[] = []\n Object.entries(values).forEach(([key, value]) => {\n const [type, nameOrId] = key.split(' ')\n if (type === 'internal') {\n internalFields[nameOrId] = value\n } else if (type === 'user') {\n userFields.push({ nameOrId, value })\n }\n })\n\n const udfs = userFields.map(({ nameOrId, value }) => ({\n definition: definitions.find((def) => def.id === nameOrId),\n value,\n }))\n\n try {\n const user = await authClient.updateProfile(internalFields)\n\n setUser(user)\n\n await requestClient.post(\n `/api/v2/udfs/values`,\n {\n udfs,\n },\n {\n headers: {\n authorization: user?.token,\n 'x-authing-userpool-id': userPoolId,\n },\n }\n )\n\n message.success(t('common.saveSuccess'))\n guardEvents.onRegisterInfoCompleted?.(user, udfs, authClient)\n onSuccess?.(user)\n } catch (e) {\n guardEvents.onRegisterInfoCompletedError?.(e, udfs, authClient)\n setSubmitting(false)\n } finally {\n setSubmitting(false)\n }\n }\n\n useEffect(() => {\n setLoading(true)\n ;(async () => {\n const user = await authClient.getCurrentUser()\n setUser(user)\n const { data } = await requestClient.get<any>(\n '/api/v2/udfs/definitions',\n undefined,\n {\n headers: {\n authorization: user?.token!,\n 'x-authing-userpool-id': userPoolId,\n },\n }\n )\n setDefinitions(data)\n setLoading(false)\n })()\n }, [authClient, userPoolId])\n\n const onFinishFailed = () => {}\n\n const INPUT_MAP: Record<string, React.ReactNode | undefined> = {\n image: <UploadImage />,\n }\n\n const formFields = extendsFields.map((def) => {\n const key = `${def.type} ${def.type === 'internal' ? def.name : def.id}`\n\n return user && (user as any)[def.name] && def.type === 'internal' ? (\n <Form.Item key={key} label={def.label} style={{ marginBottom: 8 }}>\n <Input\n type=\"text\"\n value={(user as any)[def.name]}\n readOnly\n size=\"large\"\n />\n </Form.Item>\n ) : (\n <Form.Item\n key={key}\n name={key}\n label={def.label}\n style={{ marginBottom: 8 }}\n >\n {INPUT_MAP[def.inputType] || (\n <Input type={def.inputType} size=\"large\" />\n )}\n </Form.Item>\n )\n })\n\n return (\n <Spin spinning={loading}>\n <Form\n layout=\"vertical\"\n form={rawForm}\n onSubmitCapture={() => setSubmitting(true)}\n onFinishFailed={onFinishFailed}\n onFinish={onFinish}\n >\n {formFields}\n\n <Button\n size=\"large\"\n loading={submitting}\n type=\"primary\"\n block\n htmlType=\"submit\"\n >\n {t('common.problem.form.submit')}\n </Button>\n </Form>\n </Spin>\n )\n}\n","import React, { FC } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useGuardContext } from '../../../context/global/context'\nimport { CompleteUserInfoForm } from '../Forms/CompleteUserInfoForm'\n\nimport './style.less'\n\nexport const CompleteUserInfoLayout: FC = () => {\n const {\n state: { guardTitle },\n } = useGuardContext()\n\n const { t } = useTranslation()\n return (\n <div>\n <h2 className=\"authing-guard-complete-info-title\">\n {t('common.perfectUserInfo')}\n </h2>\n\n <p className=\"authing-guard-complete-info-msg\">\n {t('common.welcomeDoc', {\n name: guardTitle,\n })}\n </p>\n\n <CompleteUserInfoForm />\n </div>\n )\n}\n","import { DownOutlined } from '@ant-design/icons'\nimport React, { FC, useState } from 'react'\nimport { getClassnames } from '../../utils'\n\nimport './style.less'\n\n/**\n * 不使用 antd 的 dropdown,因为里面会用 tooltip,体积过大\n */\nexport const AuthingDropdown: FC<{\n className?: string\n menus: {\n label: React.ReactNode\n key: string | number\n onClick?: (\n key: string | number,\n evt: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void\n }[]\n}> = ({ menus, children, className }) => {\n const [visible, setVisible] = useState(false)\n\n return (\n <div\n className={getClassnames(['authing-dropdown', className])}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n <div className=\"authing-dropdown-trigger\">{children}</div>\n <div\n className={getClassnames([\n 'authing-dropdown-menu-container',\n visible && 'authing-dropdown-menu-container__visible',\n ])}\n >\n {menus.map((item) => (\n <div\n className=\"authing-dropdown-menu-item\"\n onClick={(evt) => {\n setVisible(false)\n item.onClick?.(item.key, evt)\n }}\n key={item.key}\n >\n {item.label}\n </div>\n ))}\n </div>\n <DownOutlined className=\"authing-dropdown-icon\" />\n </div>\n )\n}\n","import { message } from 'antd'\nimport { User } from 'authing-js-sdk'\nimport React, { FC, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { AuthingDropdown } from 'src/common/AuthingDropdown'\n\nimport {\n EmailMfaVerifyForm,\n SmsMfaVerifyForm,\n} from '../../../components/AuthingGuard/Forms'\nimport { useGuardContext } from '../../../context/global/context'\nimport { ApplicationMfaType, ApplicationMfaTypeLabel } from '../api'\n\nimport './style.less'\n\nexport interface MfaLayoutProps {}\n\nexport const AppMfaLayout: FC<MfaLayoutProps> = () => {\n const { t } = useTranslation()\n const {\n state: { guardEvents, authClient, mfaData },\n } = useGuardContext()\n\n const [type, setType] = useState(ApplicationMfaType.SMS)\n\n const onSuccess = (user: User) => {\n message.success(t('common.LoginSuccess'))\n guardEvents.onLogin?.(user, authClient)\n }\n\n const onFail = (error: any) => {\n guardEvents.onLoginError?.(error, authClient)\n }\n\n const formProps = {\n onSuccess,\n onFail,\n }\n\n const formMap = {\n [ApplicationMfaType.EMAIL]: <EmailMfaVerifyForm {...formProps} />,\n [ApplicationMfaType.SMS]: <SmsMfaVerifyForm {...formProps} />,\n }\n\n const availableMfaType = mfaData.applicationMfa\n ?.filter(\n (item) =>\n item.status && Object.keys(ApplicationMfaType).includes(item.mfaPolicy)\n )\n ?.sort((a, b) => a.sort - b.sort)\n ?.map((item) => ({\n label: ApplicationMfaTypeLabel()[item.mfaPolicy],\n key: item.mfaPolicy,\n onClick() {\n setType(item.mfaPolicy)\n },\n }))\n\n return (\n <div className=\"authing-text-center\">\n {formMap[type]}\n {(availableMfaType?.length || 0 > 1) && (\n <AuthingDropdown\n className=\"toggle-mfa-dropdown\"\n menus={availableMfaType!}\n >\n <span className=\"authing-toggle-mfa\">\n {t('login.otherVerifyWay')}\n </span>\n </AuthingDropdown>\n )}\n </div>\n )\n}\n","import React, { FC } from 'react'\nimport { Dropdown, Menu, Space } from 'antd'\nimport { LANG_MAP } from '../types'\nimport { useTranslation } from 'react-i18next'\nimport { changeLang } from '../locales'\n\nexport const ToggleLang: FC = () => {\n const onClick = ({ key }: any) => {\n changeLang(key)\n }\n const { i18n } = useTranslation()\n\n return (\n <Dropdown\n className=\"authing-toggle-language\"\n overlay={\n <Menu onClick={onClick}>\n {LANG_MAP.map((item) => (\n <Menu.Item key={item.value}>{item.label}</Menu.Item>\n ))}\n </Menu>\n }\n >\n <Space\n size={6}\n style={{\n alignSelf: 'center',\n color: '#999',\n marginTop: 24,\n cursor: 'pointer',\n }}\n >\n {\n LANG_MAP.find((item) => item.value === (i18n.language || 'zh-CN'))\n ?.label\n }\n </Space>\n </Dropdown>\n )\n}\n","import { message, Spin } from 'antd'\nimport React, { FC, useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { getClassnames, insertStyles, deepMerge } from '../../../utils'\nimport { useGuardContext } from '../../../context/global/context'\nimport { GuardHeader } from '../../../components/AuthingGuard/Header'\nimport { MfaLayout } from '../../../components/AuthingGuard/MfaLayout'\nimport { LoginLayout } from '../../../components/AuthingGuard/LoginLayout'\nimport {\n defaultGuardConfig,\n HIDE_SOCIALS,\n} from '../../../components/AuthingGuard/constants'\nimport { RegisterLayout } from '../../../components/AuthingGuard/RegisterLayout'\nimport { ResetPwdLayout } from '../../../components/AuthingGuard/ResetPwdLayout'\nimport {\n SessionData,\n trackSession,\n fetchAppConfig,\n ApplicationConfig,\n SocialConnectionItem,\n} from '../../../components/AuthingGuard/api'\nimport {\n GuardMode,\n GuardScenes,\n GuardConfig,\n UserConfig,\n} from '../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { CompleteUserInfoLayout } from '../CompleteUserInfoLayout'\nimport { AppMfaLayout } from '../AppMFALayout'\nimport { IconFont } from '../IconFont'\nimport { ToggleLang } from '../ToggleLang'\nimport { useTranslation } from 'react-i18next'\nimport i18n from 'i18next'\n\nconst checkConfig = (appId: string, config: UserConfig) => {\n // 不要去掉 console.warn,不然 vue 版打包出来每次都会 throw error,估计是 rollup 打包有问题\n if (!appId) {\n console.warn('APP ID: ', appId)\n throw new Error(i18n.t('common.unAppId'))\n }\n}\n\nconst useGuardConfig = () => {\n const {\n state: { appId, userConfig },\n setValue,\n } = useGuardContext()\n\n const [loading, setLoading] = useState(true)\n\n const [appConfig, setAppConfig] = useState<Partial<ApplicationConfig>>({})\n const [errorMsg, setErrorMsg] = useState('')\n const [errorDetail, setErrorDetail] = useState<any>()\n\n useEffect(() => {\n try {\n checkConfig(appId, userConfig)\n\n setErrorDetail(null)\n setErrorMsg('')\n } catch (e: any) {\n setErrorDetail(e)\n setErrorMsg(e.message)\n console.error(e)\n }\n }, [appId, userConfig])\n\n // 获取应用配置\n useEffect(() => {\n setLoading(true)\n\n if (!appId) {\n setLoading(false)\n return\n }\n fetchAppConfig(appId)\n .then((res) => {\n if (res.code !== 200) {\n setErrorMsg(res.message!)\n setErrorDetail(res)\n return\n }\n\n setAppConfig(res.data!)\n setValue('userPoolId', res.data?.userPoolId)\n })\n .catch((e: any) => {\n setErrorDetail(e)\n setErrorMsg(JSON.stringify(e))\n })\n .finally(() => {\n setLoading(false)\n })\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [appId])\n\n useEffect(() => {\n insertStyles(appConfig?.css)\n insertStyles(userConfig.contentCss)\n }, [appConfig, userConfig])\n\n const guardConfig = useMemo<GuardConfig>(() => {\n /**\n * 将用应用配置与用户手动传入的配置合并\n * 优先级:用户传入 > 应用 > 用户池\n */\n\n // 社会化登录\n let socialConnectionObjs: SocialConnectionItem[] | undefined\n // 默认展示所有社会化登录\n if (!userConfig.socialConnections) {\n socialConnectionObjs = [...(appConfig.socialConnections || [])]\n } else {\n const socials = userConfig.socialConnections\n socialConnectionObjs = appConfig.socialConnections?.filter?.((item) =>\n socials.includes(item.provider)\n )\n }\n\n // 某些社会化登录会在 tabs 中显示,或者无法在 Guard 中使用,所以底部不显示了\n socialConnectionObjs = socialConnectionObjs?.filter(\n (item) => !HIDE_SOCIALS.includes(item.provider)\n )\n\n // 企业身份源\n let enterpriseConnectionObjs: ApplicationConfig['identityProviders']\n\n if (userConfig.enterpriseConnections) {\n enterpriseConnectionObjs =\n appConfig.identityProviders?.filter?.((item) =>\n userConfig.enterpriseConnections!.includes(item.identifier)\n ) || []\n } else {\n enterpriseConnectionObjs = appConfig.identityProviders || []\n }\n\n // 登录方式\n const loginMethods =\n userConfig.loginMethods ||\n appConfig.loginTabs?.list ||\n defaultGuardConfig.loginMethods\n // 默认登录方式\n const defaultLoginMethod =\n userConfig.defaultLoginMethod ||\n appConfig.loginTabs?.default ||\n defaultGuardConfig.defaultLoginMethod\n\n // 注册方式\n const registerMethods =\n userConfig.registerMethods ||\n appConfig.registerTabs?.list ||\n defaultGuardConfig.registerMethods\n // 默认注册方式\n const defaultRegisterMethod =\n userConfig.defaultRegisterMethod ||\n appConfig.registerTabs?.default ||\n defaultGuardConfig.defaultRegisterMethod\n\n // 应用名\n const title = loading\n ? ''\n : userConfig.title ?? appConfig.name ?? defaultGuardConfig.title\n\n // 应用 logo\n const logo = loading\n ? ''\n : userConfig.logo ?? appConfig.logo ?? defaultGuardConfig.logo\n\n // 是否自动注册\n const autoRegister =\n userConfig.autoRegister ??\n appConfig.ssoPageComponentDisplay?.autoRegisterThenLoginHintInfo ??\n defaultGuardConfig.autoRegister\n\n // 禁止注册\n const disableRegister =\n userConfig.disableRegister ??\n !(\n appConfig.ssoPageComponentDisplay?.registerBtn ??\n !defaultGuardConfig.disableRegister\n )\n\n // 禁止重置密码\n const disableResetPwd =\n userConfig.disableResetPwd ??\n !(\n appConfig.ssoPageComponentDisplay?.registerBtn ??\n !defaultGuardConfig.disableResetPwd\n )\n\n return deepMerge<GuardConfig>(\n {} as GuardConfig,\n defaultGuardConfig,\n userConfig,\n {\n logo,\n title,\n autoRegister,\n loginMethods,\n extendsFields: appConfig.extendsFields,\n disableRegister,\n disableResetPwd,\n registerMethods,\n defaultLoginMethod,\n socialConnectionObjs,\n defaultRegisterMethod,\n enterpriseConnectionObjs,\n }\n )\n }, [\n userConfig,\n appConfig.loginTabs?.list,\n appConfig.loginTabs?.default,\n appConfig.registerTabs?.list,\n appConfig.registerTabs?.default,\n appConfig.name,\n appConfig.logo,\n appConfig.ssoPageComponentDisplay?.autoRegisterThenLoginHintInfo,\n appConfig.ssoPageComponentDisplay?.registerBtn,\n appConfig.extendsFields,\n appConfig.socialConnections,\n appConfig.identityProviders,\n loading,\n ])\n\n return {\n loading,\n errorMsg,\n guardConfig,\n errorDetail,\n }\n}\n\nconst useModal = (visible?: boolean) => {\n const {\n state: { userConfig },\n } = useGuardContext()\n\n const isModal = userConfig.mode === GuardMode.Modal\n // 传入了 visible 则为受控组件\n const isControlled = typeof visible !== 'undefined'\n\n // modal 模式,没传 visible,默认为 true\n const [localVisible, setLocalVisible] = useState(\n isModal && isControlled ? visible : true\n )\n\n const toggleLocalVisible = () => {\n setLocalVisible((v) => !v)\n }\n\n const realVisible = useMemo(() => {\n return isControlled ? visible : localVisible\n }, [isControlled, localVisible, visible])\n\n return {\n isModal,\n realVisible,\n isControlled,\n toggleLocalVisible,\n }\n}\n\nexport const GuardLayout: FC<{\n visible?: boolean\n className?: string\n id?: string\n style?: React.CSSProperties\n}> = ({ visible, id, className, style }) => {\n const { t } = useTranslation()\n const {\n state: { guardScenes, authClient, guardEvents, activeTabs, localesConfig },\n setValue,\n } = useGuardContext()\n\n const { realVisible, isControlled, toggleLocalVisible } = useModal(visible)\n\n const { loading, errorMsg, guardConfig, errorDetail } = useGuardConfig()\n\n useEffect(() => {\n if (!loading) {\n guardEvents.onLoginTabChange?.(activeTabs.login)\n }\n }, [activeTabs.login, loading, guardEvents])\n useEffect(() => {\n if (!loading) {\n guardEvents.onRegisterTabChange?.(activeTabs.register)\n }\n }, [activeTabs.register, loading, guardEvents])\n\n // 动画完成后完全隐藏 dom\n const [hidden, setHidden] = useState(false)\n useEffect(() => {\n setHidden(false)\n }, [realVisible])\n\n const closeHandler = useCallback(() => {\n if (!isControlled && realVisible) {\n toggleLocalVisible()\n }\n guardEvents.onClose?.()\n }, [isControlled, guardEvents, toggleLocalVisible, realVisible])\n\n useEffect(() => {\n if (loading) {\n return\n }\n if (errorDetail) {\n guardEvents.onLoadError?.(errorDetail)\n return\n }\n\n guardEvents.onLoad?.(authClient)\n\n if (guardConfig.isSSO) {\n trackSession().then((sessionData) => {\n // 这个接口没有 code, data, 直接返回了数据\n let typedData = (sessionData as unknown) as SessionData\n if (typedData.userInfo) {\n message.success(t('common.LoginSuccess'))\n guardEvents.onLogin?.(typedData.userInfo, authClient)\n }\n })\n }\n }, [authClient, errorDetail, guardEvents, loading, guardConfig, t])\n\n useEffect(() => {\n setValue('config', guardConfig)\n setValue('activeTabs', {\n [GuardScenes.Login]: guardConfig.defaultLoginMethod,\n [GuardScenes.Register]: guardConfig.defaultRegisterMethod,\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [guardConfig])\n\n const isModal = useMemo(() => guardConfig.mode === GuardMode.Modal, [\n guardConfig,\n ])\n\n // 监听 esc 关闭 modal\n useEffect(() => {\n const handler = (evt: KeyboardEvent) => {\n if (evt.keyCode === 27 && isModal && guardConfig.escCloseable) {\n closeHandler()\n }\n }\n\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [closeHandler, guardConfig, isModal])\n\n const layoutMap = {\n [GuardScenes.Login]: <LoginLayout />,\n [GuardScenes.Register]: <RegisterLayout />,\n [GuardScenes.RestPassword]: <ResetPwdLayout />,\n [GuardScenes.MfaVerify]: <MfaLayout />,\n [GuardScenes.CompleteUserInfo]: <CompleteUserInfoLayout />,\n [GuardScenes.AppMfaVerify]: <AppMfaLayout />,\n }\n\n return (\n <div\n id={id}\n style={{\n ...style,\n zIndex: guardConfig.zIndex || 100,\n }}\n className={getClassnames([\n 'authing-guard-layout',\n !realVisible && 'authing-guard-layout__hidden',\n isModal && 'authing-guard-layout__modal',\n hidden && 'authing-guard-layout__dis-none',\n className,\n ])}\n onTransitionEnd={() => {\n if (!realVisible) {\n setHidden(true)\n }\n }}\n >\n <>\n {isModal && (\n <div\n className={getClassnames([\n 'authing-guard-mask',\n !realVisible && 'authing-guard-mask__hidden',\n ])}\n ></div>\n )}\n <div\n className={getClassnames([\n 'authing-guard-container',\n !realVisible && 'authing-guard-container__hidden',\n ])}\n >\n {isModal && guardConfig.clickCloseable && (\n <button onClick={closeHandler} className=\"authing-guard-close-btn\">\n <IconFont type=\"authing-guanbi\" />\n </button>\n )}\n\n <GuardHeader />\n\n {loading ? (\n <Spin size=\"large\" className=\"authing-guard-loading\" />\n ) : errorMsg ? (\n <div className=\"authing-guard-load-error\">{errorMsg}</div>\n ) : (\n layoutMap[guardScenes]\n )}\n <div>{localesConfig?.isShowChange && <ToggleLang />}</div>\n </div>\n </>\n </div>\n )\n}\n","import { User } from '../types'\nimport { requestClient } from './http'\n\nexport interface SessionData {\n session: null | {\n _id: string\n cookie: {\n originalMaxAge: number\n expires: Date\n secure: boolean\n httpOnly: boolean\n path: string\n sameSite: string\n }\n appId?: string\n type: string\n userId: string\n }\n userInfo?: User\n}\n\nexport const trackSession = () =>\n requestClient.get<SessionData>(\n `/cas/session`,\n {},\n {\n credentials: 'include',\n }\n )\n","import { ConfigProvider, message } from 'antd'\nimport React, { FC } from 'react'\nimport jsencrypt from 'jsencrypt'\nimport { AuthenticationClient } from 'authing-js-sdk'\n\nimport { GuardContext } from '../../context/global/context'\nimport { GuardScenes } from '../../components/AuthingGuard/types'\nimport { requestClient } from '../../components/AuthingGuard/api/http'\nimport {\n defaultGuardConfig,\n OTP_MFA_CODE,\n APP_MFA_CODE,\n defaultLocalesConfig,\n} from '../../components/AuthingGuard/constants'\nimport { GuardLayout } from '../../components/AuthingGuard/GuardLayout'\nimport {\n UserConfig,\n GuardEventsHandler,\n} from '../../components/AuthingGuard/types/GuardConfig'\n\nimport './style.less'\nimport { i18n, initI18n } from './locales'\nimport { getAuthClient } from './hooks'\nconst PREFIX_CLS = 'authing-ant'\n\nmessage.config({\n prefixCls: `${PREFIX_CLS}-message`,\n})\n\ninterface AuthingGuardProps extends GuardEventsHandler {\n appId: string\n config?: UserConfig\n visible?: boolean\n className?: string\n id?: string\n}\n\nexport const AuthingGuard: FC<AuthingGuardProps> = ({\n appId,\n config = {},\n visible,\n className,\n id,\n ...guardEvents\n}) => {\n const {\n apiHost,\n appDomain,\n appHost,\n defaultLoginMethod = defaultGuardConfig.defaultLoginMethod,\n defaultScenes = defaultGuardConfig.defaultScenes,\n defaultRegisterMethod = defaultGuardConfig.defaultRegisterMethod,\n lang,\n localesConfig = defaultLocalesConfig,\n } = config\n\n initI18n(localesConfig, lang)\n\n if (lang && i18n.changeLanguage && i18n.language !== lang) {\n i18n.changeLanguage(lang)\n const authClient = getAuthClient()\n authClient?.setLang(lang)\n }\n\n let realHost\n if (appHost) {\n realHost = appHost\n } else if (appDomain) {\n const parsedUrl = new URL(defaultGuardConfig.appHost!)\n realHost = `${parsedUrl.protocol}//${appDomain}${\n parsedUrl.port ? ':' + parsedUrl.port : ''\n }`\n } else {\n realHost = apiHost || defaultGuardConfig.appHost!\n }\n\n requestClient.setBaseUrl(realHost)\n\n const authClient = new AuthenticationClient({\n appHost: realHost!,\n appId,\n requestFrom: 'ui-components',\n encryptFunction: (text, publicKey) => {\n const encrypt = new jsencrypt() // 实例化加密对象\n encrypt.setPublicKey(publicKey) // 设置公钥\n return Promise.resolve(encrypt.encrypt(text)) // 加密明文\n },\n onError: (code, msg: any) => {\n if (code === 2020) {\n return\n }\n if ([OTP_MFA_CODE, APP_MFA_CODE].includes(code)) {\n message.info(msg)\n return\n }\n message.error(msg)\n },\n })\n\n const activeTabs = {\n [GuardScenes.Login]: defaultLoginMethod,\n [GuardScenes.Register]: defaultRegisterMethod,\n }\n\n return (\n <ConfigProvider prefixCls={PREFIX_CLS}>\n <GuardContext\n value={{\n authClient,\n config: { ...config },\n userConfig: config,\n appId,\n guardScenes: defaultScenes,\n activeTabs,\n guardTitle: config.title,\n mfaData: {\n mfaToken: '',\n },\n guardEvents,\n localesConfig: config.localesConfig,\n }}\n >\n <GuardLayout id={id} className={className} visible={visible} />\n </GuardContext>\n </ConfigProvider>\n )\n}\n","import { AuthingGuard } from './AuthingGuard'\n\nexport * from './AuthingGuard/types'\nexport * from './AuthingGuard/hooks'\nexport type { AuthenticationClientOptions } from 'authing-js-sdk'\n\nexport { AuthingGuard }\n","import { LoginMethods, RegisterMethods } from './GuardConfig'\nimport { GuardScenes } from '../../../components/AuthingGuard/types/GuardConfig'\n\nexport interface ActiveTabs {\n [GuardScenes.Login]: LoginMethods\n [GuardScenes.Register]: RegisterMethods\n}\n","export type Lang = 'zh-CN' | 'en-US'\n\nexport const LANG_MAP = [\n {\n label: '中文',\n value: 'zh-CN',\n },\n {\n label: 'English',\n value: 'en-US',\n },\n]\n","import {\n GuardMode,\n UserConfig,\n GuardScenes,\n LoginMethods,\n RegisterMethods,\n LocalesConfig,\n} from '../../components/AuthingGuard/types'\nimport { i18n } from './locales'\n\n// 个人版 OTP MFA 的 error code\nexport const OTP_MFA_CODE = 1635\n// 企业版手机和短信验证吗 MFA 的 error code\nexport const APP_MFA_CODE = 1636\n\n// 需要验证吗\nexport const NEED_CAPTCHA = 2000\n\nexport const LOGIN_METHODS_MAP = () => ({\n [LoginMethods.Password]: i18n.t('login.pwdLogin'),\n [LoginMethods.PhoneCode]: i18n.t('login.verifyCodeLogin'),\n [LoginMethods.AppQr]: i18n.t('login.appScanLogin'),\n [LoginMethods.WxMinQr]: i18n.t('login.scanLogin'),\n [LoginMethods.LDAP]: i18n.t('login.ldapLogin'),\n [LoginMethods.AD]: i18n.t('login.adLogin'),\n})\n\nexport const REGISTER_METHODS_MAP = () => ({\n [RegisterMethods.Email]: i18n.t('login.emailRegister'),\n [RegisterMethods.Phone]: i18n.t('login.phoneRegister'),\n})\n\n// 某些社会化登录会在 tabs 中显示,或者无法在 Guard 中使用,所以底部不显示了\nexport const HIDE_SOCIALS = [\n 'wechat:miniprogram:app-launch',\n 'wechat:miniprogram:qrconnect',\n 'wechat:webpage-authorization',\n 'wechat:miniprogram:default',\n 'wechatwork:addressbook',\n 'wechat:mobile',\n]\n\n// 企业版 MFA 支持的方式\nexport enum ApplicationMfaType {\n SMS = 'SMS',\n EMAIL = 'EMAIL',\n // OTP = 'OTP',\n // FACE = 'FACE',\n // FINGERPRINT = 'FINGERPRINT',\n}\n\nexport const defaultGuardConfig: Partial<UserConfig> = {\n isSSO: false,\n title: 'Authing',\n text: {\n loginTabs: LOGIN_METHODS_MAP(),\n loginBtn: {\n normal: '登录',\n loading: '登录',\n },\n registerBtn: {\n normal: '注册',\n loading: '注册',\n },\n },\n escCloseable: true,\n autoRegister: false,\n clickCloseable: true,\n mode: GuardMode.Normal,\n disableRegister: false,\n disableResetPwd: false,\n defaultScenes: GuardScenes.Login,\n appHost: 'https://core.authing.cn',\n defaultLoginMethod: LoginMethods.Password,\n defaultRegisterMethod: RegisterMethods.Email,\n loginMethods: [LoginMethods.Password, LoginMethods.PhoneCode],\n registerMethods: [RegisterMethods.Email, RegisterMethods.Phone],\n logo:\n 'https://files.authing.co/user-contents/photos/0a4c99ff-b8ce-4030-aaaf-584c807cb21c.png',\n}\n\nexport const defaultLocalesConfig: LocalesConfig = {\n defaultLang: 'zh-CN',\n isShowChange: false,\n}\n","import i18n from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport LanguageDetector from 'i18next-browser-languagedetector'\n\nimport * as enUsTrans from './en'\nimport * as zhCnTrans from './zh'\nimport { LocalesConfig, Lang } from '../types'\nimport { getAuthClient } from 'src/components'\n\nlet langChangeFN: (lang: Lang) => void = () => {}\n\nexport const changeLang = (lang: Lang) => {\n i18n.changeLanguage(lang)\n langChangeFN && langChangeFN(lang)\n const authClient = getAuthClient()\n\n authClient?.setLang(lang)\n}\n\nconst initI18n = (localesConfig: LocalesConfig, lang?: Lang) => {\n if (!i18n.language) {\n i18n\n .use(LanguageDetector) // 监测当前浏览器语言\n .use(initReactI18next) // 初始化 i18n\n .init({\n detection: {\n order: [],\n },\n resources: {\n 'en-US': {\n translation: enUsTrans,\n },\n 'zh-CN': {\n translation: zhCnTrans,\n },\n },\n fallbackLng: localesConfig.defaultLang || lang || 'zh-CN',\n debug: false,\n interpolation: {\n escapeValue: false, // react already safes from xss\n },\n })\n if (localesConfig.onChange) {\n langChangeFN = localesConfig.onChange\n }\n }\n}\n\nexport { i18n, initI18n }\n","/** eslint-disable */\n!function(c){var a,t,l,e,i,o,h='<svg><symbol id=\"authing-lark-public\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 10.24l-251.392 271.872c-1.536 2.048-2.56 4.608-2.048 7.168 5.632 26.624-11.776 52.736-37.888 58.368-16.384 3.584-33.792-2.048-45.568-13.824L486.4 534.016l19.968 264.704 225.28 225.28L1024 10.24z\" fill=\"#CBCBCB\" ></path><path d=\"M1021.44 16.896l-248.832 268.8c-1.536 2.048-2.56 4.608-2.048 7.168 5.632 26.112-10.752 52.224-36.864 57.856-16.896 3.584-34.304-1.536-46.08-14.336l-197.12 197.12c-1.024 1.024-1.024 2.048-1.024 3.072l19.456 260.096 501.76-757.248 10.752-22.528z\" fill=\"#BABABA\" ></path><path d=\"M1013.76 0l-271.872 251.392c-2.048 2.048-4.608 2.56-7.168 2.048-26.624-5.632-52.736 11.776-58.368 38.4-3.584 16.384 2.048 33.792 13.824 45.568l-200.704 200.704-264.192-19.968-225.28-225.28L1013.76 0z\" fill=\"#DDDDDD\" ></path><path d=\"M1007.104 3.072l-269.312 248.832c-2.048 1.536-4.608 2.56-7.168 2.048-26.112-5.632-52.224 10.752-57.856 36.864-3.584 16.896 1.536 34.304 14.336 46.08l-197.12 197.12c-1.024 1.024-2.048 1.024-3.072 1.024l-260.096-19.456 757.248-501.76 23.04-10.752z\" fill=\"#D0D0D0\" ></path></symbol><symbol id=\"authing-lark-internal\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 10.24l-251.392 271.872c-1.536 2.048-2.56 4.608-2.048 7.168 5.632 26.624-11.776 52.736-37.888 58.368-16.384 3.584-33.792-2.048-45.568-13.824L486.4 534.016l19.968 264.704 225.28 225.28L1024 10.24z\" fill=\"#CBCBCB\" ></path><path d=\"M1021.44 16.896l-248.832 268.8c-1.536 2.048-2.56 4.608-2.048 7.168 5.632 26.112-10.752 52.224-36.864 57.856-16.896 3.584-34.304-1.536-46.08-14.336l-197.12 197.12c-1.024 1.024-1.024 2.048-1.024 3.072l19.456 260.096 501.76-757.248 10.752-22.528z\" fill=\"#BABABA\" ></path><path d=\"M1013.76 0l-271.872 251.392c-2.048 2.048-4.608 2.56-7.168 2.048-26.624-5.632-52.736 11.776-58.368 38.4-3.584 16.384 2.048 33.792 13.824 45.568l-200.704 200.704-264.192-19.968-225.28-225.28L1013.76 0z\" fill=\"#DDDDDD\" ></path><path d=\"M1007.104 3.072l-269.312 248.832c-2.048 1.536-4.608 2.56-7.168 2.048-26.112-5.632-52.224 10.752-57.856 36.864-3.584 16.896 1.536 34.304 14.336 46.08l-197.12 197.12c-1.024 1.024-2.048 1.024-3.072 1.024l-260.096-19.456 757.248-501.76 23.04-10.752z\" fill=\"#D0D0D0\" ></path></symbol><symbol id=\"authing-guanbi7-01copy_1\" viewBox=\"0 0 1024 1024\"><path d=\"M0.00007 512.306485a511.999485 511.999485 0 0 1 1023.99797-0.512v0.512a510.974486 510.974486 0 0 1-511.999485 511.691485C228.86384 1023.99797 0.00007 794.725201 0.00007 512.306485z m546.200451 0l178.89282-178.78982a23.244977 23.244977 0 0 0 0-33.075967l-1.126999-1.023999a23.244977 23.244977 0 0 0-33.176967 0L511.999555 478.514519l-178.78982-179.19982a23.244977 23.244977 0 0 0-33.177967 0l-1.023999 1.023999a23.244977 23.244977 0 0 0 0 33.074967l178.78982 179.199819-178.89282 178.789821a23.244977 23.244977 0 0 0 0 33.177966l1.126999 1.023999a23.244977 23.244977 0 0 0 33.176967 0L511.999555 547.12245 690.789375 725.80927a23.244977 23.244977 0 0 0 33.177967 0l1.023999-1.023999a23.244977 23.244977 0 0 0 0-33.176967l-178.78982-179.199819z\" ></path></symbol><symbol id=\"authing-guanbi\" viewBox=\"0 0 1024 1024\"><path d=\"M583.168 523.776L958.464 148.48c18.944-18.944 18.944-50.176 0-69.12l-2.048-2.048c-18.944-18.944-50.176-18.944-69.12 0L512 453.12 136.704 77.312c-18.944-18.944-50.176-18.944-69.12 0l-2.048 2.048c-19.456 18.944-19.456 50.176 0 69.12l375.296 375.296L65.536 899.072c-18.944 18.944-18.944 50.176 0 69.12l2.048 2.048c18.944 18.944 50.176 18.944 69.12 0L512 594.944 887.296 970.24c18.944 18.944 50.176 18.944 69.12 0l2.048-2.048c18.944-18.944 18.944-50.176 0-69.12L583.168 523.776z\" ></path></symbol><symbol id=\"authing-apple-web\" viewBox=\"0 0 1024 1024\"><path d=\"M797.3 656c24.6 34.8 52.8 57.3 84.6 67.5-13.8 42.6-35.7 87-65.7 133.2-46.2 69.6-91.8 104.4-136.8 104.4-16.8 0-41.7-5.7-74.7-17.1-30.6-11.4-57.3-17.1-80.1-17.1-22.8 0-48 6-75.6 18-28.8 11.4-52.5 17.1-71.1 17.1-54 0-107.1-45.9-159.3-137.7-52.2-90.6-78.3-179.7-78.3-267.3 0-81 19.8-147.3 59.4-198.9 40.8-51.6 91.2-77.4 151.2-77.4 13.2 0 27.9 1.65 44.1 4.95 16.2 3.3 33 9.45 50.4 18.45 18.6 10.2 33.9 17.25 45.9 21.15 12 3.9 21.3 5.85 27.9 5.85 7.8 0 19.8-1.8 36-5.4a166.088 166.088 0 0 0 48.6-19.8 366.113 366.113 0 0 1 45-21.6c12.6-4.8 25.5-7.2 38.7-7.2 42 0 79.8 11.4 113.4 34.2 18 12 36.3 29.7 54.9 53.1-27.6 24-47.7 45-60.3 63-23.4 33.6-35.1 70.2-35.1 109.8 0 43.8 12.3 83.4 36.9 118.8zM616.4 235.7c-21 19.8-40.2 32.7-57.6 38.7-6 1.8-13.65 3.45-22.95 4.95-9.3 1.5-19.95 2.85-31.95 4.05 0.6-52.8 14.4-98.4 41.4-136.8 27-38.4 71.4-64.8 133.2-79.2 1.2 6 2.1 10.2 2.7 12.6v9.9c0 21.6-5.1 45.9-15.3 72.9a221.625 221.625 0 0 1-49.5 72.9z\" ></path></symbol><symbol id=\"authing-google\" viewBox=\"0 0 1024 1024\"><path d=\"M1000 523.6c0 283-193.8 484.4-480 484.4-274.4 0-496-221.6-496-496S245.6 16 520 16c133.6 0 246 49 332.6 129.8l-135 129.8c-176.6-170.4-505-42.4-505 236.4 0 173 138.2 313.2 307.4 313.2 196.4 0 270-140.8 281.6-213.8H520V440.8h472.2c4.6 25.4 7.8 49.8 7.8 82.8z\" ></path></symbol><symbol id=\"authing-dingtalk\" viewBox=\"0 0 1024 1024\"><path d=\"M905.857912 382.800144a192.415957 192.415957 0 0 1-12.101998 31.649993h0.186l-0.744 1.257c-35.140992 76.657983-126.881972 226.998949-126.881971 226.998949s-0.093-0.373-0.466-0.93l-26.856994 47.567989h129.301971L621.375975 1024l56.039988-227.649949H575.715986l35.326992-150.525966a1436.834677 1436.834677 0 0 0-102.397977 29.789993s-54.130988 32.393993-155.923965-62.137986c0 0-68.699985-61.672986-28.857994-77.079982 16.941996-6.560999 82.197982-14.892997 133.53597-21.967996 69.444984-9.494998 112.172975-14.614997 112.172975-14.614996s-214.106952 3.257999-264.83994-4.886999c-50.732989-8.099998-115.104974-94.484979-128.834972-170.353962 0 0-21.223995-41.702991 45.65999-21.968995 66.838985 19.734996 343.499923 76.799983 343.499923 76.799983S205.267069 266.95017 181.250074 239.487176c-23.922995-27.459994-70.374984-149.732966-64.324985-224.901949 0 0 2.606999-18.757996 21.457995-13.729997 0 0 266.00294 123.946972 447.852899 191.762957 181.896959 67.815985 340.009924 102.398977 319.622929 190.181957z\" ></path></symbol><symbol id=\"authing-apple\" viewBox=\"0 0 1024 1024\"><path d=\"M797.3 656c24.6 34.8 52.8 57.3 84.6 67.5-13.8 42.6-35.7 87-65.7 133.2-46.2 69.6-91.8 104.4-136.8 104.4-16.8 0-41.7-5.7-74.7-17.1-30.6-11.4-57.3-17.1-80.1-17.1-22.8 0-48 6-75.6 18-28.8 11.4-52.5 17.1-71.1 17.1-54 0-107.1-45.9-159.3-137.7-52.2-90.6-78.3-179.7-78.3-267.3 0-81 19.8-147.3 59.4-198.9 40.8-51.6 91.2-77.4 151.2-77.4 13.2 0 27.9 1.65 44.1 4.95 16.2 3.3 33 9.45 50.4 18.45 18.6 10.2 33.9 17.25 45.9 21.15 12 3.9 21.3 5.85 27.9 5.85 7.8 0 19.8-1.8 36-5.4a166.088 166.088 0 0 0 48.6-19.8 366.113 366.113 0 0 1 45-21.6c12.6-4.8 25.5-7.2 38.7-7.2 42 0 79.8 11.4 113.4 34.2 18 12 36.3 29.7 54.9 53.1-27.6 24-47.7 45-60.3 63-23.4 33.6-35.1 70.2-35.1 109.8 0 43.8 12.3 83.4 36.9 118.8zM616.4 235.7c-21 19.8-40.2 32.7-57.6 38.7-6 1.8-13.65 3.45-22.95 4.95-9.3 1.5-19.95 2.85-31.95 4.05 0.6-52.8 14.4-98.4 41.4-136.8 27-38.4 71.4-64.8 133.2-79.2 1.2 6 2.1 10.2 2.7 12.6v9.9c0 21.6-5.1 45.9-15.3 72.9a221.625 221.625 0 0 1-49.5 72.9z\" ></path></symbol><symbol id=\"authing-alipay-web\" viewBox=\"0 0 1024 1024\"><path d=\"M427.154 210.262l-1.819 59.431H185.792v45.481h242.573v78.84H228.24v43.057l203.153-1.823 203.76-1.818-3.641 14.553c-9.094 35.177-47.907 129.173-55.183 132.196-4.244 1.216-33.961-5.458-67.316-15.16-101.276-30.924-151.61-40.023-220.136-40.023-69.74 0.603-115.217 13.342-158.886 44.27-84.897 60.647-91.57 179.506-12.735 245.602 83.687 70.348 220.739 77.017 345.06 16.375 44.267-21.225 123.71-78.84 150.39-108.553l10.922-12.736 34.57 16.98c34.568 17.586 248.03 116.437 284.413 131.598l19.403 8.49V711.17l-52.762-13.95c-47.907-12.74-170.406-50.94-209.826-66.105l-15.16-6.066 20.012-41.238c21.231-42.444 63.68-162.522 63.68-180.108 0-8.491-12.128-9.702-106.128-9.702H555.71v-78.827h254.704v-40.022c0-1.817-57.614-3.032-127.353-2.425l-127.347 0.602V151.437H428.967l-1.813 58.825z m-23.657 395.392c31.535 10.922 73.382 27.896 92.786 38.206l35.167 18.805-19.404 24.255c-10.913 13.342-35.775 36.387-56.399 51.548-69.133 51.542-133.41 71.553-215.887 66.703-86.112-4.852-132.201-40.023-137.66-105.517-3.64-40.63 5.459-63.675 33.359-84.901 35.172-26.685 63.67-32.742 141.296-30.924 59.431 1.814 78.232 5.449 126.742 21.825z\" ></path></symbol><symbol id=\"authing-wechat-miniprogram-app-launch\" viewBox=\"0 0 1126 1024\"><path d=\"M961.876 262.606C900.851 134.702 747.238 80.676 619.77 141.425c-69.45 33.34-113.232 90.332-130.04 168.839-15.583 71.308-6.328 150.685 2.926 211.869 12.22 78.071 12.656 135.459 1.7 176.393-9.69 36.306-29.464 59.957-61.46 75.54a135.814 135.814 0 0 1-104.372 5.102 137.634 137.634 0 0 1-77.835-69.647 136.764 136.764 0 0 1 64.388-181.93c14.317-7.12 25.668-19.38 30.73-34.607 5.023-15.187 4.628-31.244-2.136-45.996a60.511 60.511 0 0 0-34.487-30.81 61.54 61.54 0 0 0-45.878 2.136 256.284 256.284 0 0 0-131.86 145.98 257.233 257.233 0 0 0 10.284 196.72 256.403 256.403 0 0 0 231.802 146.494 263.007 263.007 0 0 0 110.265-24.916c69.41-33.341 113.192-89.462 130.04-167.97 15.149-70.913 6.328-150.29-2.966-210.603-12.22-78.942-12.656-136.764-1.701-177.698 9.69-36.307 29.465-60.354 62.292-75.54a136.962 136.962 0 0 1 182.205 64.585 136.764 136.764 0 0 1-64.387 181.93 60.511 60.511 0 0 0-28.16 80.167c6.724 14.753 19.34 25.708 34.053 30.81 15.148 5.063 31.166 4.628 45.877-2.135 127.51-62.45 181.378-216.101 120.786-343.531z\" ></path></symbol><symbol id=\"authing-qq\" viewBox=\"0 0 1024 1024\"><path d=\"M821.295 699.385a275.463 275.463 0 0 1-57.3 90.76c54.54 16.634 41.202 45.496 41.202 45.496 24.223 13.299 22.69 99.729-111.381 98.195-89.38-0.996-127.248-26.062-142.695-42.735-11.498 1.15-23.035 1.802-34.61 1.84-14.296 0-28.286-1.073-42.084-2.645-14.91 16.634-52.586 42.544-143.308 43.54-133.879 1.534-135.412-84.895-111.15-98.195 0 0-14.642-31.046 47.142-47.335a272.511 272.511 0 0 1-58.794-98.311c-56.035 99.537-83.057 33.575-79.033-42.66 3.604-67.687 63.241-144.61 78.726-163.43a60.98 60.98 0 0 1-4.6-22.804c0-16.482 6.593-31.506 17.363-42.775a44.844 44.844 0 0 1 20.045-46.223c-0.076-2.414-0.306-4.753-0.306-7.206 0-151.394 123.569-274.235 275.96-274.235 152.469 0 275.961 122.802 275.961 274.235 0 4.6-0.268 9.122-0.498 13.645 10.425 10.617 14.947 25.68 11.998 40.283 10.616 11.192 17.36 25.871 17.36 42.276 0 8.125-1.723 15.829-4.598 22.997 15.56 19.163 74.816 96.01 78.38 163.698 3.91 74.164-21.31 138.67-73.78 51.589z\" ></path></symbol><symbol id=\"authing-wechat-mobile\" viewBox=\"0 0 1239 1024\"><path d=\"M745.256 511.245c-21.665 0-43.385 20.373-43.385 45.595 0 20.373 21.72 40.96 43.385 40.96 32.553 0 55.835-20.587 55.835-40.96 0-25.222-23.282-45.595-55.835-45.595M602.705 298.9c34.115 0 55.78-22.097 55.78-55.08 0-34.655-21.665-55.027-55.78-55.027-32.499 0-63.488 20.372-63.488 54.973 0 33.091 30.99 55.08 63.488 55.08M440.05 756.574c-57.344 0-99.167-9.431-153.439-25.169l-156.456 80.196 44.948-135.222C65.051 597.747 0 498.58 0 377.479 0 163.57 198.333 0 440.05 0c213.8 0 404.427 128.97 441.56 311.458a211.106 211.106 0 0 0-41.822-4.743c-210.729 0-373.383 160.498-373.383 353.927 0 33.037 4.635 62.895 12.396 94.37-12.396 1.616-26.409 1.616-38.804 1.616m646.198 154.14L1117.13 1024l-117.76-67.638c-44.894 9.378-88.28 23.606-133.228 23.606-207.656 0-371.873-144.761-371.873-324.07 0-179.253 164.217-323.96 371.873-323.96 196.77 0 373.437 144.707 373.437 323.907 0 100.783-66.614 190.356-153.384 254.922M295.882 188.793c-32.498 0-66.614 20.372-66.614 54.973 0 33.091 34.116 55.08 66.614 55.08 30.99 0 55.781-21.989 55.781-55.026 0-34.655-24.791-55.027-55.78-55.027m692.6 322.452c-23.228 0-43.385 20.373-43.385 45.595 0 20.373 20.157 40.96 43.385 40.96 30.99 0 54.272-20.587 54.272-40.96 0-25.222-23.282-45.595-54.272-45.595\" ></path></symbol><symbol id=\"authing-baidu\" viewBox=\"0 0 1024 1024\"><path d=\"M204.8 537.876c104.422-22.429 90.196-147.185 86.967-174.501-5.149-42.066-54.545-115.55-121.658-109.746-84.48 7.593-96.873 129.6-96.873 129.6C61.891 439.695 100.64 560.262 204.8 537.876zM315.636 754.75c-3.141 8.858-9.861 31.244-4.058 50.75 11.607 43.766 49.658 45.774 49.658 45.774h54.677V717.658H357.44c-26.27 7.855-39.01 28.407-41.847 37.091z m82.779-426.022c57.774 0 104.29-66.37 104.29-148.407C502.705 98.327 456.19 32 398.415 32c-57.47 0-104.16 66.37-104.16 148.32 0 82.036 46.69 148.364 104.29 148.364z m248.334 9.731c77.062 10.037 126.676-72.262 136.407-134.618 10.037-62.138-39.665-134.53-94.21-146.924-54.633-12.523-122.88 75.055-129.077 132.131-7.418 69.818 9.95 139.462 86.88 149.411zM835.564 704.83s-119.259-92.247-188.815-191.913c-94.254-147.01-228.349-87.185-273.164-12.48-44.64 74.75-114.196 122.095-124.014 134.531-10.036 12.393-144 84.655-114.327 216.742 29.76 132 134.269 129.6 134.269 129.6s76.974 7.55 166.342-12.393c89.323-19.898 166.21 4.975 166.21 4.975s208.67 69.818 265.746-64.713C924.8 774.56 835.564 704.83 835.564 704.83zM478.487 905.076H342.865c-58.56-11.738-81.905-51.665-84.916-58.472-2.924-6.982-19.505-39.142-10.69-93.819 25.308-81.905 97.483-87.796 97.483-87.796h72.218v-88.844l61.484 0.96 0.087 327.928z m252.742-0.96H575.011c-60.524-15.534-63.316-58.56-63.316-58.56V672.844l63.36-1.004v155.127c3.84 16.495 24.436 19.637 24.436 19.637h64.32v-173.76h67.418v231.272z m220.975-461.018c0-29.847-24.742-119.65-116.64-119.65-92.073 0-104.335 84.741-104.335 144.654 0 57.163 4.887 137.062 119.127 134.443 114.415-2.443 101.848-129.469 101.848-159.447z\" ></path></symbol><symbol id=\"authing-wechat-pc\" viewBox=\"0 0 1239 1024\"><path d=\"M727.677 511.336c-19.042 0-38.132 17.906-38.132 40.074 0 17.906 19.09 36 38.132 36 28.61 0 49.074-18.094 49.074-36 0-22.168-20.463-40.074-49.074-40.074m-125.29-186.63c29.985 0 49.026-19.422 49.026-48.411 0-30.459-19.041-48.364-49.025-48.364-28.564 0-55.8 17.905-55.8 48.316 0 29.084 27.237 48.41 55.8 48.41m-142.959 402.3c-50.4 0-87.158-8.288-134.858-22.12L187.06 775.32l39.505-118.847c-96.726-69.11-153.9-156.269-153.9-262.705C72.667 205.763 246.984 62 459.43 62c187.91 0 355.454 113.353 388.09 273.742a185.542 185.542 0 0 0-36.757-4.168c-185.211 0-328.17 141.062-328.17 311.068 0 29.037 4.075 55.28 10.896 82.943-10.895 1.42-23.211 1.42-34.105 1.42M1027.33 862.48l27.19 99.52-103.5-59.447c-39.458 8.242-77.59 20.747-117.096 20.747-182.51 0-326.841-127.231-326.841-284.827 0-157.547 144.331-284.73 326.841-284.73 172.943 0 328.216 127.183 328.216 284.683 0 88.58-58.547 167.305-134.81 224.053M332.72 227.93c-28.563 0-58.548 17.905-58.548 48.316 0 29.084 29.985 48.41 58.547 48.41 27.238 0 49.026-19.326 49.026-48.362 0-30.459-21.788-48.364-49.025-48.364m608.73 283.405c-20.415 0-38.13 17.906-38.13 40.074 0 17.906 17.715 36 38.13 36 27.238 0 47.7-18.094 47.7-36 0-22.168-20.462-40.074-47.7-40.074\" ></path></symbol><symbol id=\"authing-wechat-miniprogram-qrconnec\" viewBox=\"0 0 1126 1024\"><path d=\"M961.876 262.606C900.851 134.702 747.238 80.676 619.77 141.425c-69.45 33.34-113.232 90.332-130.04 168.839-15.583 71.308-6.328 150.685 2.926 211.869 12.22 78.071 12.656 135.459 1.7 176.393-9.69 36.306-29.464 59.957-61.46 75.54a135.814 135.814 0 0 1-104.372 5.102 137.634 137.634 0 0 1-77.835-69.647 136.764 136.764 0 0 1 64.388-181.93c14.317-7.12 25.668-19.38 30.73-34.607 5.023-15.187 4.628-31.244-2.136-45.996a60.511 60.511 0 0 0-34.487-30.81 61.54 61.54 0 0 0-45.878 2.136 256.284 256.284 0 0 0-131.86 145.98 257.233 257.233 0 0 0 10.284 196.72 256.403 256.403 0 0 0 231.802 146.494 263.007 263.007 0 0 0 110.265-24.916c69.41-33.341 113.192-89.462 130.04-167.97 15.149-70.913 6.328-150.29-2.966-210.603-12.22-78.942-12.656-136.764-1.701-177.698 9.69-36.307 29.465-60.354 62.292-75.54a136.962 136.962 0 0 1 182.205 64.585 136.764 136.764 0 0 1-64.387 181.93 60.511 60.511 0 0 0-28.16 80.167c6.724 14.753 19.34 25.708 34.053 30.81 15.148 5.063 31.166 4.628 45.877-2.135 127.51-62.45 181.378-216.101 120.786-343.531z\" ></path></symbol><symbol id=\"authing-wechat-webpage-authorization\" viewBox=\"0 0 1188 1024\"><path d=\"M512 1.896C229.452 1.896 0 229.452 0 512s229.452 510.104 512 510.104S1022.104 794.548 1022.104 512 794.548 1.896 512 1.896z m-91.022 629.57c-26.548 0-49.304-5.688-75.852-11.377l-75.852 37.926 22.756-66.37c-54.993-37.926-87.23-87.23-87.23-147.912 0-104.296 98.607-185.837 218.074-185.837 108.089 0 201.007 64.474 219.97 153.6-7.585 0-13.274-1.896-20.859-1.896-104.296 0-185.837 77.748-185.837 172.563 0 15.17 1.896 30.34 7.585 45.511-7.585 3.793-15.17 3.793-22.755 3.793z m322.37 77.749l17.067 54.992-58.785-34.133c-22.756 5.689-43.615 11.378-66.37 11.378-104.297 0-185.838-70.163-185.838-157.393S530.963 424.77 635.26 424.77c98.608 0 185.837 70.163 185.837 159.29 0 47.407-32.237 91.021-77.748 125.155z\" fill=\"#46BB36\" ></path><path d=\"M318.578 379.26c0 17.066 13.274 30.34 30.34 30.34s30.341-13.274 30.341-30.34-13.274-30.341-30.34-30.341-30.341 13.274-30.341 30.34z m235.14 159.288c0 13.274 11.378 24.652 24.652 24.652 13.274 0 24.652-11.378 24.652-24.652 0-13.274-11.378-24.652-24.652-24.652-13.274-1.896-24.651 9.482-24.651 24.652z m-81.54-159.289c0 17.067 13.274 30.341 30.34 30.341 17.067 0 30.341-13.274 30.341-30.34 0-17.067-13.274-30.341-30.34-30.341-17.067 0-30.341 13.274-30.341 30.34zM675.08 538.55c0 13.273 11.378 24.651 24.652 24.651 13.274 0 24.652-11.378 24.652-24.652 0-13.274-11.378-24.652-24.652-24.652-13.274-1.896-24.652 9.482-24.652 24.652z\" fill=\"#46BB36\" ></path></symbol><symbol id=\"authing-wechat-miniprogram-default\" viewBox=\"0 0 1126 1024\"><path d=\"M961.876 262.606C900.851 134.702 747.238 80.676 619.77 141.425c-69.45 33.34-113.232 90.332-130.04 168.839-15.583 71.308-6.328 150.685 2.926 211.869 12.22 78.071 12.656 135.459 1.7 176.393-9.69 36.306-29.464 59.957-61.46 75.54a135.814 135.814 0 0 1-104.372 5.102 137.634 137.634 0 0 1-77.835-69.647 136.764 136.764 0 0 1 64.388-181.93c14.317-7.12 25.668-19.38 30.73-34.607 5.023-15.187 4.628-31.244-2.136-45.996a60.511 60.511 0 0 0-34.487-30.81 61.54 61.54 0 0 0-45.878 2.136 256.284 256.284 0 0 0-131.86 145.98 257.233 257.233 0 0 0 10.284 196.72 256.403 256.403 0 0 0 231.802 146.494 263.007 263.007 0 0 0 110.265-24.916c69.41-33.341 113.192-89.462 130.04-167.97 15.149-70.913 6.328-150.29-2.966-210.603-12.22-78.942-12.656-136.764-1.701-177.698 9.69-36.307 29.465-60.354 62.292-75.54a136.962 136.962 0 0 1 182.205 64.585 136.764 136.764 0 0 1-64.387 181.93 60.511 60.511 0 0 0-28.16 80.167c6.724 14.753 19.34 25.708 34.053 30.81 15.148 5.063 31.166 4.628 45.877-2.135 127.51-62.45 181.378-216.101 120.786-343.531z\" ></path></symbol><symbol id=\"authing-wechatwork-service-provider-authorization\" viewBox=\"0 0 1182 1024\"><path d=\"M993.598 913.02a7.062 7.062 0 0 1 4.908 2.224c15.678 17.761 37.252 31.073 59.816 35.505 15.713 3.354 26.482 18.873 26.482 36.634 0 19.968-14.706 36.617-32.362 36.617-16.666 0-30.402-14.424-32.361-32.185-4.909-25.53-15.714-47.722-30.42-65.466-0.971-1.112-1.942-3.337-2.931-5.561 0-4.432 2.93-7.768 6.868-7.768zM1024 0a105.931 105.931 0 0 1 105.931 105.949v453.42h-70.62V247.172H70.46v670.88h452.026v70.638H32.84C15.572 988.69 0.829 975.448 0 958.27v-857.9C2.79 44.19 49.346 0.053 105.843 0zM812.138 512c136.651 0 247.172 97.774 247.172 219.224h-60.804c0-101.888-85.663-162.286-182.22-163.045-117.565-0.918-189.686 76.182-193.553 157.184-2.471 51.412 16.42 92.495 61.617 127.47 5.032 4.131 4.184 17.479 3.178 23.658l-2.684 37.34s1.006 0 2.013-1.023l49.982-25.141a16.455 16.455 0 0 1 12.058-1.042c22.104 6.18 37.676 5.509 60.787 5.509 24.117 0 46.857-2.066 64.23-8.087l15.589 55.085a288.662 288.662 0 0 1-78.371 11.317c-25.124 0-49.24-3.09-72.334-9.27l-53.265 26.766c-5.014 2.065-12.059 3.09-18.08 3.09-6.037 0-12.058-2.066-17.09-5.138-10.045-7.221-15.06-19.562-14.053-34.993v-1.041l5.014-42.196c-49.222-40.148-76.358-97.775-76.358-157.484C564.966 609.792 675.486 512 812.138 512z m338.397 330.399c17.655 0 32.362 16.649 32.362 36.634 0 18.856-12.747 34.393-28.443 36.617-22.563 5.544-42.178 17.761-57.874 34.41a21.186 21.186 0 0 1-4.908 3.32c-3.92 0-6.868-3.32-6.868-7.769 0-2.225 0.99-4.431 1.978-5.544 15.678-17.76 27.454-42.178 31.373-67.707 2.948-17.744 16.684-29.961 32.38-29.961z m-141.242-30.261c3.92 0 6.868 3.337 6.868 7.768a9.075 9.075 0 0 1-1.977 5.544c-15.678 17.761-27.454 42.178-31.374 67.708-2.948 17.743-16.684 29.96-32.38 29.96-17.654 0-32.361-16.648-32.361-36.634 0-18.856 12.747-34.392 28.442-36.617 22.564-5.544 42.179-17.743 57.874-34.392 0.971-1.113 2.93-2.225 4.908-3.337z m39.23-70.62c16.667 0 30.402 14.424 32.362 32.185 4.908 25.511 15.713 47.722 30.42 65.465 1.942 1.112 1.942 3.337 2.93 5.561 0 4.432-2.93 7.769-6.867 7.769a7.062 7.062 0 0 1-4.908-2.225c-15.696-17.761-37.253-31.073-59.816-35.504-15.713-3.355-26.483-18.874-26.483-36.635 0-19.968 14.707-36.617 32.362-36.617zM511.912 70.584a53.177 53.177 0 0 0-37.5 15.537 53 53 0 0 0 17.426 86.422 53.407 53.407 0 0 0 58.05-11.582 52.824 52.824 0 0 0 11.388-57.838 53.23 53.23 0 0 0-49.364-32.539z m-176.605 0a53.177 53.177 0 0 0-37.5 15.537 53 53 0 0 0 17.426 86.422 53.407 53.407 0 0 0 58.05-11.582 52.824 52.824 0 0 0 11.388-57.838 53.23 53.23 0 0 0-49.364-32.539z m-176.499 0a53.177 53.177 0 0 0-37.5 15.537 53 53 0 0 0 17.426 86.422 53.407 53.407 0 0 0 58.05-11.582 52.824 52.824 0 0 0 11.388-57.838 53.23 53.23 0 0 0-49.364-32.539z\" ></path></symbol><symbol id=\"authing-wechatwork-corp-qrconnect\" viewBox=\"0 0 1220 1024\"><path d=\"M1077.17 663.237c-29.54-34.659-51.2-77.982-61.047-127.803-3.938-34.659-31.508-62.819-64.985-62.819-35.446 0-64.984 32.493-64.984 71.483 0 34.659 21.661 64.985 53.17 71.484 45.291 8.664 88.614 34.658 120.122 69.316 1.97 2.167 5.908 4.333 9.846 4.333 7.877 0 13.785-6.499 13.785-15.163-1.97-4.333-1.97-8.665-5.908-10.831z m-194.955-26.782c1.97-2.166 3.939-6.498 3.939-10.83 0-8.665-5.908-15.163-13.785-15.163-3.938 2.166-7.877 4.332-9.846 6.498-31.508 32.492-70.892 56.32-116.185 67.15-31.507 4.333-57.107 34.66-57.107 71.484 0 38.99 29.538 71.483 64.984 71.483 31.508 0 59.077-23.828 64.985-58.486 7.877-49.822 31.508-97.477 63.015-132.136z m165.416 243.2c31.507-32.492 70.892-56.32 116.184-67.15 31.508-4.333 57.108-34.659 57.108-71.483 0-38.991-29.538-71.484-64.985-71.484-31.507 0-59.076 23.828-64.984 58.487-7.877 49.821-31.508 97.477-63.016 132.135-1.969 2.166-3.938 6.498-3.938 10.83 0 8.665 5.908 15.164 13.785 15.164 3.938-2.166 7.877-4.332 9.846-6.499z m-76.8 1.379c-45.293-8.665-88.616-34.659-120.123-69.317a14.375 14.375 0 0 0-9.846-4.332c-7.877 0-13.785 6.498-13.785 15.163 1.97 4.332 3.938 8.664 5.908 10.83 29.538 34.659 51.2 77.982 61.046 127.804 3.938 34.658 31.507 62.818 64.984 62.818 35.447 0 64.985-32.492 64.985-71.483 0-34.659-21.662-64.985-53.17-71.483z\" ></path><path d=\"M243.554 810.2s2.048 0 4.096-2.067l101.534-50.708c8.172-4.135 16.345-4.135 24.497-2.067 44.899 12.445 76.544 11.106 123.49 11.106 48.995 0 95.174-4.155 130.502-16.325l31.665 111.065c-51.043 14.533-106.142 22.843-159.232 22.843a571.077 571.077 0 0 1-146.964-18.688l-108.19 53.957c-10.2 4.135-24.497 6.222-36.745 6.222-12.249 0-24.497-4.135-34.698-10.377-20.421-14.514-30.622-39.424-28.574-70.558v-2.068l10.201-85.07C55.099 676.51 0 560.285 0 439.926 0 197.12 224.551 0 502.154 0c277.622 0 502.154 197.14 502.154 442.014h-123.55c0-205.43-174.001-327.208-370.196-328.744-238.808-1.85-385.378 153.6-393.216 316.948-4.982 103.62 33.36 186.466 125.224 257.024 10.2 8.31 8.468 35.19 6.44 47.655\" ></path></symbol><symbol id=\"authing-wechatwork-service-provider-qrconnect\" viewBox=\"0 0 1220 1024\"><path d=\"M1077.17 663.237c-29.54-34.659-51.2-77.982-61.047-127.803-3.938-34.659-31.508-62.819-64.985-62.819-35.446 0-64.984 32.493-64.984 71.483 0 34.659 21.661 64.985 53.17 71.484 45.291 8.664 88.614 34.658 120.122 69.316 1.97 2.167 5.908 4.333 9.846 4.333 7.877 0 13.785-6.499 13.785-15.163-1.97-4.333-1.97-8.665-5.908-10.831z m-194.955-26.782c1.97-2.166 3.939-6.498 3.939-10.83 0-8.665-5.908-15.163-13.785-15.163-3.938 2.166-7.877 4.332-9.846 6.498-31.508 32.492-70.892 56.32-116.185 67.15-31.507 4.333-57.107 34.66-57.107 71.484 0 38.99 29.538 71.483 64.984 71.483 31.508 0 59.077-23.828 64.985-58.486 7.877-49.822 31.508-97.477 63.015-132.136z m165.416 243.2c31.507-32.492 70.892-56.32 116.184-67.15 31.508-4.333 57.108-34.659 57.108-71.483 0-38.991-29.538-71.484-64.985-71.484-31.507 0-59.076 23.828-64.984 58.487-7.877 49.821-31.508 97.477-63.016 132.135-1.969 2.166-3.938 6.498-3.938 10.83 0 8.665 5.908 15.164 13.785 15.164 3.938-2.166 7.877-4.332 9.846-6.499z m-76.8 1.379c-45.293-8.665-88.616-34.659-120.123-69.317a14.375 14.375 0 0 0-9.846-4.332c-7.877 0-13.785 6.498-13.785 15.163 1.97 4.332 3.938 8.664 5.908 10.83 29.538 34.659 51.2 77.982 61.046 127.804 3.938 34.658 31.507 62.818 64.984 62.818 35.447 0 64.985-32.492 64.985-71.483 0-34.659-21.662-64.985-53.17-71.483z\" ></path><path d=\"M243.554 810.2s2.048 0 4.096-2.067l101.534-50.708c8.172-4.135 16.345-4.135 24.497-2.067 44.899 12.445 76.544 11.106 123.49 11.106 48.995 0 95.174-4.155 130.502-16.325l31.665 111.065c-51.043 14.533-106.142 22.843-159.232 22.843a571.077 571.077 0 0 1-146.964-18.688l-108.19 53.957c-10.2 4.135-24.497 6.222-36.745 6.222-12.249 0-24.497-4.135-34.698-10.377-20.421-14.514-30.622-39.424-28.574-70.558v-2.068l10.201-85.07C55.099 676.51 0 560.285 0 439.926 0 197.12 224.551 0 502.154 0c277.622 0 502.154 197.14 502.154 442.014h-123.55c0-205.43-174.001-327.208-370.196-328.744-238.808-1.85-385.378 153.6-393.216 316.948-4.982 103.62 33.36 186.466 125.224 257.024 10.2 8.31 8.468 35.19 6.44 47.655\" ></path></symbol><symbol id=\"authing-weibo\" viewBox=\"0 0 1185 1024\"><path d=\"M891.75 466.973c-17.137-5.012-29.37-7.545-19.616-30.019 19.616-47.477 19.616-90 0-120.017-39.18-57.503-144.538-54.97-264.61-2.48 0 0-39.125 17.517-29.37-12.502 19.615-59.982 17.19-109.992-12.234-140.01-66.127-67.473-240.089 2.532-389.532 154.992C63.7 431.942 0 551.96 0 656.996c0 199.94 252.322 322.49 497.314 322.49 323.354 0 536.55-192.503 538.975-347.496 0-92.533-75.934-142.545-144.539-165.017zM499.794 907C303.79 926.941 134.73 836.94 122.497 704.474c-14.714-129.987 134.73-252.484 330.735-272.532 196.005-19.939 365.01 70.06 377.243 202.527 14.712 129.987-134.73 252.484-330.68 272.532z m19.563-375.034c-93.072-25.005-198.43 22.527-240.088 107.515-41.605 87.52 0 182.478 93.125 212.496 97.975 32.497 213.142-17.515 252.322-109.995 39.179-92.53-9.81-185.01-105.359-210.016z m-70.976 219.987c-19.616 30.018-61.22 45-90.645 30.018-29.372-14.982-39.18-50.012-19.617-82.455 19.616-30.07 58.796-42.574 88.22-30.07 29.372 15.034 39.18 50.01 22.042 82.507z m63.7-82.455c-7.329 12.45-22.095 17.461-34.275 12.45-12.287-4.958-17.192-17.462-9.809-29.964 4.85-12.503 19.564-17.515 31.797-12.503 12.288 5.011 17.191 17.515 12.288 29.964z m431.137-327.555a83.964 83.964 0 0 0-14.66-74.963c-19.616-19.994-46.562-30.019-71.029-22.527-22.096 5.012-41.658-9.97-46.563-30.018a40.258 40.258 0 0 1 29.426-47.479c51.412-10.023 107.783 5.012 144.537 47.479a157.904 157.904 0 0 1 31.797 152.514c-7.33 19.994-29.372 32.497-48.988 25.006-19.563-5.012-31.796-27.485-24.466-50.012z m227.908 75.018a44.838 44.838 0 0 1-56.37 30.019c-24.521-7.546-36.755-35.032-29.426-57.504a226.13 226.13 0 0 0-46.508-222.52c-56.372-62.515-137.21-87.52-213.144-70.006a45.108 45.108 0 0 1-53.892-35.029c-4.904-24.952 9.754-49.958 34.276-54.97a312.789 312.789 0 0 1 298.884 97.544c78.413 87.467 98.03 207.485 66.18 312.466z\" ></path></symbol><symbol id=\"authing-github\" viewBox=\"0 0 1024 1024\"><path d=\"M51.57 672.155c3.72-6.605 52.236-29.956 126.057 57.307 0.186 0 0.465 0.14 0.79 0.419 5.21 4.326 29.538 39.26 43.307 51.865 58.935 53.307 147.083 12.001 157.13 6.047 4.652-38.282 19.025-68.378 43.027-90.52a290.072 290.072 0 0 1-64.052-10.047 203.832 203.832 0 0 1-61.029-18.048 168.852 168.852 0 0 1-58.052-29.165c-17.35-9.35-33.677-23.444-49.027-42.237a205.367 205.367 0 0 1-40.004-58.284c-10.698-20.095-19.071-45.911-25.072-77.356-6-28.84-8.977-62.005-8.977-99.543 0-68.983 22.979-129.64 69.076-181.924-2.745-5.395-33.026-77.17 7.907-179.969 55.447-1.954 115.173 23.49 185.226 68.332A925.198 925.198 0 0 1 547.008 46.89c56.936 1.907 113.592 9.303 169.132 22.142C739.49 54.984 821.637-1.3 900.249 2.747c37.678 89.45 11.024 170.154 6.977 178.9 46.05 46.236 69.076 104.846 69.076 175.875v6.047c0.326 5.024 0.512 10.094 0.512 15.118 0 27.77-3.163 55.958-9.536 84.473a349.24 349.24 0 0 1-25.025 77.402 282.816 282.816 0 0 1-39.027 57.26 367.242 367.242 0 0 1-49.028 41.26c-18.42 10.56-37.445 20.002-57.074 28.142a1890.865 1890.865 0 0 1-61.076 18.048 1650.986 1650.986 0 0 0-64.052 10.048c30.05 25.49 45.4 66.982 46.05 124.662a3242.148 3242.148 0 0 0-0.464 55.54c0 19.583 0.186 40.282 0.465 62.052-0.651 21.444-0.93 37.724-0.93 48.795 0 11.07 0.279 16.931 0.93 17.536a677.27 677.27 0 0 1-159.084 20.048h-14.978c-54.424 0-107.452-6.651-159.177-20.14-0.698-0.652-0.977-39.214-0.977-115.546-20.7 4.652-157.037 31.538-217.508-69.913-19.304-30.05-35.351-103.405-100.753-136.152-6.93 18.048-28.84 2.652-14-10.047z\" ></path></symbol></svg>',n=(n=document.getElementsByTagName(\"script\"))[n.length-1].getAttribute(\"data-injectcss\");if(n&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(c){console&&console.log(c)}}function m(){i||(i=!0,l())}a=function(){var c,a,t,l;(l=document.createElement(\"div\")).innerHTML=h,h=null,(t=l.getElementsByTagName(\"svg\")[0])&&(t.setAttribute(\"aria-hidden\",\"true\"),t.style.position=\"absolute\",t.style.width=0,t.style.height=0,t.style.overflow=\"hidden\",c=t,(a=document.body).firstChild?(l=c,(t=a.firstChild).parentNode.insertBefore(l,t)):a.appendChild(c))},document.addEventListener?~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener(\"DOMContentLoaded\",t,!1),a()},document.addEventListener(\"DOMContentLoaded\",t,!1)):document.attachEvent&&(l=a,e=c.document,i=!1,(o=function(){try{e.documentElement.doScroll(\"left\")}catch(c){return void setTimeout(o,50)}m()})(),e.onreadystatechange=function(){\"complete\"==e.readyState&&(e.onreadystatechange=null,m())})}(window);","import { ReportHandler } from 'web-vitals'\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import { Button } from 'antd'\nimport React, { useState } from 'react'\nimport ReactDOM from 'react-dom'\nimport { initAuthClient, Lang } from './components'\nimport { AuthingGuard } from './components/AuthingGuard'\n\nimport {\n GuardMode,\n // LoginMethods,\n SocialConnections,\n UserConfig,\n // LoginMethods,\n // RegisterMethods,\n // GuardScenes,\n // SocialConnections,\n} from './components/AuthingGuard/types/GuardConfig'\nimport reportWebVitals from './reportWebVitals'\n\nconst App = () => {\n const [, setLang] = useState<Lang>('zh-CN')\n\n const config: UserConfig = {\n mode: GuardMode.Normal,\n // appHost: 'https://sample-sso.authing.cn',\n // apiHost: 'http://console.authing.localhost:3000',\n // apiHost: 'http://192.168.50.57:3000',\n // loginMethods: Object.values(LoginMethods),\n // logo:\n // 'https://files.authing.co/user-contents/photos/0a4c99ff-b8ce-4030-aaaf-584c807cb21c.png',\n // title: 'Authing',\n // defaultLoginMethod: LoginMethods.LDAP,\n // registerMethods: Object.values(RegisterMethods),\n // defaultRegisterMethod: RegisterMethods.Email,\n // defaultScenes: GuardScenes.Login,\n // socialConnections: Object.values(SocialConnections),\n // enterpriseConnections: [\"oidc1\"],\n // appDomain: 'oidc1.authing.cn',\n // appId: '5f17a529f64fb009b794a2ff',\n // isSSO: true,\n // zIndex: 300,\n // text: {\n // loginTabs: {\n // [LoginMethods.Password]: '密码登录一下',\n // },\n // loginBtn: {\n // loading: 'fuck',\n // },\n // },\n // mode: GuardMode.Modal,\n // contentCss: `\n // html, body {\n // background-color: #fff;\n // }\n // `,\n // autoRegister: true,\n socialConnections: [SocialConnections.AppleWeb],\n localesConfig: {\n defaultLang: 'en-US',\n isShowChange: true,\n onChange: (value) => {\n console.log('...........')\n console.log(value)\n },\n },\n lang: 'en-US',\n }\n\n const [visible, setVisible] = useState(false)\n\n // useEffect(() => {\n // setTimeout(() => setVisible(true), 3000)\n // }, [])\n\n initAuthClient({\n appId: '5d70d0e991fdd597019df70d',\n appHost: 'http://sample-sso.authing.cn',\n })\n\n return (\n // eslint-disable-next-line react/jsx-no-undef\n <>\n <Button\n type=\"primary\"\n onClick={() => {\n setVisible(true)\n }}\n >\n 开关\n </Button>\n <Button\n type=\"primary\"\n onClick={() => {\n setLang('zh-CN')\n }}\n >\n 中文\n </Button>\n <Button\n type=\"primary\"\n onClick={() => {\n setLang('en-US')\n }}\n >\n English\n </Button>\n <AuthingGuard\n visible={visible}\n // onLoginTabChange={(v) => console.log(v)}\n // onRegisterTabChange={(v) => console.log(v)}\n // onClose={() => {\n // setVisible(false)\n // setTimeout(() => {\n // setVisible(true)\n // }, 2000)\n // }}\n onClose={() => {\n setVisible(false)\n }}\n // onLoad={(a) => console.log(a, '加载完成')}\n // onPwdResetError={(e) => console.log(e)}\n appId=\"6099fb5483deda8c44a4e457\"\n // appId=\"5fd877fb0ba0421962eced94\"\n config={config}\n />\n </>\n )\n}\n\nReactDOM.render(<App />, document.getElementById('root'))\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n","export * from './Forms'\nexport * from './GuardState'\nexport * from './GuardConfig'\nexport * from './Locales'\n","import {\n AuthenticationClient,\n CommonMessage,\n SocialConnectionProvider,\n User,\n} from 'authing-js-sdk'\nimport { QrCodeAuthenticationClient } from 'authing-js-sdk/build/main/lib/authentication/QrCodeAuthenticationClient'\n\nimport {\n SocialConnectionItem,\n EnterpriseConnectionItem,\n ApplicationConfig,\n} from '../../../components/AuthingGuard/api'\nimport { Lang } from './Locales'\n\nexport type { AuthenticationClient, CommonMessage, User } from 'authing-js-sdk'\n\nexport enum GuardMode {\n Modal = 'modal',\n Normal = 'normal',\n}\n\nexport enum LoginMethods {\n LDAP = 'ldap',\n AppQr = 'app-qrcode',\n Password = 'password',\n PhoneCode = 'phone-code',\n WxMinQr = 'wechat-miniprogram-qrcode', // 对应社会化登录的 wechat:miniprogram:qrconnect(小程序扫码登录)\n AD = 'ad', // 对应企业身份源的 Windows AD 登录\n}\n\nexport enum RegisterMethods {\n Email = 'email',\n Phone = 'phone',\n}\n\nexport enum GuardScenes {\n Login = 'login',\n Register = 'register',\n MfaVerify = 'mfaVerify',\n AppMfaVerify = 'appMfaVerify',\n RestPassword = 'restPassword',\n CompleteUserInfo = 'completeUserInfo',\n}\n\nexport enum ResetPwdMethods {\n Email = 'email',\n Phone = 'phone',\n}\n\nexport enum SocialConnections {\n Qq = 'qq',\n Weibo = 'weibo',\n Github = 'github',\n Google = 'google',\n WxPc = 'wechat:pc',\n Dingtalk = 'dingtalk',\n WxWCorpQr = 'wechatwork:corp:qrconnect',\n WxWSPQr = 'wechatwork:service-provider:qrconnect',\n WxWSPAuth = 'wechatwork:service-provider:authorization',\n AlipayWeb = 'alipay:web',\n AppleWeb = 'apple:web',\n Baidu = 'baidu',\n LarkInternalApp = 'lark-internal',\n LarkMarketPlaceApp = 'lark-public',\n}\n\nexport enum Protocol {\n AD = 'ad',\n CAS = 'cas',\n LDAP = 'ldap',\n OIDC = 'oidc',\n SAML = 'saml',\n OAUTH = 'oauth',\n AZURE_AD = 'azure-ad',\n}\n\n// export enum GuardEventsKebab {\n// // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n// Load = 'load',\n// // 加载失败\n// LoadError = 'load-error',\n// // 用户登录成功\n// Login = 'login',\n// // 用户登录失败\n// LoginError = 'login-error',\n// // 注册成功\n// Register = 'register',\n// // 注册失败\n// RegisterError = 'register-error',\n// // 忘记密码邮件发送成功\n// PwdEmailSend = 'pwd-email-send',\n// // 忘记密码邮件发送失败\n// PwdEmailSendError = 'pwd-email-send-error',\n// // 忘记密码手机验证码发送成功\n// PwdPhoneSend = 'pwd-phone-send',\n// // 忘记密码手机验证码发送失败\n// PwdPhoneSendError = 'pwd-phone-send-error',\n// // 重置密码成功\n// PwdReset = 'pwd-reset',\n// // 重置密码失败\n// PwdResetError = 'pwd-reset-error',\n// // 表单关闭事件\n// Close = 'close',\n// }\n\n// export interface GuardEventsCamelCase {\n// // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n// [GuardEvents.Load]: 'onLoad'\n// // 加载失败\n// [GuardEvents.LoadError]: 'onLoadError'\n// // 用户登录成功\n// [GuardEvents.Login]: 'onLogin'\n// // 用户登录失败\n// [GuardEvents.LoginError]: 'onLoginError'\n// // 注册成功\n// [GuardEvents.Register]: 'onRegister'\n// // 注册失败\n// [GuardEvents.RegisterError]: 'onRegisterError'\n// // 忘记密码邮件发送成功\n// [GuardEvents.PwdEmailSend]: 'onPwdEmailSend'\n// // 忘记密码邮件发送失败\n// [GuardEvents.PwdEmailSendError]: 'onPwdEmailSendError'\n// // 忘记密码手机验证码发送成功\n// [GuardEvents.PwdPhoneSend]: 'onPwdPhoneSend'\n// // 忘记密码手机验证码发送失败\n// [GuardEvents.PwdPhoneSendError]: 'onPwdPhoneSendError'\n// // 重置密码成功\n// [GuardEvents.PwdReset]: 'onPwdReset'\n// // 重置密码失败\n// [GuardEvents.PwdResetError]: 'onPwdResetError'\n// // 表单关闭事件\n// [GuardEvents.Close]: 'onClose'\n// }\n\n// export enum GuardEvents {\n// // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n// Load = 'onLoad',\n// // 加载失败\n// LoadError = 'onLoadError',\n// // 用户登录成功\n// Login = 'onLogin',\n// // 用户登录失败\n// LoginError = 'onLoginError',\n// // 注册成功\n// Register = 'onRegister',\n// // 注册失败\n// RegisterError = 'onRegisterError',\n// // 忘记密码邮件发送成功\n// PwdEmailSend = 'onPwdEmailSend',\n// // 忘记密码邮件发送失败\n// PwdEmailSendError = 'onPwdEmailSendError',\n// // 忘记密码手机验证码发送成功\n// PwdPhoneSend = 'onPwdPhoneSend',\n// // 忘记密码手机验证码发送失败\n// PwdPhoneSendError = 'onPwdPhoneSendError',\n// // 重置密码成功\n// PwdReset = 'onPwdReset',\n// // 重置密码失败\n// PwdResetError = 'onPwdResetError',\n// // 表单关闭事件\n// Close = 'onClose',\n// }\n\nexport const GuardEventsCamelToKebabMap = {\n onLoad: 'load',\n onLoadError: 'load-error',\n onLogin: 'login',\n onLoginError: 'login-error',\n onRegister: 'register',\n onRegisterError: 'register-error',\n onPwdEmailSend: 'pwd-email-send',\n onPwdEmailSendError: 'pwd-email-send-error',\n onPwdPhoneSend: 'pwd-phone-send',\n onPwdPhoneSendError: 'pwd-phone-send-error',\n onPwdReset: 'pwd-reset',\n onPwdResetError: 'pwd-reset-error',\n onClose: 'close',\n onLoginTabChange: 'login-tab-change',\n onRegisterTabChange: 'register-tab-change',\n onRegisterInfoCompleted: 'register-info-completed',\n onRegisterInfoCompletedError: 'register-info-completed-error',\n} as const\n\nexport interface GuardEventsHandlerKebab {\n // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n load: GuardEventsHandler['onLoad']\n // 加载失败\n 'load-error': GuardEventsHandler['onLoadError']\n // 用户登录成功\n login: GuardEventsHandler['onLogin']\n // 用户登录失败\n 'login-error': GuardEventsHandler['onLoginError']\n // 注册成功\n register: GuardEventsHandler['onRegister']\n // 注册失败\n 'register-error': GuardEventsHandler['onRegisterError']\n // 忘记密码邮件发送成功\n 'pwd-email-send': GuardEventsHandler['onPwdEmailSend']\n // 忘记密码邮件发送失败\n 'pwd-email-send-error': GuardEventsHandler['onPwdEmailSendError']\n // 忘记密码手机验证码发送成功\n 'pwd-phone-send': GuardEventsHandler['onPwdPhoneSend']\n // 忘记密码手机验证码发送失败\n 'pwd-phone-send-error': GuardEventsHandler['onPwdPhoneSendError']\n // 重置密码成功\n 'pwd-reset': GuardEventsHandler['onPwdReset']\n // 重置密码失败\n 'pwd-reset-error': GuardEventsHandler['onPwdResetError']\n // 表单关闭事件\n close: GuardEventsHandler['onClose']\n // 登录的 tab 切换\n 'login-tab-change': GuardEventsHandler['onLoginTabChange']\n // 注册的 tab 切换\n 'register-tab-change': GuardEventsHandler['onRegisterTabChange']\n // 注册信息补充完毕\n 'register-info-completed': GuardEventsHandler['onRegisterInfoCompleted']\n // 注册信息补充失败\n 'register-info-completed-error': GuardEventsHandler['onRegisterInfoCompletedError']\n}\n\nexport interface GuardEventsHandler {\n onLoad?: (authClient: AuthenticationClient) => void\n onLoadError?: (error: CommonMessage) => void\n onLogin?: (user: User, authClient: AuthenticationClient) => void\n onLoginError?: (user: User, authClient: AuthenticationClient) => void\n onRegister?: (user: User, authClient: AuthenticationClient) => void\n onRegisterError?: (user: User, authClient: AuthenticationClient) => void\n onPwdEmailSend?: (authClient: AuthenticationClient) => void\n onPwdEmailSendError?: (\n error: CommonMessage,\n authClient: AuthenticationClient\n ) => void\n onPwdPhoneSend?: (authClient: AuthenticationClient) => void\n onPwdPhoneSendError?: (\n error: CommonMessage,\n authClient: AuthenticationClient\n ) => void\n onPwdReset?: (authClient: AuthenticationClient) => void\n onPwdResetError?: (\n error: CommonMessage,\n authClient: AuthenticationClient\n ) => void\n onClose?: () => void\n onLoginTabChange?: (activeTab: LoginMethods) => void\n onRegisterTabChange?: (activeTab: RegisterMethods) => void\n onRegisterInfoCompleted?: (\n user: User,\n udfs: {\n definition: any\n value: any\n }[],\n authClient: AuthenticationClient\n ) => void\n onRegisterInfoCompletedError?: (\n error: CommonMessage,\n udfs: {\n definition: any\n value: any\n }[],\n authClient: AuthenticationClient\n ) => void\n}\n\nexport interface UserConfig {\n logo?: string\n title?: string\n zIndex?: number\n isSSO?: boolean\n mode?: GuardMode\n /**\n * @deprecated 使用 appHost\n */\n apiHost?: string\n /**\n * @deprecated 使用 appHost\n */\n appDomain?: string\n appHost?: string\n contentCss?: string\n text?: {\n loginBtn?: {\n normal?: string\n loading?: string\n }\n registerBtn?: {\n normal?: string\n loading?: string\n }\n // 登录 tab\n loginTabs?: Partial<Record<LoginMethods, string>>\n }\n escCloseable?: boolean\n autoRegister?: boolean\n clickCloseable?: boolean\n disableResetPwd?: boolean\n disableRegister?: boolean\n defaultScenes?: GuardScenes\n loginMethods?: LoginMethods[]\n target?: string | HTMLElement\n enterpriseConnections?: string[]\n defaultLoginMethod?: LoginMethods\n registerMethods?: RegisterMethods[]\n socialConnections?: (SocialConnections | SocialConnectionProvider)[]\n defaultRegisterMethod?: RegisterMethods\n qrCodeScanOptions?: Parameters<QrCodeAuthenticationClient['startScanning']>[1]\n /**\n * 国际化处理\n */\n localesConfig?: LocalesConfig\n lang?: Lang\n}\n\nexport interface GuardConfig extends UserConfig {\n socialConnectionObjs: SocialConnectionItem[]\n enterpriseConnectionObjs: EnterpriseConnectionItem[]\n extendsFields: ApplicationConfig['extendsFields']\n}\n\nexport interface LocalesConfig {\n defaultLang?: Lang\n isShowChange?: boolean\n onChange?: (lang: Lang) => void\n}\n"],"sourceRoot":""}