@cloudbase/manager-node 5.5.3 → 5.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/env/index.js CHANGED
@@ -12,6 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.EnvService = void 0;
13
13
  const cos_nodejs_sdk_v5_1 = __importDefault(require("cos-nodejs-sdk-v5"));
14
14
  const util_1 = __importDefault(require("util"));
15
+ const http_request_1 = require("../utils/http-request");
16
+ const signature_nodejs_1 = require("@cloudbase/signature-nodejs");
15
17
  const error_1 = require("../error");
16
18
  const utils_1 = require("../utils");
17
19
  const constant_1 = require("../constant");
@@ -26,6 +28,7 @@ class EnvService {
26
28
  this.tcbService = new utils_1.CloudService(environment.cloudBaseContext, 'tcb', '2018-06-08');
27
29
  this.commonService = environment.getCommonService('lowcode', '2021-01-08');
28
30
  this.billingService = new billing_1.BillingService(environment.cloudBaseContext);
31
+ this.tokenCache = new Map();
29
32
  }
30
33
  /**
31
34
  * 列出所有环境
@@ -410,6 +413,74 @@ class EnvService {
410
413
  async describeApiKeyList(options) {
411
414
  return this.tcbService.request('DescribeApiKeyList', Object.assign({ EnvId: this.envId }, options));
412
415
  }
416
+ /**
417
+ * 根据密钥信息获取管理员访问令牌
418
+ * 使用 secretId、secretKey 和 sessionToken 签发访问令牌
419
+ * 默认从初始化时的 cloudBaseContext 中读取密钥,也可显式传入 credentials 覆盖
420
+ * @param {Object} [credentials] 密钥信息,不传则使用初始化时的密钥
421
+ * @param {string} credentials.secretId 密钥ID
422
+ * @param {string} credentials.secretKey 密钥Key
423
+ * @param {string} [credentials.token] sessionToken
424
+ * @returns {Promise<string>} 访问令牌
425
+ */
426
+ async getAdminAccessToken(credentials) {
427
+ const { secretId, secretKey, token } = credentials || this.environment.cloudBaseContext;
428
+ if (!secretId || !secretKey) {
429
+ throw new error_1.CloudBaseError('missing secretId or secretKey of tencent cloud');
430
+ }
431
+ const envId = this.envId;
432
+ const cacheKey = `access_token_secret_${envId}_${secretId}`;
433
+ const cached = this.tokenCache.get(cacheKey);
434
+ if (cached && cached.expiry > Date.now()) {
435
+ return cached.token;
436
+ }
437
+ const host = `${envId}${this.environment.cloudBaseContext.isInternalEndpoint()
438
+ ? '.api.intl.tcloudbasegateway.com'
439
+ : '.api.tcloudbasegateway.com'}`;
440
+ const url = `https://${host}/auth/v1/token/clientCredential`;
441
+ const method = 'POST';
442
+ const headers = {
443
+ 'Content-Type': 'application/json',
444
+ Host: host,
445
+ };
446
+ const data = { grant_type: 'client_credentials' };
447
+ const timestamp = Math.floor(new Date().getTime() / 1000) - 1;
448
+ const { authorization, timestamp: signTimestamp } = (0, signature_nodejs_1.sign)({
449
+ secretId,
450
+ secretKey,
451
+ method,
452
+ url,
453
+ headers,
454
+ params: data,
455
+ timestamp,
456
+ withSignedParams: false,
457
+ isCloudApi: true,
458
+ });
459
+ headers['Authorization'] = `${authorization}, Timestamp=${signTimestamp}${token ? `, Token=${token}` : ''}`;
460
+ headers['X-Signature-Expires'] = 600;
461
+ headers['X-Timestamp'] = signTimestamp;
462
+ try {
463
+ const response = await (0, http_request_1.fetch)(url, {
464
+ method,
465
+ headers,
466
+ body: JSON.stringify(data),
467
+ });
468
+ const res = await response.json();
469
+ const access_token = res === null || res === void 0 ? void 0 : res.access_token;
470
+ const expires_in = (res === null || res === void 0 ? void 0 : res.expires_in) || 0;
471
+ if (access_token && expires_in) {
472
+ this.tokenCache.set(cacheKey, {
473
+ token: access_token,
474
+ expiry: Date.now() + (expires_in * 1000) / 2,
475
+ });
476
+ }
477
+ return access_token;
478
+ }
479
+ catch (e) {
480
+ console.log(e);
481
+ throw e;
482
+ }
483
+ }
413
484
  // 创建自定义登录私钥
