secretManager.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. const request_1 = __importDefault(require("request"));
  7. /**
  8. * 容器托管内的密钥管理器
  9. */
  10. class SecretManager {
  11. constructor() {
  12. this.TMP_SECRET_URL =
  13. 'http://metadata.tencentyun.com/meta-data/cam/security-credentials/TCB_QcsRole';
  14. this.tmpSecret = null;
  15. }
  16. /* istanbul ignore next */
  17. async getTmpSecret() {
  18. if (this.tmpSecret) {
  19. const now = new Date().getTime();
  20. const expire = this.tmpSecret.expire * 1000;
  21. const oneHour = 3600 * 1000;
  22. if (now < expire - oneHour) {
  23. // 密钥没过期
  24. return this.tmpSecret;
  25. }
  26. else {
  27. // 密钥过期
  28. return this.fetchTmpSecret();
  29. }
  30. }
  31. else {
  32. return this.fetchTmpSecret();
  33. }
  34. }
  35. /* istanbul ignore next */
  36. async fetchTmpSecret() {
  37. const body = await this.get(this.TMP_SECRET_URL);
  38. const payload = JSON.parse(body);
  39. this.tmpSecret = {
  40. id: payload.TmpSecretId,
  41. key: payload.TmpSecretKey,
  42. expire: payload.ExpiredTime,
  43. token: payload.Token
  44. };
  45. return this.tmpSecret;
  46. }
  47. /* istanbul ignore next */
  48. get(url) {
  49. return new Promise((resolve, reject) => {
  50. request_1.default.get(url, (err, res, body) => {
  51. if (err) {
  52. reject(err);
  53. }
  54. else {
  55. resolve(body);
  56. }
  57. });
  58. });
  59. }
  60. }
  61. exports.default = SecretManager;