FEAT: map permission to identity provider

This commit is contained in:
marcos-silva-rodrigues
2025-06-24 16:20:03 -03:00
parent 75e8b3bf4b
commit a5c8de496d
6 changed files with 110 additions and 47 deletions
@@ -13,6 +13,9 @@ export class CreateIdentityProvider {
@ApiProperty()
issuerUrl: string;
@ApiProperty()
permissions: number[];
}
@@ -29,6 +32,12 @@ export class IdentityProviderResponse {
@ApiProperty()
issueUrl: string;
@ApiProperty()
permissions: {
id: number;
name: string;
}[];
}
export class IdentityProviderListResponse {
@@ -43,7 +43,7 @@ export class IdentityProviderController {
this.logger.info('/openid - addIdentityProvider');
const metadata = PackTheMetadata({
customer_id: user.customer_id,
...user,
language,
});
@@ -66,24 +66,26 @@ export class IdentityProviderController {
return await this.identityProviderService.getList(metadata)
}
// @Get(':name')
// @HttpCode(HttpStatus.OK)
// @Redirect()
// async loginIdp(@Param('name') name: string , @Req() req: Request) {
// this.logger.info('/openid - :name');
@Get(':id')
@HttpCode(HttpStatus.OK)
@Redirect()
async loginIdp(@Param('id') id: string) {
this.logger.info('/openid - :name');
// const redirectUrl = await this.openidService.loginIdp(name, req);
// return {
// url: redirectUrl,
// };
// }
const redirectUrl = await this.identityProviderService.loginIdentityProvider(id);
return {
url: redirectUrl,
};
}
// @Get('/:name/callback')
// @HttpCode(HttpStatus.OK)
// async callbackIdp(@Param('name') name: string, @Req() req: Request) {
// this.logger.info('/openid - /:name/callback');
@Get('/:name/callback')
@HttpCode(HttpStatus.OK)
async callbackIdp(@Param('name') name: string, @Req() req: Request) {
this.logger.info('/openid - /:name/callback');
// return await this.openidService.authorizeIdp(name, req);
// }
return {
name,
params: req.params
};
}
}
@@ -35,21 +35,19 @@ export class IdentityProviderService implements OnModuleInit {
);
}
// async loginIdp(name: string, req: Request) {
// const client = await this.buildOpenIdClient(name);
async loginIdentityProvider(id: string) {
const client = await this.buildOpenIdClient(id);
// const code_verifier: string = generators.codeVerifier();
// const code_challenge: string = generators.codeChallenge(code_verifier);
const code_verifier: string = generators.codeVerifier();
const code_challenge: string = generators.codeChallenge(code_verifier);
// req.session.code_verifier = code_verifier;
// return client.authorizationUrl({
// scope: 'openid email',
// response_type: 'code',
// code_challenge,
// code_challenge_method: 'S256',
// });
// }
return client.authorizationUrl({
scope: 'openid email',
response_type: 'code',
code_challenge,
code_challenge_method: 'S256',
});
}
// async authorizeIdp(name: string, req: Request) {
// const client = await this.buildOpenIdClient(name);
@@ -69,17 +67,17 @@ export class IdentityProviderService implements OnModuleInit {
// return tokenSet.claims();
// }
// private async buildOpenIdClient(name: string) {
// const idp = await lastValueFrom(
// this.identityProviderService.FindIdentityProvider({ name }),
// );
private async buildOpenIdClient(id: string) {
const idp = await lastValueFrom(
this.identityProviderService.FindIdentityProvider({ id }),
);
// const issuer = await Issuer.discover(idp.issueUrl);
// return new issuer.Client({
// client_id: idp.clientId,
// client_secret: idp.clientSecret,
// redirect_uris: [`http://localhost:3333/openid/${idp.name}/callback`],
// response_types: ['code'],
// });
// }
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'],
});
}
}