From 57e6e49c7c68d1c6e2e5d4d691cea445e39aa39a Mon Sep 17 00:00:00 2001 From: marcos-silva-rodrigues Date: Wed, 25 Jun 2025 10:28:26 -0300 Subject: [PATCH] FEAT: init url callback --- docsfera.json | 35 +++++++++++++++++++ src/modules/auth/auth.controller.ts | 18 ++++++++++ .../identity-provider.service.ts | 31 ++++++++-------- src/utils/errorCodes.ts | 4 +++ 4 files changed, 72 insertions(+), 16 deletions(-) diff --git a/docsfera.json b/docsfera.json index 7e631de..f34893a 100644 --- a/docsfera.json +++ b/docsfera.json @@ -675,6 +675,41 @@ ] } }, + "/auth/idp/{name}/callback": { + "get": { + "operationId": "AuthController_callbackIdp", + "parameters": [ + { + "name": "dadosfera-lang", + "in": "header", + "required": false, + "schema": { + "enum": [ + "pt-br", + "en-us" + ], + "type": "string" + } + }, + { + "name": "name", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Auth" + ] + } + }, "/connections": { "post": { "operationId": "ConnectionController_createConnection", diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index af3f053..5fab2cd 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -420,4 +420,22 @@ export class AuthController { return this.authClient.resetUsers(body.users, metadata); } + + @Get('/idp/:name/callback') + @HttpCode(HttpStatus.OK) + async callbackIdp(@Param('name') idpName: string, @Req() req: Request) { + this.logger.info('/auth/idp/:name/callback'); + + const { params } = req; + + if (!params || !params.code) { + this.logger.error('No code received from IDP'); + throw new Error(ErrorCodes.IDENTITY_PROVIDER.INVALID_RESPONSE); + } + + return { + ok: true + } + + } } diff --git a/src/modules/identity-provider/identity-provider.service.ts b/src/modules/identity-provider/identity-provider.service.ts index 6dc90d0..f34d0c9 100644 --- a/src/modules/identity-provider/identity-provider.service.ts +++ b/src/modules/identity-provider/identity-provider.service.ts @@ -36,17 +36,29 @@ export class IdentityProviderService implements OnModuleInit { } async loginIdentityProvider(id: string) { - const client = await this.buildOpenIdClient(id); + const idp = await lastValueFrom( + this.identityProviderService.FindIdentityProvider({ id }), + ); + + const issuer = await Issuer.discover(idp.issuerUrl); + const client = new issuer.Client({ + client_id: idp.clientId, + client_secret: idp.clientSecret, + redirect_uris: [`http://localhost:3333/auth/idp/${idp.name}/callback`], + response_types: ['code'], + }); const code_verifier: string = generators.codeVerifier(); const code_challenge: string = generators.codeChallenge(code_verifier); - return client.authorizationUrl({ - scope: 'openid email', + const url = client.authorizationUrl({ + scope: 'openid email profile', response_type: 'code', code_challenge, code_challenge_method: 'S256', }); + const idpUrl = url + '&identity_provider=' + idp.name + return idpUrl; } // async authorizeIdp(name: string, req: Request) { @@ -67,17 +79,4 @@ export class IdentityProviderService implements OnModuleInit { // return tokenSet.claims(); // } - private async buildOpenIdClient(id: string) { - const idp = await lastValueFrom( - this.identityProviderService.FindIdentityProvider({ id }), - ); - - const issuer = await Issuer.discover(idp.issuerUrl); - return new issuer.Client({ - client_id: idp.clientId, - client_secret: idp.clientSecret, - redirect_uris: [`http://localhost:3333/auth/idp/${idp.name}/callback`], - response_types: ['code'], - }); - } } diff --git a/src/utils/errorCodes.ts b/src/utils/errorCodes.ts index 1ba83e6..6d08b17 100644 --- a/src/utils/errorCodes.ts +++ b/src/utils/errorCodes.ts @@ -75,6 +75,9 @@ const CATALOG = { PREVIEW_TOO_BIG: 'CATALOG.PREVIEW_TOO_BIG', METADATA_TOO_BIG: 'CATALOG.METADATA_TOO_BIG', }; +const IDENTITY_PROVIDER = { + INVALID_RESPONSE: 'IDENTITY_PROVIDER.INVALID_RESPONSE', +} const ErrorCodes = { UNKNOWN: 'UNKNOWN', RATE_LIMIT: 'RATE_LIMIT', @@ -91,6 +94,7 @@ const ErrorCodes = { TRANSFORMATION, CONNECTION, CATALOG, + IDENTITY_PROVIDER }; export default ErrorCodes;