@liujitcn/kratos-taro-app-core 0.0.38 → 0.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +1 -1
- package/src/locales/en-US.json +3 -2
- package/src/locales/ja-JP.json +3 -2
- package/src/locales/zh-CN.json +3 -2
- package/src/locales/zh-TW.json +3 -2
- package/src/navigation.ts +5 -1
- package/src/rpc/base/v1/language.ts +1 -1
- package/src/rpc/base/v1/login.ts +2 -0
- package/src/rpc/base/v1/mfa.ts +2 -0
- package/src/rpc/base/v1/oauth.ts +4 -0
- package/src/views/pages/login/login.scss +10 -0
- package/src/views/pages/login/login.tsx +16 -1
package/README.md
CHANGED
package/package.json
CHANGED
package/src/locales/en-US.json
CHANGED
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"core.home.account_capability_description": "Profile, app settings, and AI assistant access are included",
|
|
37
37
|
"core.home.cross_platform": "Cross-platform pages",
|
|
38
38
|
"core.home.cross_platform_description": "One codebase for H5 and WeChat Mini Program",
|
|
39
|
-
"core.home.demo_scope": "
|
|
39
|
+
"core.home.demo_scope": "Overview",
|
|
40
40
|
"core.home.framework": "App framework",
|
|
41
41
|
"core.home.language": "Language",
|
|
42
|
-
"core.home.main_title": "Application
|
|
42
|
+
"core.home.main_title": "Application Home",
|
|
43
43
|
"core.home.state_management": "State management",
|
|
44
44
|
"core.home.static_home": "Static home",
|
|
45
45
|
"core.home.static_home_description": "This page presents framework details without business APIs",
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
"core.login.default_sub_title": "Welcome",
|
|
63
63
|
"core.login.login_failed": "Login failed. Try again.",
|
|
64
64
|
"core.login.login_success": "Logged in",
|
|
65
|
+
"core.login.mfa_remember_device": "Skip verification on this device for {days} days",
|
|
65
66
|
"core.login.mfa_title": "Multi-factor authentication",
|
|
66
67
|
"core.login.mfa_code": "Enter the authenticator code",
|
|
67
68
|
"core.login.mfa_recovery_code": "Recovery code (optional)",
|
package/src/locales/ja-JP.json
CHANGED
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"core.home.account_capability_description": "個人情報、アプリケーション設定、スマートアシスタントの入り口が予約されています",
|
|
37
37
|
"core.home.cross_platform": "クロスエンド ページ",
|
|
38
38
|
"core.home.cross_platform_description": "同じページ コード セットが H5 および WeChat ミニ プログラムに適応します",
|
|
39
|
-
"core.home.demo_scope": "
|
|
39
|
+
"core.home.demo_scope": "機能概要",
|
|
40
40
|
"core.home.framework": "アプリケーション フレームワーク",
|
|
41
41
|
"core.home.language": "開発言語",
|
|
42
|
-
"core.home.main_title": "
|
|
42
|
+
"core.home.main_title": "アプリケーションホーム",
|
|
43
43
|
"core.home.state_management": "ステータス管理",
|
|
44
44
|
"core.home.static_home": "静的ホームページ",
|
|
45
45
|
"core.home.static_home_description": "現在のホームページはフレーム情報を表示するために使用されており、ビジネス インターフェイスには依存していません",
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
"core.login.default_sub_title": "このアプリケーションへようこそ",
|
|
63
63
|
"core.login.login_failed": "ログインに失敗しました。もう一度お試しください。",
|
|
64
64
|
"core.login.login_success": "ログインに成功しました",
|
|
65
|
+
"core.login.mfa_remember_device": "この端末では{days}日間、追加認証を省略する",
|
|
65
66
|
"core.login.mfa_title": "多要素認証",
|
|
66
67
|
"core.login.mfa_code": "認証コードを入力",
|
|
67
68
|
"core.login.mfa_recovery_code": "リカバリーコード(任意)",
|
package/src/locales/zh-CN.json
CHANGED
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"core.home.account_capability_description": "个人资料、应用设置与智能助手入口已保留",
|
|
37
37
|
"core.home.cross_platform": "跨端页面",
|
|
38
38
|
"core.home.cross_platform_description": "同一套页面代码适配 H5 和微信小程序",
|
|
39
|
-
"core.home.demo_scope": "
|
|
39
|
+
"core.home.demo_scope": "功能概览",
|
|
40
40
|
"core.home.framework": "应用框架",
|
|
41
41
|
"core.home.language": "开发语言",
|
|
42
|
-
"core.home.main_title": "
|
|
42
|
+
"core.home.main_title": "应用首页",
|
|
43
43
|
"core.home.state_management": "状态管理",
|
|
44
44
|
"core.home.static_home": "静态首页",
|
|
45
45
|
"core.home.static_home_description": "当前首页用于展示框架信息,不依赖业务接口",
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
"core.login.login_success": "登录成功",
|
|
65
65
|
"core.login.mfa_title": "多因素认证",
|
|
66
66
|
"core.login.mfa_code": "请输入动态口令",
|
|
67
|
+
"core.login.mfa_remember_device": "{days}天内免验证此设备",
|
|
67
68
|
"core.login.mfa_recovery_code": "恢复码(可选)",
|
|
68
69
|
"core.login.mfa_setup_title": "绑定多因素认证",
|
|
69
70
|
"core.login.mfa_copy_uri": "复制绑定地址",
|
package/src/locales/zh-TW.json
CHANGED
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"core.home.account_capability_description": "個人資料、應用設定與智慧助手入口已保留",
|
|
37
37
|
"core.home.cross_platform": "跨端頁面",
|
|
38
38
|
"core.home.cross_platform_description": "同一套頁面程式碼適配 H5 和微信小程式",
|
|
39
|
-
"core.home.demo_scope": "
|
|
39
|
+
"core.home.demo_scope": "功能概覽",
|
|
40
40
|
"core.home.framework": "應用框架",
|
|
41
41
|
"core.home.language": "開發語言",
|
|
42
|
-
"core.home.main_title": "
|
|
42
|
+
"core.home.main_title": "應用首頁",
|
|
43
43
|
"core.home.state_management": "狀態管理",
|
|
44
44
|
"core.home.static_home": "靜態首頁",
|
|
45
45
|
"core.home.static_home_description": "當前首頁用於展示框架資訊,不依賴業務介面",
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
"core.login.default_sub_title": "歡迎使用本應用",
|
|
63
63
|
"core.login.login_failed": "登入失敗,請重試",
|
|
64
64
|
"core.login.login_success": "登入成功",
|
|
65
|
+
"core.login.mfa_remember_device": "{days}天內免驗證此裝置",
|
|
65
66
|
"core.login.mfa_title": "多因素認證",
|
|
66
67
|
"core.login.mfa_code": "請輸入動態密碼",
|
|
67
68
|
"core.login.mfa_recovery_code": "恢復碼(可選)",
|
package/src/navigation.ts
CHANGED
|
@@ -306,7 +306,7 @@ export function navigateAppView(viewKey: string, params: Record<string, string>
|
|
|
306
306
|
navigateAppRoute(`${path}${query ? `?${query}` : ''}`)
|
|
307
307
|
}
|
|
308
308
|
|
|
309
|
-
/**
|
|
309
|
+
/** 自绘 tab 在 H5 直接切换,微信端优先复用原生 tab 或页面栈。 */
|
|
310
310
|
function navigateTabRoute(url: string): void {
|
|
311
311
|
const targetRoute = url.slice(1).split('?', 1)[0].replace(/^\/+/, '')
|
|
312
312
|
const pages = getCurrentPages()
|
|
@@ -318,6 +318,10 @@ function navigateTabRoute(url: string): void {
|
|
|
318
318
|
const release = () => {
|
|
319
319
|
if (tabNavigationTarget === targetRoute) tabNavigationTarget = undefined
|
|
320
320
|
}
|
|
321
|
+
if (process.env.TARO_ENV === 'h5') {
|
|
322
|
+
void Taro.reLaunch({ url }).then(release, release)
|
|
323
|
+
return
|
|
324
|
+
}
|
|
321
325
|
if (nativeTabViewKeys.some((viewKey) => resolveStaticView(viewKey) === targetRoute)) {
|
|
322
326
|
void Taro.switchTab({ url })
|
|
323
327
|
.then(release)
|
|
@@ -24,7 +24,7 @@ export interface OptionLanguageResponse {
|
|
|
24
24
|
languages: LanguageItem[];
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
/** 语言公共服务。 */
|
|
27
|
+
/** Base语言公共服务。 */
|
|
28
28
|
export interface LanguageService {
|
|
29
29
|
/** 查询当前支持的语言选项。 */
|
|
30
30
|
OptionLanguage(request: OptionLanguageRequest): Promise<OptionLanguageResponse>;
|
package/src/rpc/base/v1/login.ts
CHANGED
package/src/rpc/base/v1/mfa.ts
CHANGED
package/src/rpc/base/v1/oauth.ts
CHANGED
|
@@ -109,6 +109,8 @@ export interface CreateOauthSessionResponse {
|
|
|
109
109
|
mfa_method: string;
|
|
110
110
|
/** WebAuthn认证选项JSON */
|
|
111
111
|
mfa_webauthn_options_json: string;
|
|
112
|
+
/** 当前登录策略允许的MFA设备免验证天数 */
|
|
113
|
+
mfa_remember_days: number;
|
|
112
114
|
}
|
|
113
115
|
|
|
114
116
|
/** 三方登录回调请求 */
|
|
@@ -157,6 +159,8 @@ export interface ExchangeOauthTicketResponse {
|
|
|
157
159
|
mfa_method: string;
|
|
158
160
|
/** WebAuthn认证选项JSON */
|
|
159
161
|
mfa_webauthn_options_json: string;
|
|
162
|
+
/** 当前登录策略允许的MFA设备免验证天数 */
|
|
163
|
+
mfa_remember_days: number;
|
|
160
164
|
}
|
|
161
165
|
|
|
162
166
|
/** 个人中心三方账号绑定回调请求 */
|
|
@@ -295,6 +295,16 @@
|
|
|
295
295
|
font-weight: 700;
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
+
.mfa-remember-device {
|
|
299
|
+
display: flex;
|
|
300
|
+
align-items: center;
|
|
301
|
+
gap: 10px;
|
|
302
|
+
margin: 4px 0 20px;
|
|
303
|
+
color: #53636d;
|
|
304
|
+
font-size: 24px;
|
|
305
|
+
line-height: 1.4;
|
|
306
|
+
}
|
|
307
|
+
|
|
298
308
|
.login-agreement {
|
|
299
309
|
display: flex;
|
|
300
310
|
align-items: center;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Button, Image, Input, Picker, Text, View } from '@tarojs/components'
|
|
1
|
+
import { Button, Checkbox, Image, Input, Picker, Text, View } from '@tarojs/components'
|
|
2
2
|
import Taro, { useLoad } from '@tarojs/taro'
|
|
3
3
|
import { useEffect, useMemo, useRef, useState } from 'react'
|
|
4
4
|
import defaultLogo from '@liujitcn/kratos-taro-app-core/static/images/logo_icon.png'
|
|
@@ -108,6 +108,8 @@ export default function LoginPage() {
|
|
|
108
108
|
const [mfaCode, setMfaCode] = useState('')
|
|
109
109
|
const [mfaRecoveryCode, setMfaRecoveryCode] = useState('')
|
|
110
110
|
const [mfaMethod, setMfaMethod] = useState('totp')
|
|
111
|
+
const [mfaRememberDays, setMfaRememberDays] = useState(0)
|
|
112
|
+
const [rememberMfaDevice, setRememberMfaDevice] = useState(false)
|
|
111
113
|
const [mfaWebAuthnOptionsJson, setMfaWebAuthnOptionsJson] = useState('')
|
|
112
114
|
const [mfaSetupVisible, setMfaSetupVisible] = useState(false)
|
|
113
115
|
const [mfaSetupTicket, setMfaSetupTicket] = useState('')
|
|
@@ -326,6 +328,8 @@ export default function LoginPage() {
|
|
|
326
328
|
setMfaCode('')
|
|
327
329
|
setMfaRecoveryCode('')
|
|
328
330
|
setMfaMethod(response.mfa_method || 'totp')
|
|
331
|
+
setMfaRememberDays(response.mfa_remember_days || 0)
|
|
332
|
+
setRememberMfaDevice(false)
|
|
329
333
|
setMfaWebAuthnOptionsJson(response.mfa_webauthn_options_json || '')
|
|
330
334
|
setMfaVisible(true)
|
|
331
335
|
return false
|
|
@@ -352,6 +356,7 @@ export default function LoginPage() {
|
|
|
352
356
|
code: mfaRecoveryCode ? '' : mfaCode,
|
|
353
357
|
recovery_code: mfaRecoveryCode,
|
|
354
358
|
webauthn_response_json: webauthnResponseJson,
|
|
359
|
+
remember_device: rememberMfaDevice,
|
|
355
360
|
})
|
|
356
361
|
setMfaVisible(false)
|
|
357
362
|
if (await handleLoginResponse(response)) await loginSuccess()
|
|
@@ -744,6 +749,16 @@ export default function LoginPage() {
|
|
|
744
749
|
placeholder={t('core.login.mfa_recovery_code')}
|
|
745
750
|
onInput={(event) => setMfaRecoveryCode(event.detail.value)}
|
|
746
751
|
/>
|
|
752
|
+
{mfaRememberDays > 0 ? (
|
|
753
|
+
<View className='mfa-remember-device'>
|
|
754
|
+
<Checkbox
|
|
755
|
+
value='remember'
|
|
756
|
+
checked={rememberMfaDevice}
|
|
757
|
+
onChange={(event) => setRememberMfaDevice(event.detail.value.includes('remember'))}
|
|
758
|
+
/>
|
|
759
|
+
<Text>{t('core.login.mfa_remember_device', { days: mfaRememberDays })}</Text>
|
|
760
|
+
</View>
|
|
761
|
+
) : null}
|
|
747
762
|
<Button
|
|
748
763
|
className='login-button login-button-primary'
|
|
749
764
|
loading={mfaLoading}
|