FEAT: init url callback

This commit is contained in:
marcos-silva-rodrigues
2025-06-25 10:28:26 -03:00
parent a5c8de496d
commit 57e6e49c7c
4 changed files with 72 additions and 16 deletions
+35
View File
@@ -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",
+18
View File
@@ -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
}
}
}
@@ -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'],
});
}
}
+4
View File
@@ -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;