@nocobase/plugin-api-keys 0.10.1-alpha.1
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 +9 -0
- package/README.zh-CN.md +9 -0
- package/client.d.ts +4 -0
- package/client.js +30 -0
- package/docs/en-US/changelog.md +1 -0
- package/docs/en-US/index.md +9 -0
- package/docs/en-US/tabs.json +14 -0
- package/docs/en-US/usage.md +19 -0
- package/docs/zh-CN/changelog.md +1 -0
- package/docs/zh-CN/index.md +10 -0
- package/docs/zh-CN/tabs.json +14 -0
- package/docs/zh-CN/usage.md +19 -0
- package/lib/client/Configuration/ExpiresSelect.d.ts +3 -0
- package/lib/client/Configuration/ExpiresSelect.js +131 -0
- package/lib/client/Configuration/index.d.ts +2 -0
- package/lib/client/Configuration/index.js +47 -0
- package/lib/client/Configuration/roles.d.ts +3 -0
- package/lib/client/Configuration/roles.js +20 -0
- package/lib/client/Configuration/schema.d.ts +2 -0
- package/lib/client/Configuration/schema.js +319 -0
- package/lib/client/index.d.ts +3 -0
- package/lib/client/index.js +46 -0
- package/lib/client/locale/en-US.d.ts +2 -0
- package/lib/client/locale/en-US.js +9 -0
- package/lib/client/locale/index.d.ts +2 -0
- package/lib/client/locale/index.js +32 -0
- package/lib/client/locale/zh-CN.d.ts +19 -0
- package/lib/client/locale/zh-CN.js +26 -0
- package/lib/collections/api-keys.d.ts +3 -0
- package/lib/collections/api-keys.js +87 -0
- package/lib/collections/index.d.ts +1 -0
- package/lib/collections/index.js +13 -0
- package/lib/constants.d.ts +1 -0
- package/lib/constants.js +8 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +13 -0
- package/lib/locale.d.ts +1 -0
- package/lib/locale.js +10 -0
- package/lib/server/actions/api-keys.d.ts +3 -0
- package/lib/server/actions/api-keys.js +71 -0
- package/lib/server/index.d.ts +1 -0
- package/lib/server/index.js +13 -0
- package/lib/server/locale/en-US.d.ts +2 -0
- package/lib/server/locale/en-US.js +8 -0
- package/lib/server/locale/index.d.ts +2 -0
- package/lib/server/locale/index.js +20 -0
- package/lib/server/locale/zh-CN.d.ts +4 -0
- package/lib/server/locale/zh-CN.js +10 -0
- package/lib/server/plugin.d.ts +10 -0
- package/lib/server/plugin.js +77 -0
- package/package.json +24 -0
- package/server.d.ts +4 -0
- package/server.js +30 -0
- package/src/client/Configuration/ExpiresSelect.tsx +80 -0
- package/src/client/Configuration/index.tsx +18 -0
- package/src/client/Configuration/roles.ts +9 -0
- package/src/client/Configuration/schema.tsx +264 -0
- package/src/client/index.tsx +29 -0
- package/src/client/locale/en-US.ts +3 -0
- package/src/client/locale/index.ts +13 -0
- package/src/client/locale/zh-CN.ts +21 -0
- package/src/collections/api-keys.ts +95 -0
- package/src/collections/index.ts +1 -0
- package/src/constants.ts +1 -0
- package/src/index.ts +1 -0
- package/src/locale.ts +5 -0
- package/src/server/__tests__/actions.test.ts +181 -0
- package/src/server/actions/api-keys.ts +49 -0
- package/src/server/index.ts +1 -0
- package/src/server/locale/en-US.ts +1 -0
- package/src/server/locale/index.ts +2 -0
- package/src/server/locale/zh-CN.ts +3 -0
- package/src/server/plugin.ts +53 -0
package/README.md
ADDED
package/README.zh-CN.md
ADDED
package/client.d.ts
ADDED
package/client.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
4
|
+
|
|
5
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
6
|
+
|
|
7
|
+
var _index = _interopRequireWildcard(require("./lib/client"));
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(exports, "__esModule", {
|
|
10
|
+
value: true
|
|
11
|
+
});
|
|
12
|
+
var _exportNames = {};
|
|
13
|
+
Object.defineProperty(exports, "default", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function get() {
|
|
16
|
+
return _index.default;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
Object.keys(_index).forEach(function (key) {
|
|
21
|
+
if (key === "default" || key === "__esModule") return;
|
|
22
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
23
|
+
if (key in exports && exports[key] === _index[key]) return;
|
|
24
|
+
Object.defineProperty(exports, key, {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function get() {
|
|
27
|
+
return _index[key];
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# API keys Changelog
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# API keys
|
|
2
|
+
|
|
3
|
+
## Introduction
|
|
4
|
+
|
|
5
|
+
This plugin allows you to create and manage API keys. The generated API key can be used to access all `NocoBase` APIs.
|
|
6
|
+
|
|
7
|
+
## Access Control
|
|
8
|
+
|
|
9
|
+
When creating an API key, you can bind it to a role, and the role's permissions will be the same as the Key's permissions.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# API keys Usage
|
|
2
|
+
|
|
3
|
+
## Creating an API key
|
|
4
|
+
|
|
5
|
+
After enabling the plugin, go to the API keys plugin management page, click `Add API key`, fill in the relevant information, and click Save to create an API key.
|
|
6
|
+
|
|
7
|
+
## Using an API key
|
|
8
|
+
|
|
9
|
+
Add the `Authorization` field to the request header, with the value of `Bearer ${API_KEY}`, to access all `NocoBase` APIs using the API key.
|
|
10
|
+
|
|
11
|
+
Here's an example using cURL:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
curl '{domain}/api/roles:check' -H 'Authorization: Bearer {API key}'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Deleting an API key
|
|
18
|
+
|
|
19
|
+
After deleting the API key, it will no longer be usable.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# API keys 更新日志
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# API keys 使用方法
|
|
2
|
+
|
|
3
|
+
## 创建 API key
|
|
4
|
+
|
|
5
|
+
当你启用插件后,前往 API keys 的插件管理页面,点击 `添加 API key` 并填写相关信息,点击 `保存` 即可创建 API key。
|
|
6
|
+
|
|
7
|
+
## 使用 API key
|
|
8
|
+
|
|
9
|
+
在请求头中添加 `Authorization` 字段,值为 `Bearer ${API_KEY}`,即可使用 API key 访问 `NocoBase` 所有 API。
|
|
10
|
+
|
|
11
|
+
cURL 的例子如下
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
curl '{domain}/api/roles:check' -H 'Authorization: Bearer {API key}'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 删除 API key
|
|
18
|
+
|
|
19
|
+
删除 API key 后,该 Key 将无法继续使用。
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ExpiresSelect = void 0;
|
|
7
|
+
function _css() {
|
|
8
|
+
const data = require("@emotion/css");
|
|
9
|
+
_css = function _css() {
|
|
10
|
+
return data;
|
|
11
|
+
};
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
function _react() {
|
|
15
|
+
const data = require("@formily/react");
|
|
16
|
+
_react = function _react() {
|
|
17
|
+
return data;
|
|
18
|
+
};
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
function _client() {
|
|
22
|
+
const data = require("@nocobase/client");
|
|
23
|
+
_client = function _client() {
|
|
24
|
+
return data;
|
|
25
|
+
};
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
function _ahooks() {
|
|
29
|
+
const data = require("ahooks");
|
|
30
|
+
_ahooks = function _ahooks() {
|
|
31
|
+
return data;
|
|
32
|
+
};
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
function _antd() {
|
|
36
|
+
const data = require("antd");
|
|
37
|
+
_antd = function _antd() {
|
|
38
|
+
return data;
|
|
39
|
+
};
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
function _moment() {
|
|
43
|
+
const data = _interopRequireDefault(require("moment"));
|
|
44
|
+
_moment = function _moment() {
|
|
45
|
+
return data;
|
|
46
|
+
};
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
function _react2() {
|
|
50
|
+
const data = _interopRequireWildcard(require("react"));
|
|
51
|
+
_react2 = function _react2() {
|
|
52
|
+
return data;
|
|
53
|
+
};
|
|
54
|
+
return data;
|
|
55
|
+
}
|
|
56
|
+
var _locale = require("../locale");
|
|
57
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
58
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
59
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
60
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
61
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
62
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
63
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
64
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
65
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
66
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
67
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
68
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
69
|
+
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
70
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
71
|
+
const TOMORROW = (0, _moment().default)().add(1, 'days');
|
|
72
|
+
const spaceCSS = (0, _css().css)`
|
|
73
|
+
width: 100%;
|
|
74
|
+
& > .ant-space-item {
|
|
75
|
+
flex: 1;
|
|
76
|
+
}
|
|
77
|
+
`;
|
|
78
|
+
const InternalExpiresSelect = props => {
|
|
79
|
+
const onChange = props.onChange;
|
|
80
|
+
const _useBoolean = (0, _ahooks().useBoolean)(),
|
|
81
|
+
_useBoolean2 = _slicedToArray(_useBoolean, 2),
|
|
82
|
+
isCustom = _useBoolean2[0],
|
|
83
|
+
_useBoolean2$ = _useBoolean2[1],
|
|
84
|
+
toggleShowDatePicker = _useBoolean2$.toggle,
|
|
85
|
+
setFalse = _useBoolean2$.setFalse;
|
|
86
|
+
const onSelectChange = v => {
|
|
87
|
+
if (v === 'custom') {
|
|
88
|
+
onChange('1d');
|
|
89
|
+
return toggleShowDatePicker();
|
|
90
|
+
} else {
|
|
91
|
+
setFalse();
|
|
92
|
+
onChange(v);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const onDatePickerChange = v => {
|
|
96
|
+
v = v.milliseconds(0).second(0);
|
|
97
|
+
const NOW = (0, _moment().default)().milliseconds(0).seconds(0);
|
|
98
|
+
const value = `${v.diff(NOW, 'd')}d`;
|
|
99
|
+
onChange(value);
|
|
100
|
+
};
|
|
101
|
+
return _react2().default.createElement(_antd().Space, {
|
|
102
|
+
className: spaceCSS
|
|
103
|
+
}, _react2().default.createElement(_antd().Select, _objectSpread(_objectSpread({}, props), {}, {
|
|
104
|
+
value: isCustom ? 'custom' : props.value,
|
|
105
|
+
onChange: onSelectChange
|
|
106
|
+
})), isCustom ? _react2().default.createElement(_antd().DatePicker, {
|
|
107
|
+
disabledDate: time => {
|
|
108
|
+
return time.isSameOrBefore();
|
|
109
|
+
},
|
|
110
|
+
defaultValue: TOMORROW,
|
|
111
|
+
onChange: onDatePickerChange,
|
|
112
|
+
showToday: false,
|
|
113
|
+
allowClear: false
|
|
114
|
+
}) : null);
|
|
115
|
+
};
|
|
116
|
+
const ReadPretty = () => {
|
|
117
|
+
const _useRecord = (0, _client().useRecord)(),
|
|
118
|
+
expiresIn = _useRecord.expiresIn,
|
|
119
|
+
createdAt = _useRecord.createdAt;
|
|
120
|
+
const _useTranslation = (0, _locale.useTranslation)(),
|
|
121
|
+
t = _useTranslation.t;
|
|
122
|
+
const expiresDate = (0, _react2().useMemo)(() => {
|
|
123
|
+
if (expiresIn === 'never') return t('Never expires');
|
|
124
|
+
return (0, _moment().default)(createdAt).add((expiresIn === null || expiresIn === void 0 ? void 0 : expiresIn.replace('d', '')) || 0, 'days').format('YYYY-MM-DD HH:mm:ss');
|
|
125
|
+
}, [createdAt, expiresIn]);
|
|
126
|
+
return _react2().default.createElement(_antd().Typography.Text, null, expiresDate);
|
|
127
|
+
};
|
|
128
|
+
const ExpiresSelect = (0, _react().connect)(InternalExpiresSelect, (0, _react().mapProps)({
|
|
129
|
+
dataSource: 'options'
|
|
130
|
+
}), (0, _react().mapReadPretty)(ReadPretty));
|
|
131
|
+
exports.ExpiresSelect = ExpiresSelect;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Configuration = void 0;
|
|
7
|
+
function _react() {
|
|
8
|
+
const data = require("@formily/react");
|
|
9
|
+
_react = function _react() {
|
|
10
|
+
return data;
|
|
11
|
+
};
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
function _client() {
|
|
15
|
+
const data = require("@nocobase/client");
|
|
16
|
+
_client = function _client() {
|
|
17
|
+
return data;
|
|
18
|
+
};
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
function _react2() {
|
|
22
|
+
const data = _interopRequireDefault(require("react"));
|
|
23
|
+
_react2 = function _react2() {
|
|
24
|
+
return data;
|
|
25
|
+
};
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
var _collections = require("../../collections");
|
|
29
|
+
var _ExpiresSelect = require("./ExpiresSelect");
|
|
30
|
+
var _schema = require("./schema");
|
|
31
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
32
|
+
const Configuration = () => {
|
|
33
|
+
const currentRoles = (0, _client().useCurrentRoles)();
|
|
34
|
+
return _react2().default.createElement(_client().CollectionManagerProvider, {
|
|
35
|
+
collections: [_collections.apiKeysCollection]
|
|
36
|
+
}, _react2().default.createElement(_client().SchemaComponentOptions, {
|
|
37
|
+
scope: {
|
|
38
|
+
currentRoles
|
|
39
|
+
},
|
|
40
|
+
components: {
|
|
41
|
+
ExpiresSelect: _ExpiresSelect.ExpiresSelect
|
|
42
|
+
}
|
|
43
|
+
}, _react2().default.createElement(_react().RecursionField, {
|
|
44
|
+
schema: _schema.configurationSchema
|
|
45
|
+
})));
|
|
46
|
+
};
|
|
47
|
+
exports.Configuration = Configuration;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useCurrentRolesProps = void 0;
|
|
7
|
+
function _client() {
|
|
8
|
+
const data = require("@nocobase/client");
|
|
9
|
+
_client = function _client() {
|
|
10
|
+
return data;
|
|
11
|
+
};
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
const useCurrentRolesProps = () => {
|
|
15
|
+
const options = (0, _client().useCurrentRoles)();
|
|
16
|
+
return {
|
|
17
|
+
options
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
exports.useCurrentRolesProps = useCurrentRolesProps;
|