@@ -37,57 +37,33 @@ export class KeycloakTenantProvisioner {
3737 } )
3838
3939 const tenantId = 'system'
40- const clientId = OidcJwtVerifier . computeTenantClientId ( this . cfg . clientIdPrefix , tenantId )
41- const { id : clientUuid } = await this . admin . ensureClient ( {
42- clientId,
43- publicClient : true ,
44- standardFlowEnabled : true ,
45- redirectUris : this . cfg . spaRedirectUris ,
46- webOrigins : this . cfg . spaWebOrigins
47- } )
48-
49- await this . admin . ensureClientRole ( clientUuid , 'case.admin' )
50-
51- await this . admin . ensureProtocolMapper ( clientUuid , {
52- name : 'tenantId' ,
53- protocol : 'openid-connect' ,
54- protocolMapper : 'oidc-hardcoded-claim-mapper' ,
55- config : {
56- 'claim.name' : 'tenantId' ,
57- 'claim.value' : tenantId ,
58- 'jsonType.label' : 'String' ,
59- 'id.token.claim' : 'true' ,
60- 'access.token.claim' : 'true' ,
61- 'userinfo.token.claim' : 'true'
62- }
63- } )
64-
65- await this . admin . ensureProtocolMapper ( clientUuid , {
66- name : 'scope' ,
67- protocol : 'openid-connect' ,
68- protocolMapper : 'oidc-usermodel-client-role-mapper' ,
69- config : {
70- 'clientId' : clientId ,
71- 'rolePrefix' : '' ,
72- 'claim.name' : 'scope' ,
73- 'jsonType.label' : 'String' ,
74- 'multivalued' : 'true' ,
75- 'access.token.claim' : 'true' ,
76- 'id.token.claim' : 'true' ,
77- 'userinfo.token.claim' : 'true'
78- }
79- } )
40+ const roles = [ 'case.read' , 'case.write' , 'case.owner' , 'case.admin' ]
41+ const { clientId, clientUuid } = await this . ensureTenantClient ( tenantId , roles )
8042
8143 const { id : userId } = await this . admin . ensureUser ( { username : email , email, enabled : true } )
8244 await this . admin . setUserPassword ( userId , password , false )
83- await this . admin . assignClientRoles ( userId , clientUuid , [ 'case.admin' ] )
45+ await this . admin . assignClientRoles ( userId , clientUuid , roles )
8446
8547 logger . info ( { clientId, email } , 'Bootstrapped system admin user in Keycloak' )
8648 }
8749
8850 async provisionTenant ( tenantId : string ) : Promise < { adminEmail : string , adminPassword : string } > {
8951 await this . admin . ensureRealmExists ( )
9052
53+ const roles = [ 'case.read' , 'case.write' , 'case.owner' ]
54+ const { clientId, clientUuid } = await this . ensureTenantClient ( tenantId , roles )
55+
56+ const adminEmail = `admin@${ tenantId } .local`
57+ const { id : userId } = await this . admin . ensureUser ( { username : adminEmail , email : adminEmail , enabled : true } )
58+ const adminPassword = randomBytes ( 18 ) . toString ( 'base64url' )
59+ await this . admin . setUserPassword ( userId , adminPassword , true )
60+ await this . admin . assignClientRoles ( userId , clientUuid , roles )
61+
62+ logger . info ( { tenantId, clientId, adminEmail } , 'Provisioned tenant client and admin user in Keycloak' )
63+ return { adminEmail, adminPassword }
64+ }
65+
66+ private async ensureTenantClient ( tenantId : string , roles : string [ ] ) : Promise < { clientId : string , clientUuid : string } > {
9167 const clientId = OidcJwtVerifier . computeTenantClientId ( this . cfg . clientIdPrefix , tenantId )
9268 const { id : clientUuid } = await this . admin . ensureClient ( {
9369 clientId,
@@ -97,7 +73,6 @@ export class KeycloakTenantProvisioner {
9773 webOrigins : this . cfg . spaWebOrigins
9874 } )
9975
100- const roles = [ 'case.read' , 'case.write' , 'case.owner' ]
10176 for ( const role of roles ) {
10277 await this . admin . ensureClientRole ( clientUuid , role )
10378 }
@@ -132,14 +107,7 @@ export class KeycloakTenantProvisioner {
132107 }
133108 } )
134109
135- const adminEmail = `admin@${ tenantId } .local`
136- const { id : userId } = await this . admin . ensureUser ( { username : adminEmail , email : adminEmail , enabled : true } )
137- const adminPassword = randomBytes ( 18 ) . toString ( 'base64url' )
138- await this . admin . setUserPassword ( userId , adminPassword , true )
139- await this . admin . assignClientRoles ( userId , clientUuid , roles )
140-
141- logger . info ( { tenantId, clientId, adminEmail } , 'Provisioned tenant client and admin user in Keycloak' )
142- return { adminEmail, adminPassword }
110+ return { clientId, clientUuid }
143111 }
144112}
145113
0 commit comments