@tachybase/module-auth 1.6.2 → 1.6.3
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 +117 -117
- package/client.d.ts +2 -2
- package/client.js +65 -65
- package/dist/externalVersion.js +6 -6
- package/dist/locale/en-US.json +63 -63
- package/dist/locale/ko_KR.json +36 -36
- package/dist/locale/zh-CN.json +63 -63
- package/dist/node_modules/cron/package.json +1 -1
- package/dist/node_modules/ms/package.json +1 -1
- package/package.json +2 -2
- package/server.d.ts +2 -2
- package/server.js +65 -65
package/README.md
CHANGED
|
@@ -1,117 +1,117 @@
|
|
|
1
|
-
# Auth
|
|
2
|
-
|
|
3
|
-
提供基础认证功能和扩展认证器管理功能。
|
|
4
|
-
|
|
5
|
-
## 使用方法
|
|
6
|
-
|
|
7
|
-
### 认证器管理
|
|
8
|
-
页面:应用配置 - 认证
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
<img src="https://s2.loli.net/2023/05/15/NdriQZvBuE6hGRS.png" width="800px" />
|
|
12
|
-
|
|
13
|
-
#### 内置认证器
|
|
14
|
-
- 名称:basic
|
|
15
|
-
- 认证类型:邮箱密码登录
|
|
16
|
-
|
|
17
|
-
<img src="https://s2.loli.net/2023/05/15/HC4gtx9fQPrqvac.png" width="300px" />
|
|
18
|
-
|
|
19
|
-
<img src="https://s2.loli.net/2023/05/15/fcLqypdhOxnksbg.png" width="300px" />
|
|
20
|
-
|
|
21
|
-
#### 增加认证器
|
|
22
|
-
Add new - 选择认证类型
|
|
23
|
-
|
|
24
|
-
<img src="https://s2.loli.net/2023/05/15/CR7UTDt2WzbEfgs.png" width="300px" />
|
|
25
|
-
|
|
26
|
-
#### 启用/禁用
|
|
27
|
-
Actions - Edit - 勾选/取消Enabled
|
|
28
|
-
|
|
29
|
-
<img src="https://s2.loli.net/2023/05/15/2utpSHly9fzCKX5.png" width="400px" />
|
|
30
|
-
|
|
31
|
-
#### 配置认证器
|
|
32
|
-
Actions - Edit
|
|
33
|
-
|
|
34
|
-
## 开发一个登录插件
|
|
35
|
-
### 接口
|
|
36
|
-
Tachybase内核提供了扩展登录方式的接入和管理。扩展登录插件的核心逻辑处理,需要继承内核的`Auth`类,并对相应的标准接口进行实现。
|
|
37
|
-
参考`core/auth/auth.ts`
|
|
38
|
-
|
|
39
|
-
```TypeScript
|
|
40
|
-
import { Auth } from '@tachybase/auth';
|
|
41
|
-
|
|
42
|
-
class CustomAuth extends Auth {
|
|
43
|
-
set user(user) {}
|
|
44
|
-
get user() {}
|
|
45
|
-
|
|
46
|
-
async check() {}
|
|
47
|
-
async signIn() {}
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
多数情况下,扩展的用户登录方式也将沿用现有的jwt逻辑来生成用户访问API的凭证,插件也可以继承`BaseAuth`类以便复用部分逻辑代码,如`check`, `signIn`接口。
|
|
52
|
-
|
|
53
|
-
```TypeScript
|
|
54
|
-
import { BaseAuth } from '@tachybase/auth';
|
|
55
|
-
|
|
56
|
-
class CustomAuth extends BaseAuth {
|
|
57
|
-
constructor(config: AuthConfig) {
|
|
58
|
-
const userCollection = config.ctx.db.getCollection('users');
|
|
59
|
-
super({ ...config, userCollection });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async validate() {}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 用户数据
|
|
67
|
-
|
|
68
|
-
`@tachybase/module-auth`插件提供了`usersAuthenticators`表来建立users和authenticators,即用户和认证方式的关联。
|
|
69
|
-
通常情况下,扩展登录方式用`users`和`usersAuthenticators`来存储相应的用户数据即可,特殊情况下才需要自己新增Collection.
|
|
70
|
-
`users`存储的是最基础的用户数据,邮箱、昵称和密码。
|
|
71
|
-
`usersAuthenticators`存储扩展登录方式数据
|
|
72
|
-
- uuid: 该种认证方式的用户唯一标识,如手机号、微信openid等
|
|
73
|
-
- meta: JSON字段,其他需要保存的信息
|
|
74
|
-
- userId: 用户id
|
|
75
|
-
- authenticator:认证器名字
|
|
76
|
-
|
|
77
|
-
对于用户操作,`Authenticator`模型也提供了几个封装的方法,可以在`CustomAuth`类中通过`this.authenticator[方法名]`使用:
|
|
78
|
-
- `findUser(uuid: string): UserModel` - 查询用户
|
|
79
|
-
- `newUser(uuid: string, values?: any): UserModel` - 创建新用户
|
|
80
|
-
- `findOrCreateUser(uuid: string, userValues?: any): UserModel` - 查找或创建新用户
|
|
81
|
-
|
|
82
|
-
### 注册
|
|
83
|
-
扩展的登录方式需要向内核注册。
|
|
84
|
-
```TypeScript
|
|
85
|
-
async load() {
|
|
86
|
-
this.app.authManager.registerTypes('custom-auth-type', {
|
|
87
|
-
auth: CustomAuth,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 客户端API
|
|
93
|
-
#### OptionsComponentProvider
|
|
94
|
-
可供用户配置的认证器配置项
|
|
95
|
-
- authType 认证方式
|
|
96
|
-
- component 配置组件
|
|
97
|
-
```TypeScript
|
|
98
|
-
<OptionsComponentProvider authType="custom-auth-type" component={Options} />
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
`Options`组件使用的值是`authenticator`的`options`字段,如果有需要暴露在前端的配置,应该放在`options.public`字段中。`authenticators:publicList`接口会返回`options.public`字段的值。
|
|
102
|
-
|
|
103
|
-
#### SigninPageProvider
|
|
104
|
-
自定义登录页界面
|
|
105
|
-
- authType 认证方式
|
|
106
|
-
- tabTitle 登录页tab标题
|
|
107
|
-
- component 登录页组件
|
|
108
|
-
|
|
109
|
-
#### SignupPageProvider
|
|
110
|
-
自定义注册页界面
|
|
111
|
-
- authType 认证方式
|
|
112
|
-
- component 注册页组件
|
|
113
|
-
|
|
114
|
-
#### SigninPageExtensionProvider
|
|
115
|
-
自定义登录页下方的扩展内容
|
|
116
|
-
- authType 认证方式
|
|
117
|
-
- component 扩展组件
|
|
1
|
+
# Auth
|
|
2
|
+
|
|
3
|
+
提供基础认证功能和扩展认证器管理功能。
|
|
4
|
+
|
|
5
|
+
## 使用方法
|
|
6
|
+
|
|
7
|
+
### 认证器管理
|
|
8
|
+
页面:应用配置 - 认证
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
<img src="https://s2.loli.net/2023/05/15/NdriQZvBuE6hGRS.png" width="800px" />
|
|
12
|
+
|
|
13
|
+
#### 内置认证器
|
|
14
|
+
- 名称:basic
|
|
15
|
+
- 认证类型:邮箱密码登录
|
|
16
|
+
|
|
17
|
+
<img src="https://s2.loli.net/2023/05/15/HC4gtx9fQPrqvac.png" width="300px" />
|
|
18
|
+
|
|
19
|
+
<img src="https://s2.loli.net/2023/05/15/fcLqypdhOxnksbg.png" width="300px" />
|
|
20
|
+
|
|
21
|
+
#### 增加认证器
|
|
22
|
+
Add new - 选择认证类型
|
|
23
|
+
|
|
24
|
+
<img src="https://s2.loli.net/2023/05/15/CR7UTDt2WzbEfgs.png" width="300px" />
|
|
25
|
+
|
|
26
|
+
#### 启用/禁用
|
|
27
|
+
Actions - Edit - 勾选/取消Enabled
|
|
28
|
+
|
|
29
|
+
<img src="https://s2.loli.net/2023/05/15/2utpSHly9fzCKX5.png" width="400px" />
|
|
30
|
+
|
|
31
|
+
#### 配置认证器
|
|
32
|
+
Actions - Edit
|
|
33
|
+
|
|
34
|
+
## 开发一个登录插件
|
|
35
|
+
### 接口
|
|
36
|
+
Tachybase内核提供了扩展登录方式的接入和管理。扩展登录插件的核心逻辑处理,需要继承内核的`Auth`类,并对相应的标准接口进行实现。
|
|
37
|
+
参考`core/auth/auth.ts`
|
|
38
|
+
|
|
39
|
+
```TypeScript
|
|
40
|
+
import { Auth } from '@tachybase/auth';
|
|
41
|
+
|
|
42
|
+
class CustomAuth extends Auth {
|
|
43
|
+
set user(user) {}
|
|
44
|
+
get user() {}
|
|
45
|
+
|
|
46
|
+
async check() {}
|
|
47
|
+
async signIn() {}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
多数情况下,扩展的用户登录方式也将沿用现有的jwt逻辑来生成用户访问API的凭证,插件也可以继承`BaseAuth`类以便复用部分逻辑代码,如`check`, `signIn`接口。
|
|
52
|
+
|
|
53
|
+
```TypeScript
|
|
54
|
+
import { BaseAuth } from '@tachybase/auth';
|
|
55
|
+
|
|
56
|
+
class CustomAuth extends BaseAuth {
|
|
57
|
+
constructor(config: AuthConfig) {
|
|
58
|
+
const userCollection = config.ctx.db.getCollection('users');
|
|
59
|
+
super({ ...config, userCollection });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async validate() {}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 用户数据
|
|
67
|
+
|
|
68
|
+
`@tachybase/module-auth`插件提供了`usersAuthenticators`表来建立users和authenticators,即用户和认证方式的关联。
|
|
69
|
+
通常情况下,扩展登录方式用`users`和`usersAuthenticators`来存储相应的用户数据即可,特殊情况下才需要自己新增Collection.
|
|
70
|
+
`users`存储的是最基础的用户数据,邮箱、昵称和密码。
|
|
71
|
+
`usersAuthenticators`存储扩展登录方式数据
|
|
72
|
+
- uuid: 该种认证方式的用户唯一标识,如手机号、微信openid等
|
|
73
|
+
- meta: JSON字段,其他需要保存的信息
|
|
74
|
+
- userId: 用户id
|
|
75
|
+
- authenticator:认证器名字
|
|
76
|
+
|
|
77
|
+
对于用户操作,`Authenticator`模型也提供了几个封装的方法,可以在`CustomAuth`类中通过`this.authenticator[方法名]`使用:
|
|
78
|
+
- `findUser(uuid: string): UserModel` - 查询用户
|
|
79
|
+
- `newUser(uuid: string, values?: any): UserModel` - 创建新用户
|
|
80
|
+
- `findOrCreateUser(uuid: string, userValues?: any): UserModel` - 查找或创建新用户
|
|
81
|
+
|
|
82
|
+
### 注册
|
|
83
|
+
扩展的登录方式需要向内核注册。
|
|
84
|
+
```TypeScript
|
|
85
|
+
async load() {
|
|
86
|
+
this.app.authManager.registerTypes('custom-auth-type', {
|
|
87
|
+
auth: CustomAuth,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 客户端API
|
|
93
|
+
#### OptionsComponentProvider
|
|
94
|
+
可供用户配置的认证器配置项
|
|
95
|
+
- authType 认证方式
|
|
96
|
+
- component 配置组件
|
|
97
|
+
```TypeScript
|
|
98
|
+
<OptionsComponentProvider authType="custom-auth-type" component={Options} />
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
`Options`组件使用的值是`authenticator`的`options`字段,如果有需要暴露在前端的配置,应该放在`options.public`字段中。`authenticators:publicList`接口会返回`options.public`字段的值。
|
|
102
|
+
|
|
103
|
+
#### SigninPageProvider
|
|
104
|
+
自定义登录页界面
|
|
105
|
+
- authType 认证方式
|
|
106
|
+
- tabTitle 登录页tab标题
|
|
107
|
+
- component 登录页组件
|
|
108
|
+
|
|
109
|
+
#### SignupPageProvider
|
|
110
|
+
自定义注册页界面
|
|
111
|
+
- authType 认证方式
|
|
112
|
+
- component 注册页组件
|
|
113
|
+
|
|
114
|
+
#### SigninPageExtensionProvider
|
|
115
|
+
自定义登录页下方的扩展内容
|
|
116
|
+
- authType 认证方式
|
|
117
|
+
- component 扩展组件
|
package/client.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './dist/client';
|
|
2
|
-
export { default } from './dist/client';
|
|
1
|
+
export * from './dist/client';
|
|
2
|
+
export { default } from './dist/client';
|
package/client.js
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
4
|
-
if (typeof WeakMap !== 'function') return null;
|
|
5
|
-
var cacheBabelInterop = new WeakMap();
|
|
6
|
-
var cacheNodeInterop = new WeakMap();
|
|
7
|
-
return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
|
|
8
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
9
|
-
})(nodeInterop);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function _interopRequireWildcard(obj, nodeInterop) {
|
|
13
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
14
|
-
return obj;
|
|
15
|
-
}
|
|
16
|
-
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
|
17
|
-
return { default: obj };
|
|
18
|
-
}
|
|
19
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
20
|
-
if (cache && cache.has(obj)) {
|
|
21
|
-
return cache.get(obj);
|
|
22
|
-
}
|
|
23
|
-
var newObj = {};
|
|
24
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
25
|
-
for (var key in obj) {
|
|
26
|
-
if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
27
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
28
|
-
if (desc && (desc.get || desc.set)) {
|
|
29
|
-
Object.defineProperty(newObj, key, desc);
|
|
30
|
-
} else {
|
|
31
|
-
newObj[key] = obj[key];
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
newObj.default = obj;
|
|
36
|
-
if (cache) {
|
|
37
|
-
cache.set(obj, newObj);
|
|
38
|
-
}
|
|
39
|
-
return newObj;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
var _index = _interopRequireWildcard(require('./dist/client'));
|
|
43
|
-
|
|
44
|
-
Object.defineProperty(exports, '__esModule', {
|
|
45
|
-
value: true,
|
|
46
|
-
});
|
|
47
|
-
var _exportNames = {};
|
|
48
|
-
Object.defineProperty(exports, 'default', {
|
|
49
|
-
enumerable: true,
|
|
50
|
-
get: function get() {
|
|
51
|
-
return _index.default;
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
Object.keys(_index).forEach(function (key) {
|
|
56
|
-
if (key === 'default' || key === '__esModule') return;
|
|
57
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
58
|
-
if (key in exports && exports[key] === _index[key]) return;
|
|
59
|
-
Object.defineProperty(exports, key, {
|
|
60
|
-
enumerable: true,
|
|
61
|
-
get: function get() {
|
|
62
|
-
return _index[key];
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
});
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
4
|
+
if (typeof WeakMap !== 'function') return null;
|
|
5
|
+
var cacheBabelInterop = new WeakMap();
|
|
6
|
+
var cacheNodeInterop = new WeakMap();
|
|
7
|
+
return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
|
|
8
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
9
|
+
})(nodeInterop);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
13
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
|
17
|
+
return { default: obj };
|
|
18
|
+
}
|
|
19
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
20
|
+
if (cache && cache.has(obj)) {
|
|
21
|
+
return cache.get(obj);
|
|
22
|
+
}
|
|
23
|
+
var newObj = {};
|
|
24
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
25
|
+
for (var key in obj) {
|
|
26
|
+
if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
27
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
28
|
+
if (desc && (desc.get || desc.set)) {
|
|
29
|
+
Object.defineProperty(newObj, key, desc);
|
|
30
|
+
} else {
|
|
31
|
+
newObj[key] = obj[key];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
newObj.default = obj;
|
|
36
|
+
if (cache) {
|
|
37
|
+
cache.set(obj, newObj);
|
|
38
|
+
}
|
|
39
|
+
return newObj;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
var _index = _interopRequireWildcard(require('./dist/client'));
|
|
43
|
+
|
|
44
|
+
Object.defineProperty(exports, '__esModule', {
|
|
45
|
+
value: true,
|
|
46
|
+
});
|
|
47
|
+
var _exportNames = {};
|
|
48
|
+
Object.defineProperty(exports, 'default', {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function get() {
|
|
51
|
+
return _index.default;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
Object.keys(_index).forEach(function (key) {
|
|
56
|
+
if (key === 'default' || key === '__esModule') return;
|
|
57
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
58
|
+
if (key in exports && exports[key] === _index[key]) return;
|
|
59
|
+
Object.defineProperty(exports, key, {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
get: function get() {
|
|
62
|
+
return _index[key];
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
});
|
package/dist/externalVersion.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
module.exports = {
|
|
2
2
|
"react": "18.3.1",
|
|
3
|
-
"@tachybase/client": "1.6.
|
|
3
|
+
"@tachybase/client": "1.6.3",
|
|
4
4
|
"react-router-dom": "6.28.1",
|
|
5
|
-
"@tego/client": "1.6.1
|
|
5
|
+
"@tego/client": "1.6.1",
|
|
6
6
|
"axios": "1.13.0",
|
|
7
7
|
"lodash": "4.17.21",
|
|
8
|
-
"@tego/server": "1.6.1
|
|
8
|
+
"@tego/server": "1.6.1",
|
|
9
|
+
"@tachybase/test": "1.6.1",
|
|
9
10
|
"antd": "5.22.5",
|
|
10
|
-
"@tachybase/schema": "1.6.1
|
|
11
|
+
"@tachybase/schema": "1.6.1",
|
|
11
12
|
"react-i18next": "16.2.1",
|
|
12
|
-
"@ant-design/icons": "6.1.0"
|
|
13
|
-
"@tachybase/test": "1.6.1-alpha.2"
|
|
13
|
+
"@ant-design/icons": "6.1.0"
|
|
14
14
|
};
|
package/dist/locale/en-US.json
CHANGED
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
{
|
|
2
|
-
"Allow to sign in with": "Allow to sign in with",
|
|
3
|
-
"Allow to sign up": "Allow to sign up",
|
|
4
|
-
"Are you sure to unbind this authenticator?": "Are you sure to unbind this authenticator?",
|
|
5
|
-
"Auth Type": "Auth Type",
|
|
6
|
-
"Auth UID": "Auth UID",
|
|
7
|
-
"Authentication": "Authentication",
|
|
8
|
-
"Authentication login bind": "Authentication login bind",
|
|
9
|
-
"Authenticators": "Authenticators",
|
|
10
|
-
"Bind": "Bind",
|
|
11
|
-
"Days": "Days",
|
|
12
|
-
"Expired token refresh limit": "Expired token refresh limit",
|
|
13
|
-
"Hours": "Hours",
|
|
14
|
-
"In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.": "In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.",
|
|
15
|
-
"Invalid status": "Invalid status",
|
|
16
|
-
"Minutes": "Minutes",
|
|
17
|
-
"No authentication methods available.": "No authentication methods available.",
|
|
18
|
-
"Not a valid cellphone number, please re-enter": "Not a valid cellphone number, please re-enter",
|
|
19
|
-
"Not allowed to sign up": "Not allowed to sign up",
|
|
20
|
-
"Password is not allowed to be changed": "Password is not allowed to be changed",
|
|
21
|
-
"Please enter a valid email": "Please enter a valid email",
|
|
22
|
-
"Please enter a valid username": "Please enter a valid username",
|
|
23
|
-
"Please enter your username or email": "Please enter your username or email",
|
|
24
|
-
"Please keep and enable at least one authenticator": "Please keep and enable at least one authenticator",
|
|
25
|
-
"SMS": "SMS",
|
|
26
|
-
"Saved successfully!": "Saved successfully!",
|
|
27
|
-
"Seconds": "Seconds",
|
|
28
|
-
"Session validity period": "Session validity period",
|
|
29
|
-
"Sign in via email": "Sign in via email",
|
|
30
|
-
"Sign in via password": "Sign in via password",
|
|
31
|
-
"Sign-in": "Sign-in",
|
|
32
|
-
"Status expired, auto restored": "Status expired, auto restored",
|
|
33
|
-
"System error, please contact administrator": "System error, please contact administrator",
|
|
34
|
-
"The authentication allows users to sign in via username or email.": "The authentication allows users to sign in via username or email.",
|
|
35
|
-
"The maximum time limit allowed for refreshing a Token after it expires. After this time limit, the token cannot be automatically renewed, and the user needs to log in again.": "The maximum time limit allowed for refreshing a Token after it expires. After this time limit, the token cannot be automatically renewed, and the user needs to log in again.",
|
|
36
|
-
"The maximum valid time for each user login. During the session validity, the Token will be automatically updated. After the timeout, the user is required to log in again.": "The maximum valid time for each user login. During the session validity, the Token will be automatically updated. After the timeout, the user is required to log in again.",
|
|
37
|
-
"The password is inconsistent, please re-enter": "The password is inconsistent, please re-enter",
|
|
38
|
-
"The password is incorrect, please re-enter": "The password is incorrect, please re-enter",
|
|
39
|
-
"The phone number has been registered, please login directly": "The phone number has been registered, please login directly",
|
|
40
|
-
"The phone number is not registered, please register first": "The phone number is not registered, please register first",
|
|
41
|
-
"The username or email is incorrect, please re-enter": "The username or email is incorrect, please re-enter",
|
|
42
|
-
"The validity period of each issued API Token. After the Token expires, if it is within the session validity period and has not exceeded the refresh limit, the server will automatically issue a new Token to maintain the user session, otherwise the user is required to log in again. (Each Token can only be refreshed once)": "The validity period of each issued API Token. After the Token expires, if it is within the session validity period and has not exceeded the refresh limit, the server will automatically issue a new Token to maintain the user session, otherwise the user is required to log in again. (Each Token can only be refreshed once)",
|
|
43
|
-
"Token policy": "Token policy",
|
|
44
|
-
"Token validity period": "Token validity period",
|
|
45
|
-
"Token validity period must be less than session validity period!": "Token validity period must be less than session validity period!",
|
|
46
|
-
"Unauthenticated. Please sign in to continue.": "Unauthenticated. Please sign in to continue.",
|
|
47
|
-
"Unbind": "Unbind",
|
|
48
|
-
"Unknown status": "Unknown status",
|
|
49
|
-
"User can bind or unbind the sign in type": "User can bind or unbind the sign in type",
|
|
50
|
-
"User not found. Please sign in again to continue.": "User not found. Please sign in again to continue.",
|
|
51
|
-
"User status does not allow login": "User status does not allow login",
|
|
52
|
-
"User status is invalid, please contact administrator": "User status is invalid, please contact administrator",
|
|
53
|
-
"Username/Email": "Username/Email",
|
|
54
|
-
"Your account has been disabled, please contact administrator if you have any questions": "Your account has been disabled, please contact administrator if you have any questions",
|
|
55
|
-
"Your account has been locked due to multiple failed login attempts. Please try again later.": "Your account has been locked due to multiple failed login attempts. Please try again later.",
|
|
56
|
-
"Your account is under review, please wait for administrator approval": "Your account is under review, please wait for administrator approval",
|
|
57
|
-
"Your account status has changed. Please sign in again.": "Your account status has changed. Please sign in again.",
|
|
58
|
-
"Your session has expired. Please sign in again.": "Your session has expired. Please sign in again.",
|
|
59
|
-
"gitea": "Gitea",
|
|
60
|
-
"sms": "SMS",
|
|
61
|
-
"wechat": "WeChat",
|
|
62
|
-
"work-wechat": "WeCom"
|
|
63
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"Allow to sign in with": "Allow to sign in with",
|
|
3
|
+
"Allow to sign up": "Allow to sign up",
|
|
4
|
+
"Are you sure to unbind this authenticator?": "Are you sure to unbind this authenticator?",
|
|
5
|
+
"Auth Type": "Auth Type",
|
|
6
|
+
"Auth UID": "Auth UID",
|
|
7
|
+
"Authentication": "Authentication",
|
|
8
|
+
"Authentication login bind": "Authentication login bind",
|
|
9
|
+
"Authenticators": "Authenticators",
|
|
10
|
+
"Bind": "Bind",
|
|
11
|
+
"Days": "Days",
|
|
12
|
+
"Expired token refresh limit": "Expired token refresh limit",
|
|
13
|
+
"Hours": "Hours",
|
|
14
|
+
"In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.": "In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.",
|
|
15
|
+
"Invalid status": "Invalid status",
|
|
16
|
+
"Minutes": "Minutes",
|
|
17
|
+
"No authentication methods available.": "No authentication methods available.",
|
|
18
|
+
"Not a valid cellphone number, please re-enter": "Not a valid cellphone number, please re-enter",
|
|
19
|
+
"Not allowed to sign up": "Not allowed to sign up",
|
|
20
|
+
"Password is not allowed to be changed": "Password is not allowed to be changed",
|
|
21
|
+
"Please enter a valid email": "Please enter a valid email",
|
|
22
|
+
"Please enter a valid username": "Please enter a valid username",
|
|
23
|
+
"Please enter your username or email": "Please enter your username or email",
|
|
24
|
+
"Please keep and enable at least one authenticator": "Please keep and enable at least one authenticator",
|
|
25
|
+
"SMS": "SMS",
|
|
26
|
+
"Saved successfully!": "Saved successfully!",
|
|
27
|
+
"Seconds": "Seconds",
|
|
28
|
+
"Session validity period": "Session validity period",
|
|
29
|
+
"Sign in via email": "Sign in via email",
|
|
30
|
+
"Sign in via password": "Sign in via password",
|
|
31
|
+
"Sign-in": "Sign-in",
|
|
32
|
+
"Status expired, auto restored": "Status expired, auto restored",
|
|
33
|
+
"System error, please contact administrator": "System error, please contact administrator",
|
|
34
|
+
"The authentication allows users to sign in via username or email.": "The authentication allows users to sign in via username or email.",
|
|
35
|
+
"The maximum time limit allowed for refreshing a Token after it expires. After this time limit, the token cannot be automatically renewed, and the user needs to log in again.": "The maximum time limit allowed for refreshing a Token after it expires. After this time limit, the token cannot be automatically renewed, and the user needs to log in again.",
|
|
36
|
+
"The maximum valid time for each user login. During the session validity, the Token will be automatically updated. After the timeout, the user is required to log in again.": "The maximum valid time for each user login. During the session validity, the Token will be automatically updated. After the timeout, the user is required to log in again.",
|
|
37
|
+
"The password is inconsistent, please re-enter": "The password is inconsistent, please re-enter",
|
|
38
|
+
"The password is incorrect, please re-enter": "The password is incorrect, please re-enter",
|
|
39
|
+
"The phone number has been registered, please login directly": "The phone number has been registered, please login directly",
|
|
40
|
+
"The phone number is not registered, please register first": "The phone number is not registered, please register first",
|
|
41
|
+
"The username or email is incorrect, please re-enter": "The username or email is incorrect, please re-enter",
|
|
42
|
+
"The validity period of each issued API Token. After the Token expires, if it is within the session validity period and has not exceeded the refresh limit, the server will automatically issue a new Token to maintain the user session, otherwise the user is required to log in again. (Each Token can only be refreshed once)": "The validity period of each issued API Token. After the Token expires, if it is within the session validity period and has not exceeded the refresh limit, the server will automatically issue a new Token to maintain the user session, otherwise the user is required to log in again. (Each Token can only be refreshed once)",
|
|
43
|
+
"Token policy": "Token policy",
|
|
44
|
+
"Token validity period": "Token validity period",
|
|
45
|
+
"Token validity period must be less than session validity period!": "Token validity period must be less than session validity period!",
|
|
46
|
+
"Unauthenticated. Please sign in to continue.": "Unauthenticated. Please sign in to continue.",
|
|
47
|
+
"Unbind": "Unbind",
|
|
48
|
+
"Unknown status": "Unknown status",
|
|
49
|
+
"User can bind or unbind the sign in type": "User can bind or unbind the sign in type",
|
|
50
|
+
"User not found. Please sign in again to continue.": "User not found. Please sign in again to continue.",
|
|
51
|
+
"User status does not allow login": "User status does not allow login",
|
|
52
|
+
"User status is invalid, please contact administrator": "User status is invalid, please contact administrator",
|
|
53
|
+
"Username/Email": "Username/Email",
|
|
54
|
+
"Your account has been disabled, please contact administrator if you have any questions": "Your account has been disabled, please contact administrator if you have any questions",
|
|
55
|
+
"Your account has been locked due to multiple failed login attempts. Please try again later.": "Your account has been locked due to multiple failed login attempts. Please try again later.",
|
|
56
|
+
"Your account is under review, please wait for administrator approval": "Your account is under review, please wait for administrator approval",
|
|
57
|
+
"Your account status has changed. Please sign in again.": "Your account status has changed. Please sign in again.",
|
|
58
|
+
"Your session has expired. Please sign in again.": "Your session has expired. Please sign in again.",
|
|
59
|
+
"gitea": "Gitea",
|
|
60
|
+
"sms": "SMS",
|
|
61
|
+
"wechat": "WeChat",
|
|
62
|
+
"work-wechat": "WeCom"
|
|
63
|
+
}
|
package/dist/locale/ko_KR.json
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
{
|
|
2
|
-
"Allow to sign in with": "다음으로 로그인 허용",
|
|
3
|
-
"Allow to sign up": "가입 허용",
|
|
4
|
-
"Auth Type": "인증 유형",
|
|
5
|
-
"Auth UID": "인증 UID",
|
|
6
|
-
"Authentication": "인증",
|
|
7
|
-
"Authenticators": "인증기",
|
|
8
|
-
"Invalid status": "상태 오류",
|
|
9
|
-
"No authentication methods available.": "사용 가능한 인증 방법이 없습니다.",
|
|
10
|
-
"Not a valid cellphone number, please re-enter": "유효하지 않은 휴대폰 번호입니다. 다시 입력하세요.",
|
|
11
|
-
"Not allowed to sign up": "가입할 수 없음",
|
|
12
|
-
"Please enter a valid email": "유효한 이메일을 입력하세요.",
|
|
13
|
-
"Please enter a valid username": "유효한 사용자 이름을 입력하세요.",
|
|
14
|
-
"Please enter your username or email": "사용자 이름 또는 이메일을 입력하세요.",
|
|
15
|
-
"Please keep and enable at least one authenticator": "최소한 하나의 인증기를 유지하고 활성화하세요.",
|
|
16
|
-
"SMS": "SMS",
|
|
17
|
-
"Sign in via email": "이메일로 로그인",
|
|
18
|
-
"Sign in via password": "비밀번호로 로그인",
|
|
19
|
-
"Sign-in": "로그인",
|
|
20
|
-
"Status expired, auto restored": "상태가 만료되었습니다. 자동으로 복구되었습니다.",
|
|
21
|
-
"System error, please contact administrator": "시스템 오류입니다. 관리자에게 문의하세요.",
|
|
22
|
-
"The authentication allows users to sign in via username or email.": "이 인증 방식을 사용하면 사용자가 사용자 이름 또는 이메일로 로그인할 수 있습니다.",
|
|
23
|
-
"The password is inconsistent, please re-enter": "비밀번호가 일치하지 않습니다. 다시 입력하세요.",
|
|
24
|
-
"The password is incorrect, please re-enter": "비밀번호가 잘못되었습니다. 다시 입력하세요.",
|
|
25
|
-
"The phone number has been registered, please login directly": "전화번호가 이미 등록되어 있습니다. 직접 로그인하세요.",
|
|
26
|
-
"The phone number is not registered, please register first": "전화번호가 등록되어 있지 않습니다. 먼저 등록하세요.",
|
|
27
|
-
"The username or email is incorrect, please re-enter": "사용자 이름 또는 이메일이 잘못되었습니다. 다시 입력하세요.",
|
|
28
|
-
"Unknown status": "알 수 없는 상태",
|
|
29
|
-
"User status does not allow login": "사용자 상태가 로그인을 허용하지 않습니다.",
|
|
30
|
-
"User status is invalid, please contact administrator": "사용자 상태가 오류입니다. 관리자에게 문의하세요.",
|
|
31
|
-
"Username/Email": "사용자 이름/이메일",
|
|
32
|
-
"Your account has been disabled, please contact administrator if you have any questions": "Your account has been disabled, please contact administrator if you have any questions",
|
|
33
|
-
"Your account has been locked due to multiple failed login attempts. Please try again later.": "Your account has been locked due to multiple failed login attempts. Please try again later.",
|
|
34
|
-
"Your account is under review, please wait for administrator approval": "Your account is under review, please wait for administrator approval",
|
|
35
|
-
"Your account status has changed. Please sign in again.": "사용자 상태가 변경되었습니다. 다시 로그인하세요."
|
|
36
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"Allow to sign in with": "다음으로 로그인 허용",
|
|
3
|
+
"Allow to sign up": "가입 허용",
|
|
4
|
+
"Auth Type": "인증 유형",
|
|
5
|
+
"Auth UID": "인증 UID",
|
|
6
|
+
"Authentication": "인증",
|
|
7
|
+
"Authenticators": "인증기",
|
|
8
|
+
"Invalid status": "상태 오류",
|
|
9
|
+
"No authentication methods available.": "사용 가능한 인증 방법이 없습니다.",
|
|
10
|
+
"Not a valid cellphone number, please re-enter": "유효하지 않은 휴대폰 번호입니다. 다시 입력하세요.",
|
|
11
|
+
"Not allowed to sign up": "가입할 수 없음",
|
|
12
|
+
"Please enter a valid email": "유효한 이메일을 입력하세요.",
|
|
13
|
+
"Please enter a valid username": "유효한 사용자 이름을 입력하세요.",
|
|
14
|
+
"Please enter your username or email": "사용자 이름 또는 이메일을 입력하세요.",
|
|
15
|
+
"Please keep and enable at least one authenticator": "최소한 하나의 인증기를 유지하고 활성화하세요.",
|
|
16
|
+
"SMS": "SMS",
|
|
17
|
+
"Sign in via email": "이메일로 로그인",
|
|
18
|
+
"Sign in via password": "비밀번호로 로그인",
|
|
19
|
+
"Sign-in": "로그인",
|
|
20
|
+
"Status expired, auto restored": "상태가 만료되었습니다. 자동으로 복구되었습니다.",
|
|
21
|
+
"System error, please contact administrator": "시스템 오류입니다. 관리자에게 문의하세요.",
|
|
22
|
+
"The authentication allows users to sign in via username or email.": "이 인증 방식을 사용하면 사용자가 사용자 이름 또는 이메일로 로그인할 수 있습니다.",
|
|
23
|
+
"The password is inconsistent, please re-enter": "비밀번호가 일치하지 않습니다. 다시 입력하세요.",
|
|
24
|
+
"The password is incorrect, please re-enter": "비밀번호가 잘못되었습니다. 다시 입력하세요.",
|
|
25
|
+
"The phone number has been registered, please login directly": "전화번호가 이미 등록되어 있습니다. 직접 로그인하세요.",
|
|
26
|
+
"The phone number is not registered, please register first": "전화번호가 등록되어 있지 않습니다. 먼저 등록하세요.",
|
|
27
|
+
"The username or email is incorrect, please re-enter": "사용자 이름 또는 이메일이 잘못되었습니다. 다시 입력하세요.",
|
|
28
|
+
"Unknown status": "알 수 없는 상태",
|
|
29
|
+
"User status does not allow login": "사용자 상태가 로그인을 허용하지 않습니다.",
|
|
30
|
+
"User status is invalid, please contact administrator": "사용자 상태가 오류입니다. 관리자에게 문의하세요.",
|
|
31
|
+
"Username/Email": "사용자 이름/이메일",
|
|
32
|
+
"Your account has been disabled, please contact administrator if you have any questions": "Your account has been disabled, please contact administrator if you have any questions",
|
|
33
|
+
"Your account has been locked due to multiple failed login attempts. Please try again later.": "Your account has been locked due to multiple failed login attempts. Please try again later.",
|
|
34
|
+
"Your account is under review, please wait for administrator approval": "Your account is under review, please wait for administrator approval",
|
|
35
|
+
"Your account status has changed. Please sign in again.": "사용자 상태가 변경되었습니다. 다시 로그인하세요."
|
|
36
|
+
}
|
package/dist/locale/zh-CN.json
CHANGED
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
{
|
|
2
|
-
"Allow to sign in with": "允许使用以下方式登录",
|
|
3
|
-
"Allow to sign up": "允许注册",
|
|
4
|
-
"Are you sure to unbind this authenticator?": "确定要解绑该认证器吗?",
|
|
5
|
-
"Auth Type": "认证类型",
|
|
6
|
-
"Auth UID": "认证标识",
|
|
7
|
-
"Authentication": "认证方式",
|
|
8
|
-
"Authentication login bind": "认证登录绑定",
|
|
9
|
-
"Authenticators": "认证器",
|
|
10
|
-
"Bind": "绑定",
|
|
11
|
-
"Days": "天",
|
|
12
|
-
"Expired token refresh limit": "过期 Token 刷新时限",
|
|
13
|
-
"Hours": "小时",
|
|
14
|
-
"Invalid status": "状态异常",
|
|
15
|
-
"Minutes": "分钟",
|
|
16
|
-
"No authentication methods available.": "没有可用的认证方式。",
|
|
17
|
-
"Not a valid cellphone number, please re-enter": "不是有效的手机号,请重新输入",
|
|
18
|
-
"Not allowed to sign up": "禁止注册",
|
|
19
|
-
"Password is not allowed to be changed": "密码不允许修改",
|
|
20
|
-
"Please enter a valid email": "请输入有效的邮箱",
|
|
21
|
-
"Please enter a valid username": "请输入有效的用户名",
|
|
22
|
-
"Please enter your username or email": "请输入用户名或邮箱",
|
|
23
|
-
"Please keep and enable at least one authenticator": "请至少保留并启用一个认证器",
|
|
24
|
-
"SMS": "短信",
|
|
25
|
-
"Saved successfully!": "保存成功!",
|
|
26
|
-
"Seconds": "秒",
|
|
27
|
-
"Session validity period": "会话有效期",
|
|
28
|
-
"Sign in via email": "邮箱登录",
|
|
29
|
-
"Sign in via password": "密码登录",
|
|
30
|
-
"Sign-in": "登录",
|
|
31
|
-
"Status expired, auto restored": "状态已过期,自动恢复",
|
|
32
|
-
"System error, please contact administrator": "系统错误,请联系管理员",
|
|
33
|
-
"The authentication allows users to sign in via username or email.": "该认证方式支持用户通过用户名或邮箱登录。",
|
|
34
|
-
"The maximum time limit allowed for refreshing a Token after it expires. After this time limit, the token cannot be automatically renewed, and the user needs to log in again.": "Token 过期后允许刷新的最大时限,超过此时限后,Token 无法自动更新,用户需重新登录。",
|
|
35
|
-
"The maximum valid time for each user login. During the session validity, the Token will be automatically updated. After the timeout, the user is required to log in again.": "用户每次登录的最长有效时间,在会话有效期内,Token 会自动更新,超时后要求用户重新登录。",
|
|
36
|
-
"The password is inconsistent, please re-enter": "密码不一致,请重新输入",
|
|
37
|
-
"The password is incorrect, please re-enter": "密码有误,请重新输入",
|
|
38
|
-
"The phone number has been registered, please login directly": "手机号已注册,请直接登录",
|
|
39
|
-
"The phone number is not registered, please register first": "手机号未注册,请先注册",
|
|
40
|
-
"The username or email is incorrect, please re-enter": "用户名或邮箱有误,请重新输入",
|
|
41
|
-
"The validity period of each issued API Token. After the Token expires, if it is within the session validity period and has not exceeded the refresh limit, the server will automatically issue a new Token to maintain the user session, otherwise the user is required to log in again. (Each Token can only be refreshed once)": "每次签发的 API Token 的有效期。Token 过期后,如果处于会话有效期内,并且没有超过刷新时限,服务端将自动签发新 Token 以保持用户会话,否则要求用户重新登录。(每个 Token 只能被刷新一次)",
|
|
42
|
-
"Token policy": "Token 策略",
|
|
43
|
-
"Token validity period": "Token 有效期",
|
|
44
|
-
"Token validity period must be less than session validity period!": "Token 有效期必须小于会话有效期!",
|
|
45
|
-
"Unauthenticated. Please sign in to continue.": "未认证。请登录以继续。",
|
|
46
|
-
"Unbind": "解绑",
|
|
47
|
-
"Unknown status": "未知状态",
|
|
48
|
-
"User can bind or unbind the sign in type": "用户可以绑定或解绑登录方式",
|
|
49
|
-
"User not found. Please sign in again to continue.": "用户不存在。请重新登录以继续。",
|
|
50
|
-
"User status does not allow login": "用户状态不允许登录",
|
|
51
|
-
"User status is invalid, please contact administrator": "用户状态异常,请联系管理员",
|
|
52
|
-
"Username/Email": "用户名/邮箱",
|
|
53
|
-
"WeChat": "微信",
|
|
54
|
-
"Your account has been disabled, please contact administrator if you have any questions": "您的账户已被停用,如有疑问请联系管理员",
|
|
55
|
-
"Your account has been locked due to multiple failed login attempts. Please try again later.": "您的账户因多次登录失败已被锁定,请稍后再试",
|
|
56
|
-
"Your account is under review, please wait for administrator approval": "您的账户正在审核中,请等待管理员审核通过",
|
|
57
|
-
"Your account status has changed. Please sign in again.": "您的账号状态已变更,请重新登录",
|
|
58
|
-
"Your session has expired. Please sign in again.": "您的会话已过期,请重新登录。",
|
|
59
|
-
"gitea": "Gitea 验证登录",
|
|
60
|
-
"sms": "短信验证",
|
|
61
|
-
"wechat": "微信登录",
|
|
62
|
-
"work-wechat": "企业微信登录"
|
|
63
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"Allow to sign in with": "允许使用以下方式登录",
|
|
3
|
+
"Allow to sign up": "允许注册",
|
|
4
|
+
"Are you sure to unbind this authenticator?": "确定要解绑该认证器吗?",
|
|
5
|
+
"Auth Type": "认证类型",
|
|
6
|
+
"Auth UID": "认证标识",
|
|
7
|
+
"Authentication": "认证方式",
|
|
8
|
+
"Authentication login bind": "认证登录绑定",
|
|
9
|
+
"Authenticators": "认证器",
|
|
10
|
+
"Bind": "绑定",
|
|
11
|
+
"Days": "天",
|
|
12
|
+
"Expired token refresh limit": "过期 Token 刷新时限",
|
|
13
|
+
"Hours": "小时",
|
|
14
|
+
"Invalid status": "状态异常",
|
|
15
|
+
"Minutes": "分钟",
|
|
16
|
+
"No authentication methods available.": "没有可用的认证方式。",
|
|
17
|
+
"Not a valid cellphone number, please re-enter": "不是有效的手机号,请重新输入",
|
|
18
|
+
"Not allowed to sign up": "禁止注册",
|
|
19
|
+
"Password is not allowed to be changed": "密码不允许修改",
|
|
20
|
+
"Please enter a valid email": "请输入有效的邮箱",
|
|
21
|
+
"Please enter a valid username": "请输入有效的用户名",
|
|
22
|
+
"Please enter your username or email": "请输入用户名或邮箱",
|
|
23
|
+
"Please keep and enable at least one authenticator": "请至少保留并启用一个认证器",
|
|
24
|
+
"SMS": "短信",
|
|
25
|
+
"Saved successfully!": "保存成功!",
|
|
26
|
+
"Seconds": "秒",
|
|
27
|
+
"Session validity period": "会话有效期",
|
|
28
|
+
"Sign in via email": "邮箱登录",
|
|
29
|
+
"Sign in via password": "密码登录",
|
|
30
|
+
"Sign-in": "登录",
|
|
31
|
+
"Status expired, auto restored": "状态已过期,自动恢复",
|
|
32
|
+
"System error, please contact administrator": "系统错误,请联系管理员",
|
|
33
|
+
"The authentication allows users to sign in via username or email.": "该认证方式支持用户通过用户名或邮箱登录。",
|
|
34
|
+
"The maximum time limit allowed for refreshing a Token after it expires. After this time limit, the token cannot be automatically renewed, and the user needs to log in again.": "Token 过期后允许刷新的最大时限,超过此时限后,Token 无法自动更新,用户需重新登录。",
|
|
35
|
+
"The maximum valid time for each user login. During the session validity, the Token will be automatically updated. After the timeout, the user is required to log in again.": "用户每次登录的最长有效时间,在会话有效期内,Token 会自动更新,超时后要求用户重新登录。",
|
|
36
|
+
"The password is inconsistent, please re-enter": "密码不一致,请重新输入",
|
|
37
|
+
"The password is incorrect, please re-enter": "密码有误,请重新输入",
|
|
38
|
+
"The phone number has been registered, please login directly": "手机号已注册,请直接登录",
|
|
39
|
+
"The phone number is not registered, please register first": "手机号未注册,请先注册",
|
|
40
|
+
"The username or email is incorrect, please re-enter": "用户名或邮箱有误,请重新输入",
|
|
41
|
+
"The validity period of each issued API Token. After the Token expires, if it is within the session validity period and has not exceeded the refresh limit, the server will automatically issue a new Token to maintain the user session, otherwise the user is required to log in again. (Each Token can only be refreshed once)": "每次签发的 API Token 的有效期。Token 过期后,如果处于会话有效期内,并且没有超过刷新时限,服务端将自动签发新 Token 以保持用户会话,否则要求用户重新登录。(每个 Token 只能被刷新一次)",
|
|
42
|
+
"Token policy": "Token 策略",
|
|
43
|
+
"Token validity period": "Token 有效期",
|
|
44
|
+
"Token validity period must be less than session validity period!": "Token 有效期必须小于会话有效期!",
|
|
45
|
+
"Unauthenticated. Please sign in to continue.": "未认证。请登录以继续。",
|
|
46
|
+
"Unbind": "解绑",
|
|
47
|
+
"Unknown status": "未知状态",
|
|
48
|
+
"User can bind or unbind the sign in type": "用户可以绑定或解绑登录方式",
|
|
49
|
+
"User not found. Please sign in again to continue.": "用户不存在。请重新登录以继续。",
|
|
50
|
+
"User status does not allow login": "用户状态不允许登录",
|
|
51
|
+
"User status is invalid, please contact administrator": "用户状态异常,请联系管理员",
|
|
52
|
+
"Username/Email": "用户名/邮箱",
|
|
53
|
+
"WeChat": "微信",
|
|
54
|
+
"Your account has been disabled, please contact administrator if you have any questions": "您的账户已被停用,如有疑问请联系管理员",
|
|
55
|
+
"Your account has been locked due to multiple failed login attempts. Please try again later.": "您的账户因多次登录失败已被锁定,请稍后再试",
|
|
56
|
+
"Your account is under review, please wait for administrator approval": "您的账户正在审核中,请等待管理员审核通过",
|
|
57
|
+
"Your account status has changed. Please sign in again.": "您的账号状态已变更,请重新登录",
|
|
58
|
+
"Your session has expired. Please sign in again.": "您的会话已过期,请重新登录。",
|
|
59
|
+
"gitea": "Gitea 验证登录",
|
|
60
|
+
"sms": "短信验证",
|
|
61
|
+
"wechat": "微信登录",
|
|
62
|
+
"work-wechat": "企业微信登录"
|
|
63
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"cron","description":"Cron jobs for your node","version":"3.3.1","author":"Nick Campbell <nicholas.j.campbell@gmail.com> (https://github.com/ncb000gt)","bugs":{"url":"https://github.com/kelektiv/node-cron/issues"},"repository":{"type":"git","url":"https://github.com/kelektiv/node-cron.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc -b tsconfig.build.json","lint:eslint":"eslint src/ tests/","lint:prettier":"prettier ./**/*.{json,md,yml} --check","lint":"npm run lint:eslint && npm run lint:prettier","lint:fix":"npm run lint:eslint -- --fix && npm run lint:prettier -- --write","test":"jest --coverage","test:watch":"jest --watch --coverage","test:fuzz":"jest --testMatch='**/*.fuzz.ts' --coverage=false --testTimeout=120000","prepare":"husky"},"dependencies":{"@types/luxon":"~3.4.0","luxon":"~3.5.0"},"devDependencies":{"@commitlint/cli":"19.6.0","@eslint/js":"^9.14.0","@fast-check/jest":"2.0.3","@insurgent/commitlint-config":"20.0.0","@insurgent/conventional-changelog-preset":"10.0.0","@semantic-release/changelog":"6.0.3","@semantic-release/commit-analyzer":"13.0.0","@semantic-release/git":"10.0.1","@semantic-release/github":"11.0.1","@semantic-release/npm":"12.0.1","@semantic-release/release-notes-generator":"14.0.1","@types/jest":"29.5.14","@types/node":"20.17.9","@types/sinon":"17.0.3","chai":"4.5.0","eslint":"8.57.1","eslint-config-prettier":"9.1.0","eslint-plugin-jest":"27.9.0","eslint-plugin-prettier":"5.2.1","husky":"9.1.7","jest":"29.7.0","lint-staged":"15.2.10","prettier":"3.3.3","semantic-release":"24.2.0","sinon":"17.0.2","ts-jest":"29.2.5","typescript":"5.7.2","typescript-eslint":"^7.2.0"},"keywords":["cron","node cron","node-cron","schedule","scheduler","cronjob","cron job"],"license":"MIT","contributors":["Brandon der Blätter <https://interlucid.com/contact/> (https://github.com/intcreator)","Pierre Cavin <me@sherlox.io> (https://github.com/sheerlox)","Romain Beauxis <toots@rastageeks.org> (https://github.com/toots)","James Padolsey <> (https://github.com/jamespadolsey)","Finn Herpich <fh@three-heads.de> (https://github.com/ErrorProne)","Clifton Cunningham <clifton.cunningham@gmail.com> (https://github.com/cliftonc)","Eric Abouaf <eric.abouaf@gmail.com> (https://github.com/neyric)","humanchimp <morphcham@gmail.com> (https://github.com/humanchimp)","Craig Condon <craig@spiceapps.com> (https://github.com/spiceapps)","Dan Bear <daniel@hulu.com> (https://github.com/danhbear)","Vadim Baryshev <vadimbaryshev@gmail.com> (https://github.com/baryshev)","Leandro Ferrari <lfthomaz@gmail.com> (https://github.com/lfthomaz)","Gregg Zigler <greggzigler@gmail.com> (https://github.com/greggzigler)","Jordan Abderrachid <jabderrachid@gmail.com> (https://github.com/jordanabderrachid)","Masakazu Matsushita <matsukaz@gmail.com> (matsukaz)","Christopher Lunt <me@kirisu.co.uk> (https://github.com/kirisu)"],"files":["dist/**/*.js","dist/**/*.d.ts","CHANGELOG.md","LICENSE","README.md"],"lint-staged":{"*.ts":"eslint src/ tests/ --fix","*.{json,md,yml}":"prettier ./**/*.{json,md,yml} --check --write"},"_lastModified":"2025-12-
|
|
1
|
+
{"name":"cron","description":"Cron jobs for your node","version":"3.3.1","author":"Nick Campbell <nicholas.j.campbell@gmail.com> (https://github.com/ncb000gt)","bugs":{"url":"https://github.com/kelektiv/node-cron/issues"},"repository":{"type":"git","url":"https://github.com/kelektiv/node-cron.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc -b tsconfig.build.json","lint:eslint":"eslint src/ tests/","lint:prettier":"prettier ./**/*.{json,md,yml} --check","lint":"npm run lint:eslint && npm run lint:prettier","lint:fix":"npm run lint:eslint -- --fix && npm run lint:prettier -- --write","test":"jest --coverage","test:watch":"jest --watch --coverage","test:fuzz":"jest --testMatch='**/*.fuzz.ts' --coverage=false --testTimeout=120000","prepare":"husky"},"dependencies":{"@types/luxon":"~3.4.0","luxon":"~3.5.0"},"devDependencies":{"@commitlint/cli":"19.6.0","@eslint/js":"^9.14.0","@fast-check/jest":"2.0.3","@insurgent/commitlint-config":"20.0.0","@insurgent/conventional-changelog-preset":"10.0.0","@semantic-release/changelog":"6.0.3","@semantic-release/commit-analyzer":"13.0.0","@semantic-release/git":"10.0.1","@semantic-release/github":"11.0.1","@semantic-release/npm":"12.0.1","@semantic-release/release-notes-generator":"14.0.1","@types/jest":"29.5.14","@types/node":"20.17.9","@types/sinon":"17.0.3","chai":"4.5.0","eslint":"8.57.1","eslint-config-prettier":"9.1.0","eslint-plugin-jest":"27.9.0","eslint-plugin-prettier":"5.2.1","husky":"9.1.7","jest":"29.7.0","lint-staged":"15.2.10","prettier":"3.3.3","semantic-release":"24.2.0","sinon":"17.0.2","ts-jest":"29.2.5","typescript":"5.7.2","typescript-eslint":"^7.2.0"},"keywords":["cron","node cron","node-cron","schedule","scheduler","cronjob","cron job"],"license":"MIT","contributors":["Brandon der Blätter <https://interlucid.com/contact/> (https://github.com/intcreator)","Pierre Cavin <me@sherlox.io> (https://github.com/sheerlox)","Romain Beauxis <toots@rastageeks.org> (https://github.com/toots)","James Padolsey <> (https://github.com/jamespadolsey)","Finn Herpich <fh@three-heads.de> (https://github.com/ErrorProne)","Clifton Cunningham <clifton.cunningham@gmail.com> (https://github.com/cliftonc)","Eric Abouaf <eric.abouaf@gmail.com> (https://github.com/neyric)","humanchimp <morphcham@gmail.com> (https://github.com/humanchimp)","Craig Condon <craig@spiceapps.com> (https://github.com/spiceapps)","Dan Bear <daniel@hulu.com> (https://github.com/danhbear)","Vadim Baryshev <vadimbaryshev@gmail.com> (https://github.com/baryshev)","Leandro Ferrari <lfthomaz@gmail.com> (https://github.com/lfthomaz)","Gregg Zigler <greggzigler@gmail.com> (https://github.com/greggzigler)","Jordan Abderrachid <jabderrachid@gmail.com> (https://github.com/jordanabderrachid)","Masakazu Matsushita <matsukaz@gmail.com> (matsukaz)","Christopher Lunt <me@kirisu.co.uk> (https://github.com/kirisu)"],"files":["dist/**/*.js","dist/**/*.d.ts","CHANGELOG.md","LICENSE","README.md"],"lint-staged":{"*.ts":"eslint src/ tests/ --fix","*.{json,md,yml}":"prettier ./**/*.{json,md,yml} --check --write"},"_lastModified":"2025-12-26T04:40:08.648Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"ms","version":"2.1.3","description":"Tiny millisecond conversion utility","repository":"vercel/ms","main":"./index","files":["index.js"],"scripts":{"precommit":"lint-staged","lint":"eslint lib/* bin/*","test":"mocha tests.js"},"eslintConfig":{"extends":"eslint:recommended","env":{"node":true,"es6":true}},"lint-staged":{"*.js":["npm run lint","prettier --single-quote --write","git add"]},"license":"MIT","devDependencies":{"eslint":"4.18.2","expect.js":"0.3.1","husky":"0.14.3","lint-staged":"5.0.0","mocha":"4.0.1","prettier":"2.0.5"},"_lastModified":"2025-12-
|
|
1
|
+
{"name":"ms","version":"2.1.3","description":"Tiny millisecond conversion utility","repository":"vercel/ms","main":"./index","files":["index.js"],"scripts":{"precommit":"lint-staged","lint":"eslint lib/* bin/*","test":"mocha tests.js"},"eslintConfig":{"extends":"eslint:recommended","env":{"node":true,"es6":true}},"lint-staged":{"*.js":["npm run lint","prettier --single-quote --write","git add"]},"license":"MIT","devDependencies":{"eslint":"4.18.2","expect.js":"0.3.1","husky":"0.14.3","lint-staged":"5.0.0","mocha":"4.0.1","prettier":"2.0.5"},"_lastModified":"2025-12-26T04:40:08.750Z"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tachybase/module-auth",
|
|
3
3
|
"displayName": "Authentication",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.3",
|
|
5
5
|
"description": "User authentication management, including password, SMS, and support for Single Sign-On (SSO) protocols, with extensibility.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"Authentication",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"react": "18.3.1",
|
|
24
24
|
"react-i18next": "16.2.1",
|
|
25
25
|
"react-router-dom": "6.28.1",
|
|
26
|
-
"@tachybase/client": "1.6.
|
|
26
|
+
"@tachybase/client": "1.6.3"
|
|
27
27
|
},
|
|
28
28
|
"description.zh-CN": "用户认证管理,包括基础的密码认证、短信认证、SSO 协议的认证等,可扩展。",
|
|
29
29
|
"displayName.zh-CN": "用户认证",
|
package/server.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './dist/server';
|
|
2
|
-
export { default } from './dist/server';
|
|
1
|
+
export * from './dist/server';
|
|
2
|
+
export { default } from './dist/server';
|
package/server.js
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
4
|
-
if (typeof WeakMap !== 'function') return null;
|
|
5
|
-
var cacheBabelInterop = new WeakMap();
|
|
6
|
-
var cacheNodeInterop = new WeakMap();
|
|
7
|
-
return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
|
|
8
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
9
|
-
})(nodeInterop);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function _interopRequireWildcard(obj, nodeInterop) {
|
|
13
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
14
|
-
return obj;
|
|
15
|
-
}
|
|
16
|
-
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
|
17
|
-
return { default: obj };
|
|
18
|
-
}
|
|
19
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
20
|
-
if (cache && cache.has(obj)) {
|
|
21
|
-
return cache.get(obj);
|
|
22
|
-
}
|
|
23
|
-
var newObj = {};
|
|
24
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
25
|
-
for (var key in obj) {
|
|
26
|
-
if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
27
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
28
|
-
if (desc && (desc.get || desc.set)) {
|
|
29
|
-
Object.defineProperty(newObj, key, desc);
|
|
30
|
-
} else {
|
|
31
|
-
newObj[key] = obj[key];
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
newObj.default = obj;
|
|
36
|
-
if (cache) {
|
|
37
|
-
cache.set(obj, newObj);
|
|
38
|
-
}
|
|
39
|
-
return newObj;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
var _index = _interopRequireWildcard(require('./dist/server'));
|
|
43
|
-
|
|
44
|
-
Object.defineProperty(exports, '__esModule', {
|
|
45
|
-
value: true,
|
|
46
|
-
});
|
|
47
|
-
var _exportNames = {};
|
|
48
|
-
Object.defineProperty(exports, 'default', {
|
|
49
|
-
enumerable: true,
|
|
50
|
-
get: function get() {
|
|
51
|
-
return _index.default;
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
Object.keys(_index).forEach(function (key) {
|
|
56
|
-
if (key === 'default' || key === '__esModule') return;
|
|
57
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
58
|
-
if (key in exports && exports[key] === _index[key]) return;
|
|
59
|
-
Object.defineProperty(exports, key, {
|
|
60
|
-
enumerable: true,
|
|
61
|
-
get: function get() {
|
|
62
|
-
return _index[key];
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
});
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
4
|
+
if (typeof WeakMap !== 'function') return null;
|
|
5
|
+
var cacheBabelInterop = new WeakMap();
|
|
6
|
+
var cacheNodeInterop = new WeakMap();
|
|
7
|
+
return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
|
|
8
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
9
|
+
})(nodeInterop);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
13
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
|
17
|
+
return { default: obj };
|
|
18
|
+
}
|
|
19
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
20
|
+
if (cache && cache.has(obj)) {
|
|
21
|
+
return cache.get(obj);
|
|
22
|
+
}
|
|
23
|
+
var newObj = {};
|
|
24
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
25
|
+
for (var key in obj) {
|
|
26
|
+
if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
27
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
28
|
+
if (desc && (desc.get || desc.set)) {
|
|
29
|
+
Object.defineProperty(newObj, key, desc);
|
|
30
|
+
} else {
|
|
31
|
+
newObj[key] = obj[key];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
newObj.default = obj;
|
|
36
|
+
if (cache) {
|
|
37
|
+
cache.set(obj, newObj);
|
|
38
|
+
}
|
|
39
|
+
return newObj;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
var _index = _interopRequireWildcard(require('./dist/server'));
|
|
43
|
+
|
|
44
|
+
Object.defineProperty(exports, '__esModule', {
|
|
45
|
+
value: true,
|
|
46
|
+
});
|
|
47
|
+
var _exportNames = {};
|
|
48
|
+
Object.defineProperty(exports, 'default', {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function get() {
|
|
51
|
+
return _index.default;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
Object.keys(_index).forEach(function (key) {
|
|
56
|
+
if (key === 'default' || key === '__esModule') return;
|
|
57
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
58
|
+
if (key in exports && exports[key] === _index[key]) return;
|
|
59
|
+
Object.defineProperty(exports, key, {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
get: function get() {
|
|
62
|
+
return _index[key];
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
});
|