414
485
  async createCustomLoginKeys() {
415
486
  return this.cloudService.request('CreateCustomLoginKeys', {
@@ -1335,8 +1335,8 @@ class StorageService {
1335
1335
  typeof cacheControl === 'number' ? `max-age=${cacheControl}` : String(cacheControl);
1336
1336
  }
1337
1337
  if (metadata) {
1338
- // X-Metadata 放在 Header 里,具体大小限制由服务端/网关决定
1339
- headers['X-Metadata'] = Buffer.from(JSON.stringify(metadata), 'utf8').toString('base64');
1338
+ // x-metadata 放在 Header 里,具体大小限制由服务端/网关决定
1339
+ headers['x-metadata'] = Buffer.from(JSON.stringify(metadata), 'utf8').toString('base64');
1340
1340
  }
1341
1341
  if (upsert) {
1342
1342
  headers['x-upsert'] = 'true';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudbase/manager-node",
3
- "version": "5.5.3",
3
+ "version": "5.5.4",
4
4
  "description": "The node manage service api for cloudbase.",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -41,6 +41,7 @@
41
41
  "typescript": "^5.8.3"
42
42
  },
43
43
  "dependencies": {
44
+ "@cloudbase/signature-nodejs": "^1.0.0",
44
45
  "@cloudbase/database": "^0.6.2",
45
46
  "archiver": "^3.1.1",
46
47
  "cos-nodejs-sdk-v5": "^2.14.0",
@@ -559,6 +559,7 @@ export declare class EnvService {
559
559
  private envType?;
560
560
  private commonService;
561
561
  private billingService;
562
+ private tokenCache;
562
563
  constructor(environment: Environment);
563
564
  /**
564
565
  * 列出所有环境
@@ -779,6 +780,21 @@ export declare class EnvService {
779
780
  * @returns {Promise<IDescribeApiKeyListRes>}
780
781
  */
781
782
  describeApiKeyList(options?: IDescribeApiKeyListParams): Promise<IDescribeApiKeyListRes>;
783
+ /**
784
+ * 根据密钥信息获取管理员访问令牌
785
+ * 使用 secretId、secretKey 和 sessionToken 签发访问令牌
786
+ * 默认从初始化时的 cloudBaseContext 中读取密钥,也可显式传入 credentials 覆盖
787
+ * @param {Object} [credentials] 密钥信息,不传则使用初始化时的密钥
788
+ * @param {string} credentials.secretId 密钥ID
789
+ * @param {string} credentials.secretKey 密钥Key
790
+ * @param {string} [credentials.token] sessionToken
791
+ * @returns {Promise<string>} 访问令牌
792
+ */
793
+ getAdminAccessToken(credentials?: {
794
+ secretId: string;
795
+ secretKey: string;
796
+ token?: string;
797
+ }): Promise<string>;
782
798
  createCustomLoginKeys(): Promise<{
783
799
  PrivateKey: string;
784
800
  KeyID: string;
@@ -18,7 +18,7 @@ export interface IUploadObjectHttpOptions {
18
18
  * 缓存控制;传 number 自动转换为 max-age=<value>,传 string 直接作为 Cache-Control 头值
19
19
  */
20
20
  cacheControl?: number | string;
21
- /** 自定义 metadata(JSON 对象),将以 Base64 编码后放入 X-Metadata 头 */
21
+ /** 自定义 metadata(JSON 对象),将以 Base64 编码后放入 x-metadata 头 */
22
22
  metadata?: Record<string, any>;
23
23
  /** 爬虫指令(X-Robots-Tag 头) */
24
24
  xRobotsTag?: string;