diff --git a/.changeset/clean-starfishes-applaud.md b/.changeset/clean-starfishes-applaud.md new file mode 100644 index 0000000..711747c --- /dev/null +++ b/.changeset/clean-starfishes-applaud.md @@ -0,0 +1,5 @@ +--- +"@cardbrother/nestjs-tencent-cloud-sdk": patch +--- + +Add STS support diff --git a/src/@cardbrother/tencent-cloud-sdk/client-factory.provider.ts b/src/@cardbrother/tencent-cloud-sdk/client-factory.provider.ts index 6a91a2b..6a48fdf 100644 --- a/src/@cardbrother/tencent-cloud-sdk/client-factory.provider.ts +++ b/src/@cardbrother/tencent-cloud-sdk/client-factory.provider.ts @@ -3,6 +3,7 @@ import { Injectable } from '@nestjs/common'; import { CosProvider } from './cos/cos.provider'; import { OcrProvider } from './ocr/ocr.provider'; import { SmsProvider } from './sms/sms.provider'; +import { StsProvider } from './sts/sts.provider'; // assuming these imports are available import { ClientTypeToClassMap, @@ -15,6 +16,7 @@ export class ClientFactoryProvider { private readonly smsProvider: SmsProvider, private readonly ocrProvider: OcrProvider, private readonly cosProvider: CosProvider, + private readonly stsProvider: StsProvider, ) {} public async createClient< @@ -30,6 +32,9 @@ export class ClientFactoryProvider { case 'COS': case TencentCloudClientType.COS: return this.cosProvider as ClientTypeToClassMap[T]; + case 'STS': + case TencentCloudClientType.STS: + return this.stsProvider as ClientTypeToClassMap[T]; default: throw new Error('Unknown client type: ' + clientType); } diff --git a/src/@cardbrother/tencent-cloud-sdk/sts/sts.interface.ts b/src/@cardbrother/tencent-cloud-sdk/sts/sts.interface.ts new file mode 100644 index 0000000..d94d0f8 --- /dev/null +++ b/src/@cardbrother/tencent-cloud-sdk/sts/sts.interface.ts @@ -0,0 +1,26 @@ +import { + GetFederationTokenRequest, + GetFederationTokenResponse, + QueryApiKeyRequest, + QueryApiKeyResponse, +} from 'tencentcloud-sdk-nodejs/tencentcloud/services/sts/v20180813/sts_models'; + +export interface IStsProvider { + /** + * @name 获取临时凭证签名 + * @description 获取临时访问凭证 具体文档参考 https://cloud.tencent.com/document/product/1312/48195 + * @param params GetFederationTokenRequest - 生成临时访问凭证参数 + * @returns GetFederationTokenResponse - 返回临时访问凭证结果 + */ + createTemporary: ( + params: GetFederationTokenRequest, + ) => Promise; + + /** + * @name 查询API密钥 + * @description 查询API密钥 具体文档参考 https://cloud.tencent.com/document/product/1312/48194 + * @param params QueryApiKeyRequest - 查询API密钥参数 + * @returns UploadFileResult - 返回查询API密钥结果 + */ + queryApiKey: (params: QueryApiKeyRequest) => Promise; +} diff --git a/src/@cardbrother/tencent-cloud-sdk/sts/sts.provider.ts b/src/@cardbrother/tencent-cloud-sdk/sts/sts.provider.ts new file mode 100644 index 0000000..8cd16b5 --- /dev/null +++ b/src/@cardbrother/tencent-cloud-sdk/sts/sts.provider.ts @@ -0,0 +1,42 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { Client as StsClient } from 'tencentcloud-sdk-nodejs/tencentcloud/services/sts/v20180813/sts_client'; +import { + GetFederationTokenRequest, + GetFederationTokenResponse, + QueryApiKeyRequest, + QueryApiKeyResponse, +} from 'tencentcloud-sdk-nodejs/tencentcloud/services/sts/v20180813/sts_models'; + +import { + TENCENT_CLOUD_MODULE_OPTIONS_TOKEN, + TencentCloudAbstructClient, + TencentCloudModuleOptions, +} from '../tencent-cloud.interface'; +import { IStsProvider } from './sts.interface'; + +@Injectable() +export class StsProvider + extends TencentCloudAbstructClient + implements IStsProvider +{ + private stsClient: StsClient; + constructor( + @Inject(TENCENT_CLOUD_MODULE_OPTIONS_TOKEN) + private readonly options: TencentCloudModuleOptions, + ) { + super('sts.tencentcloudapi.com', '2018-08-13', options); + this.stsClient = new StsClient(this); + } + + public async createTemporary( + params: GetFederationTokenRequest, + ): Promise { + return await this.stsClient.GetFederationToken(params); + } + + public async queryApiKey( + params: QueryApiKeyRequest, + ): Promise { + return await this.stsClient.QueryApiKey(params); + } +} diff --git a/src/@cardbrother/tencent-cloud-sdk/tencent-cloud.interface.ts b/src/@cardbrother/tencent-cloud-sdk/tencent-cloud.interface.ts index 28ca6c8..9dbddad 100644 --- a/src/@cardbrother/tencent-cloud-sdk/tencent-cloud.interface.ts +++ b/src/@cardbrother/tencent-cloud-sdk/tencent-cloud.interface.ts @@ -6,6 +6,7 @@ import { ClientProfile } from 'tencentcloud-sdk-nodejs/tencentcloud/common/inter import { CosProvider } from './cos/cos.provider'; import { OcrProvider } from './ocr/ocr.provider'; import { SmsProvider } from './sms/sms.provider'; +import { StsProvider } from './sts/sts.provider'; // TencentCloudClient interface export class TencentCloudAbstructClient extends AbstractClient { @@ -66,6 +67,7 @@ export enum TencentCloudClientType { SMS = 'SMS', // 短信 OCR = 'OCR', // OCR 图像识别 COS = 'COS', // 对象存储 + STS = 'STS', // 临时凭证 } /** @@ -76,6 +78,7 @@ export interface ClientTypeToClassMap { SMS: SmsProvider; OCR: OcrProvider; COS: CosProvider; + STS: StsProvider; } export type TencentCloudCosOptions = { diff --git a/src/@cardbrother/tencent-cloud-sdk/tencent-cloud.module.ts b/src/@cardbrother/tencent-cloud-sdk/tencent-cloud.module.ts index 427f733..d7b8254 100644 --- a/src/@cardbrother/tencent-cloud-sdk/tencent-cloud.module.ts +++ b/src/@cardbrother/tencent-cloud-sdk/tencent-cloud.module.ts @@ -4,6 +4,7 @@ import { ClientFactoryProvider } from './client-factory.provider'; import { CosProvider } from './cos/cos.provider'; import { OcrProvider } from './ocr/ocr.provider'; import { SmsProvider } from './sms/sms.provider'; +import { StsProvider } from './sts/sts.provider'; import { TENCENT_CLOUD_MODULE_OPTIONS_TOKEN, TencentCloudAsyncModuleOptions, @@ -18,7 +19,13 @@ import { TencentCloudService } from './tencent-cloud.service'; * @returns {DynamicModule} */ @Module({ - providers: [TencentCloudService, OcrProvider, SmsProvider, CosProvider], + providers: [ + TencentCloudService, + OcrProvider, + SmsProvider, + CosProvider, + StsProvider, + ], exports: [TencentCloudService], }) export class TencentCloudModule { diff --git a/src/@cardbrother/tencent-cloud-sdk/tests/sts-client.e2e.spec.ts b/src/@cardbrother/tencent-cloud-sdk/tests/sts-client.e2e.spec.ts new file mode 100644 index 0000000..430e2ef --- /dev/null +++ b/src/@cardbrother/tencent-cloud-sdk/tests/sts-client.e2e.spec.ts @@ -0,0 +1,85 @@ +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { Test, TestingModule } from '@nestjs/testing'; + +import { StsProvider } from '../sts/sts.provider'; +import { TencentCloudClientType } from '../tencent-cloud.interface'; +import { TencentCloudModule } from '../tencent-cloud.module'; +import { TencentCloudService } from '../tencent-cloud.service'; + +/** + * @name @cardbrother/tencentCloudModule OCR Test + * @description This test is end to end for the tencent ocr service + */ +describe('@cardbrother/tencentCloudModule STS Test', () => { + let tencentCloudService: TencentCloudService; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [ + TencentCloudModule.forRootAsync({ + useFactory: (config: ConfigService) => { + const tencentSecretId = + config.get('TENCENT_API_ID') || + 'XXXXXXXXXXXXXXXXXXXXXXXXX'; + const tencentSecretKey = + config.get('TENCENT_API_SECRET') || + 'XXXXXXXXXXXXXXXXXXXXXXXXX'; + return { + apiId: tencentSecretId, + apiSecret: tencentSecretKey, + region: 'ap-guangzhou', + global: true, + }; + }, + imports: [ + ConfigModule.forRoot({ + envFilePath: ['.env'], + }), + ], + inject: [ConfigService], + }), + ], + }).compile(); + + tencentCloudService = + moduleFixture.get(TencentCloudService); + }); + + it('should be defined', () => { + expect(tencentCloudService).toBeDefined(); + }); + + it('should have the correct config', () => { + const options = tencentCloudService.getOptions(); + expect(options).toBeDefined(); + }); + + it('should have useClient STS Type', async () => { + const sts_client = await tencentCloudService.useClient( + TencentCloudClientType.STS, + ); + expect(sts_client).toBeDefined(); + expect(sts_client).toBeInstanceOf(StsProvider); + + // const tempSignature = await sts_client.createTemporary({ + // Name: 'CardBrother-App', + // Policy: encodeURI( + // JSON.stringify({ + // version: '2.0', + // statement: [ + // { + // effect: 'allow', + // action: ['cos:PutObject'], + // resource: ['*'], + // }, + // ], + // }), + // ), + // DurationSeconds: 1800, + // }); + + // console.debug('🐛🐛🐛 --------------------------------------------🐛🐛🐛'); + // console.debug('🐛🐛🐛 ::: tempSignature:::', tempSignature); + // console.debug('🐛🐛🐛 --------------------------------------------🐛🐛🐛'); + }); +});