diff --git a/docsfera.json b/docsfera.json index 212ad4e..dbd3636 100644 --- a/docsfera.json +++ b/docsfera.json @@ -93,6 +93,55 @@ ] } }, + "/auth/idp": { + "post": { + "operationId": "AuthController_addIdentityProvider", + "parameters": [ + { + "name": "dadosfera-lang", + "in": "header", + "required": false, + "schema": { + "enum": [ + "pt-br", + "en-us" + ], + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIdentityProvider" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthRefreshAccessTokenRes" + } + } + } + } + }, + "tags": [ + "Auth" + ], + "security": [ + { + "access-token": [] + } + ] + } + }, "/auth/sso/snowflake": { "post": { "operationId": "AuthController_snowflakeSignIn", @@ -5840,6 +5889,25 @@ "accessToken" ] }, + "CreateIdentityProvider": { + "type": "object", + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "issueUrl": { + "type": "string" + } + }, + "required": [ + "clientId", + "clientSecret", + "issueUrl" + ] + }, "CreateConnectionDto": { "type": "object", "properties": { diff --git a/package-lock.json b/package-lock.json index 31af08d..9983a8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@aws-sdk/client-secrets-manager": "^3.414.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "^3.37.0-beta.10 ", + "@dadosfera/protospack-v2": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -1298,9 +1298,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.37.0-beta.10", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.37.0-beta.10.tgz", - "integrity": "sha512-nKSu9VpOPFSTeX0yN4aEY0HjvGxgbLPYXl217NHgLm+a/+i01USDaxjwIOqP5hhDvhnMNaiCq5awiQTYbhF/7A==", + "version": "0.0.0", + "resolved": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", + "integrity": "sha512-bV/C8RR3Qska7qrNjDxPIjEsjWd5ZFjTVJg/C3zTOk4HeYvPbR+ln3elRRla4CkZzPz4T4VzD+j4284+sq5x8g==", "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", diff --git a/package.json b/package.json index 5a9463a..c824a10 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@aws-sdk/client-secrets-manager": "^3.414.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "^3.37.0-beta.10 ", + "@dadosfera/protospack-v2": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 1097d51..ed9d1fc 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -52,6 +52,7 @@ import jwt from 'jsonwebtoken'; import { LanguageEnum } from 'src/utils/languages.enum'; import { Language } from 'src/decorators/language.decorator'; import { ApiInternalOnlyEndpoint } from 'src/decorators/swagger.decorator'; +import { CreateIdentityProvider } from './dtos/openid'; @ApiTags('Auth') @ApiHeaders([{ name: 'dadosfera-lang', enum: LanguageEnum, required: false }]) @@ -109,6 +110,25 @@ export class AuthController { return this.authClient.refreshAccessToken({ refreshToken }, metadata); } + @Post('/idp') + @HttpCode(HttpStatus.OK) + @ApiOkResponse({ type: AuthRefreshAccessTokenRes }) + @RequireAllPermissions(PERMISSIONS_GROUPS.SNOWFLAKE.permissions.OPEN) + async addIdentityProvider( + @User() user: RequestUser, + @Body() body: CreateIdentityProvider, + @Language() language: LanguageEnum, + ) { + this.logger.info('/auth - RefreshAccessToken'); + + const metadata = PackTheMetadata({ + customer_id: user.customer_id, + language, + }); + + return this.authClient.createIdentityProvider(body, metadata); + } + @ApiInternalOnlyEndpoint() @Post('/sso/snowflake') @RequireAllPermissions(PERMISSIONS_GROUPS.SNOWFLAKE.permissions.OPEN) diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index 8822086..098f369 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -4,7 +4,7 @@ import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { lastValueFrom } from 'rxjs'; import { ProtoServices } from '@dadosfera/protospack-v2/dist/lib/Duc'; -import { AuthProtoService as AuthServiceInterface } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/write-service'; +import { AuthProtoService as AuthServiceInterface, IdentityProviderProtoService } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/write-service'; import { AuthSnowflakeSignInRequest, AuthSignInRequest, @@ -17,15 +17,19 @@ import { AuthResetPasswordRequest, AuthVerifyResetPasswordCodeRequest, AuthConfirmResetPasswordRequest, + CreateIdentityProviderRequest, } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/messages'; import { DucClient } from '../duc/client.config'; import { Metadata } from '@grpc/grpc-js'; +import { CreateIdentityProvider } from './dtos/openid'; @Injectable() export class AuthClientService implements OnModuleInit { logger: DadosferaLogger; + private authService: AuthServiceInterface; + private identityProviderService: IdentityProviderProtoService; constructor( @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, @@ -38,6 +42,10 @@ export class AuthClientService implements OnModuleInit { this.authService = this.grpcClient.getService( ProtoServices.AuthProtoService, ); + + this.identityProviderService = this.grpcClient.getService( + ProtoServices.IdentityProviderProtoService, + ); } async getPublicKeys() { @@ -168,4 +176,10 @@ export class AuthClientService implements OnModuleInit { this.authService.AuthOauthSignIn({ token, username, refreshToken: '' }), ); } + + createIdentityProvider(body: CreateIdentityProvider, metadata: Metadata) { + return lastValueFrom( + this.identityProviderService.CreateIdentityProvider(body, metadata), + ); + } } diff --git a/src/modules/auth/dtos/openid.ts b/src/modules/auth/dtos/openid.ts new file mode 100644 index 0000000..67a48d8 --- /dev/null +++ b/src/modules/auth/dtos/openid.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from "@nestjs/swagger"; + +export class CreateIdentityProvider { + @ApiProperty() + clientId: string; + + @ApiProperty() + clientSecret: string; + + @ApiProperty() + issueUrl: string; +} \ No newline at end of file