scimgateway 4.2.17 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@ Author: Jarle Elshaug
8
8
  Validated through IdP's:
9
9
 
10
10
  - Symantec/Broadcom/CA Identity Manager
11
- - Microsoft Azure Active Directory
11
+ - Microsoft Entra ID
12
12
  - OneLogin
13
13
  - Okta
14
14
  - Omada
@@ -16,28 +16,24 @@ Validated through IdP's:
16
16
 
17
17
  Latest news:
18
18
 
19
+ - **BREAKING**: [SCIM Stream](https://elshaug.xyz/docs/scim-stream) is the modern way of user provisioning letting clients subscribe to messages instead of traditional IGA top-down provisioning. SCIM Gateway now offers enhanced functionality with support for message subscription and automated provisioning using SCIM Stream
19
20
  - Authentication PassThrough letting plugin pass authentication directly to endpoint for avoid maintaining secrets at the gateway. Kubernetes health checks and shutdown handler support
20
- - **BREAKING**: [SCIM Stream](https://elshaug.xyz/docs/scim-stream) is the modern way of user provisioning letting clients subscribe to messages instead of traditional IGA top-down provisioning. SCIM Stream includes **SCIM Stream Gateway**, the next generation SCIM Gateway that supports message subscription and automated provisioning
21
21
  - Supports OAuth Client Credentials authentication
22
22
  - Major version v4.0.0. getUsers() and getGroups() replacing some deprecated methods. No limitations on filtering/sorting. Admin user access can be linked to specific baseEntities. New MongoDB plugin
23
- - ipAllowList for restricting access to allowlisted IP addresses or subnets e.g. Azure AD IP-range
23
+ - ipAllowList for restricting access to allowlisted IP addresses or subnets e.g. Azure IP-range
24
24
  - General LDAP plugin configured for Active Directory
25
25
  - [PlugSSO](https://elshaug.xyz/docs/plugsso) using SCIM Gateway
26
26
  - Each authentication configuration allowing more than one admin user including option for readOnly
27
27
  - Codebase moved from callback of h... to the the promise(d) land of async/await
28
28
  - Supports configuration by environments and external files
29
29
  - Health monitoring through "/ping" URL, and option for error notifications by email
30
- - Azure AD user provisioning including license management e.g. Office 365, installed and configured within minutes!
30
+ - Entra ID user provisioning including license management e.g. Office 365, installed and configured within minutes!
31
31
  - Includes API Gateway for none SCIM/provisioning - becomes what you want it to become
32
32
  - Running SCIM Gateway as a Docker container
33
33
 
34
34
  ## Overview
35
-
36
- With SCIM Gateway we can manage users and groups by using REST based [SCIM](http://www.simplecloud.info/) 1.1 or 2.0 protocol. Gateway translates incoming SCIM requests and expose CRUD functionality (create, read, update and delete user/group) towards destinations using endpoint specific protocols. In other words, none SCIM-endpoints will become SCIM-endpoints. Gateway do not require SCIM to be used, it's also an API Gateway that could be used for other things than user provisioning.
37
35
 
38
- SCIM Gateway is a standalone product, however this document shows how the gateway could be used by products like Symatec/Broadcom/CA Identity Manager.
39
-
40
- Using Identity Manager, we could setup one or more endpoints of type SCIM pointing to the gateway. Specific ports could then be used for each type of endpoint, and the SCIM Gateway would work like a "CA Connector Server" communicating with endpoints.
36
+ With SCIM Gateway, user management is facilitated through the utilization of the REST-based SCIM 1.1 or 2.0 protocol. The Gateway acts as a translator for incoming SCIM requests, seamlessly enabling the exposure of CRUD functionality (create, read, update, and delete user/group) towards destinations. This is achieved through the implementation of endpoint-specific protocols, ensuring precise and efficient provisioning with diverse endpoints.
41
37
 
42
38
  ![](https://jelhub.github.io/images/ScimGateway.svg)
43
39
 
@@ -76,8 +72,8 @@ Demonstrates user provisioning towards MSSQL database
76
72
  * **SAP HANA** (SAP HANA Database)
77
73
  Demonstrates SAP HANA specific user provisioning
78
74
 
79
- * **Azure AD** (REST Webservices)
80
- Azure AD user provisioning including Azure license management (App Service plans) e.g. Office 365
75
+ * **Entra ID** (REST Webservices)
76
+ Entra ID user provisioning including license management (App Service plans) e.g. Office 365
81
77
  Using Microsoft Graph API
82
78
  Using customized SCIM attributes according to Microsoft Graph API
83
79
  Includes Symantec/Broadcom/CA ConnectorXpress metafile for creating provisioning "Azure - ScimGateway" endpoint type
@@ -85,7 +81,7 @@ Includes Symantec/Broadcom/CA ConnectorXpress metafile for creating provisioning
85
81
  * **LDAP** (Directory)
86
82
  Fully functional LDAP plugin
87
83
  Pre-configured for Microsoft Active Directory
88
- Using endpointMapper (like plugin-azure-ad) for attribute flexibility
84
+ Using endpointMapper (like plugin-entra-id) for attribute flexibility
89
85
 
90
86
  * **API** (REST Webservices)
91
87
  Demonstrates API Gateway/plugin functionality using post/put/patch/get/delete
@@ -189,10 +185,10 @@ When maintaining a set of modifications it useful to disable the postinstall ope
189
185
  const loki = require('./lib/plugin-loki')
190
186
  // const mongodb = require('./lib/plugin-mongodb')
191
187
  // const scim = require('./lib/plugin-scim')
192
- // const soap = require('./lib/plugin-soap')
188
+ // const soap = require('./lib/plugin-soap') // prereq: npm install soap
193
189
  // const mssql = require('./lib/plugin-mssql')
194
- // const saphana = require('./lib/plugin-saphana') // prereq: npm install hdb
195
- // const azureAD = require('./lib/plugin-azure-ad')
190
+ // const saphana = require('./lib/plugin-saphana') // prereq: npm install hdb
191
+ // const entra = require('./lib/plugin-entra-id')
196
192
  // const ldap = require('./lib/plugin-ldap')
197
193
  // const api = require('./lib/plugin-api')
198
194
 
@@ -299,7 +295,31 @@ Below shows an example of config\plugin-saphana.json
299
295
  "enabled": false,
300
296
  "shutdownTimeout": 15000,
301
297
  "forceExitTimeout": 1000
302
- }
298
+ },
299
+ "stream": {
300
+ "baseUrls": [],
301
+ "certificate": {
302
+ "ca": null
303
+ },
304
+ "subscriber": {
305
+ "enabled": false,
306
+ "entity": {
307
+ "undefined": {
308
+ "nats": {
309
+ "tenant": null,
310
+ "subject": null,
311
+ "jwt": null,
312
+ "secret": null
313
+ },
314
+ "deleteUserOnLastGroupRoleRemoval": false,
315
+ "convertRolesToGroups": false,
316
+ "generateUserPassword": false,
317
+ "modifyOnly": false,
318
+ "replaceDomains": []
319
+ }
320
+ }
321
+ }
322
+ }
303
323
  },
304
324
  "endpoint": {
305
325
  "host": "hostname",
@@ -328,7 +348,7 @@ Definitions in `endpoint` object are customized according to our plugin code. Pl
328
348
  - **scim.customSchema** - filename of JSON file located in `<package-root>\config\schemas` containing custom schema attributes, see configuration notes
329
349
  **additional information**: Schemas, ServiceProviderConfig and ResourceType can be customized if `lib/scimdef-v2.js (or scimdef-v1.js)` exists. Original scimdef-v2.js/scimdef-v1.js can be copied from node_modules/scimgateway/lib to your plugin/lib and customized.
330
350
 
331
- - **scim.skipTypeConvert** - true or false, default false. Multivalue attributes supporting types e.g. emails, phoneNumbers, ims, photos, addresses, entitlements and x509Certificates (but not roles, groups and members) will be become "type converted objects" when sent to modifyUser and createUser. This for simplicity of checking attributes included and also for the endpointMapper method (used by plugin-ldap and plugin-azure-ad), e.g.:
351
+ - **scim.skipTypeConvert** - true or false, default false. Multivalue attributes supporting types e.g. emails, phoneNumbers, ims, photos, addresses, entitlements and x509Certificates (but not roles, groups and members) will be become "type converted objects" when sent to modifyUser and createUser. This for simplicity of checking attributes included and also for the endpointMapper method (used by plugin-ldap and plugin-entra-id), e.g.:
332
352
 
333
353
  "emails": {
334
354
  "work": {"value": "jsmith@example.com", "type": "work"},
@@ -345,7 +365,7 @@ Definitions in `endpoint` object are customized according to our plugin code. Pl
345
365
  ]
346
366
 
347
367
 
348
- - **scim.usePutSoftSync** - true or false, default false. `PUT /Users/bjensen` will replace the user bjensen with body content. If body contains groups, usePutSoftsync=true will prevent removing any existing groups that are not included in body.groups
368
+ - **scim.usePutSoftSync** - true or false, default false. `PUT /Users/bjensen` will replace the user bjensen with body content. If set to `true`, only PUT body content will be replaced. Any additional existing user attributes and groups supported by plugin will remain as-is.
349
369
 
350
370
  - **scim."usePutGroupMemberOfUser** - true or false, default false. `PUT /Users/<user>` will replace the user with body content. If body contains groups and usePutGroupMemberOfUser=true, groups will be set on user object (groups are member of user) instead of default user member of groups
351
371
 
@@ -362,9 +382,9 @@ Definitions in `endpoint` object are customized according to our plugin code. Pl
362
382
 
363
383
  - **auth.basic** - Array of one ore more basic authentication objects - Basic Authentication with **username**/**password**. Note, we set a clear text password that will become encrypted when gateway is started.
364
384
 
365
- - **auth.bearerToken** - Array of one or more bearer token objects - Shared token/secret (supported by Azure). Clear text value will become encrypted when gateway is started.
385
+ - **auth.bearerToken** - Array of one or more bearer token objects - Shared token/secret (supported by Entra ID). Clear text value will become encrypted when gateway is started.
366
386
 
367
- - **auth.bearerJwtAzure** - Array of one or more JWT used by Azure SyncFabric. **tenantIdGUID** must be set to Azure Active Directory Tenant ID.
387
+ - **auth.bearerJwtAzure** - Array of one or more JWT used by Azure SyncFabric. **tenantIdGUID** must be set to Entra ID Tenant ID.
368
388
 
369
389
  - **auth.bearerJwt** - Array of one or more standard JWT objects. Using **secret** or **publicKey** for signature verification. publicKey should be set to the filename of public key or certificate pem-file located in `<package-root>\config\certs`. Clear text secret will become encrypted when gateway is started. **options.issuer** is mandatory. Other options may also be included according to jsonwebtoken npm package definition.
370
390
 
@@ -397,7 +417,7 @@ Definitions in `endpoint` object are customized according to our plugin code. Pl
397
417
 
398
418
  Note, we should normally use certificate (https) for communicating with SCIM Gateway unless we install ScimGatway locally on the manager (e.g. on the CA Connector Server). When installed on the manager, we could use `http://localhost:port` or `http://127.0.0.1:port` which will not be passed down to the data link layer for transmission. We could then also set {"localhostonly": true}
399
419
 
400
- - **ipAllowList** - Array of one or more IPv4/IPv6 subnets (CIDR) allowed for incoming traffic. E.g. using Azure AD as IdP, we would like to restrict access to IP addresses used by Azure AD. Azure IP-range can be downloaded from: [https://azureipranges.azurewebsites.net](https://azureipranges.azurewebsites.net), enter **AzureActiveDirectory** in the search list and select JSON download. Copy the "addressPrefixes" array content and paste into ipAllowList array. CIDR single IP-host syntax is a.b.c.d/32. Note, front-end HTTP proxy or a load balancer must include client IP-address in the **X-Forwarded-For** header. Configuration example:
420
+ - **ipAllowList** - Array of one or more IPv4/IPv6 subnets (CIDR) allowed for incoming traffic. E.g. using Entra ID as IdP, we would like to restrict access to IP addresses used by Azure. Azure IP-range can be downloaded from: [https://azureipranges.azurewebsites.net](https://azureipranges.azurewebsites.net), enter **AzureActiveDirectory** in the search list and select JSON download. Copy the "addressPrefixes" array content and paste into ipAllowList array. CIDR single IP-host syntax is a.b.c.d/32. Note, front-end HTTP proxy or a load balancer must include client IP-address in the **X-Forwarded-For** header. Configuration example:
401
421
 
402
422
  "ipAllowList": [
403
423
  "13.64.151.161/32",
@@ -424,6 +444,8 @@ Definitions in `endpoint` object are customized according to our plugin code. Pl
424
444
  - **kubernetes.shutdownTimeout** - Number of milliseconds to wait before shutting down (default 15000).
425
445
  - **kubernetes.forceExitTimeout** - Number of milliseconds before forceful exiting (default 1000).
426
446
 
447
+ - **stream** - See [SCIM Stream](https://elshaug.xyz/docs/scim-stream) for configuration details
448
+
427
449
  - **endpoint** - Contains endpoint specific configuration according to our **plugin code**.
428
450
 
429
451
  #### Configuration notes
@@ -656,11 +678,11 @@ To upgrade scimgateway docker image (remove the old stuff before running docker-
656
678
  docker rm scimgateway
657
679
  docker rm $(docker ps -a -q); docker rmi $(docker images -q -f "dangling=true")
658
680
 
659
- ## Azure Active Directory as IdP using SCIM Gateway
681
+ ## Entra ID as IdP using SCIM Gateway
660
682
 
661
- Azure AD could do automatic user provisioning by synchronizing users towards SCIM Gateway, and gateway plugins will update endpoints.
683
+ Entra ID could do automatic user provisioning by synchronizing users towards SCIM Gateway, and gateway plugins will update endpoints.
662
684
 
663
- Plugin configuration file must include **SCIM Version "2.0"** (scimgateway.scim.version) and either **Bearer Token** (scimgateway.auth.bearerToken[x].token) or **Azure Tenant ID GUID** (scimgateway.auth.bearerJwtAzure[x].tenantIdGUID) or both:
685
+ Plugin configuration file must include **SCIM Version "2.0"** (scimgateway.scim.version) and either **Bearer Token** (scimgateway.auth.bearerToken[x].token) or **Entra ID Tenant ID GUID** (scimgateway.auth.bearerJwtAzure[x].tenantIdGUID) or both:
664
686
 
665
687
  scimgateway: {
666
688
  "scim": {
@@ -683,42 +705,42 @@ Plugin configuration file must include **SCIM Version "2.0"** (scimgateway.scim.
683
705
  ...
684
706
  }
685
707
 
686
- `token` configuration must correspond with "Secret Token" defined in Azure AD
687
- `tenantIdGUID` configuration must correspond with Azure Active Directory Tenant ID
708
+ `token` configuration must correspond with "Secret Token" defined in Entra ID
709
+ `tenantIdGUID` configuration must correspond with Entra ID Tenant ID
688
710
 
689
711
  In Azure Portal:
690
- `Azure-Azure Active Directory-Enterprise Application-<My Application>-Provisioning-Secret Token`
712
+ `Azure-Microsoft Entra ID-Enterprise Application-<My Application>-Provisioning-Secret Token`
691
713
  Note, when "Secret Token" is left blank, Azure will use JWT (tenantIdGUID)
692
714
 
693
- `Azure-Azure Active Directory-Overview-Tenant ID`
715
+ `Azure-Microsoft Entra ID-Overview-Tenant ID`
694
716
 
695
717
  User mappings attributes between AD and SCIM also needs to be configured
696
718
 
697
- `Azure-Azure Active Directory-Enterprise Application-<My Application>-Provisioning-Edit attribute mappings-Mappings`
719
+ `Azure-Microsoft Entra ID-Enterprise Application-<My Application>-Provisioning-Edit attribute mappings-Mappings`
698
720
 
699
- Azure AD default SCIM attribute mapping for **USER** must have:
721
+ Entra ID default SCIM attribute mapping for **USER** must have:
700
722
 
701
723
  userPrincipalName mapped to userName (matching precedence #1)
702
724
 
703
725
 
704
- Azure AD default SCIM attribute mapping for **GROUP** must have:
726
+ Entra ID default SCIM attribute mapping for **GROUP** must have:
705
727
 
706
728
  displayName mapped to displayName (matching precedence #1)
707
729
  members mapped to members
708
730
 
709
731
 
710
732
 
711
- Some notes related to Azure AD:
733
+ Some notes related to Entra ID:
712
734
 
713
- - Azure Active Directory SCIM [documentation](https://docs.microsoft.com/en-us/azure/active-directory/active-directory-scim-provisioning)
735
+ - Entra ID SCIM [documentation](https://learn.microsoft.com/en-us/entra/identity/app-provisioning/use-scim-to-provision-users-and-groups)
714
736
 
715
- - For using OAuth/JWT credentials, Azure configuration "Secret Token" (bearer token) should be blank. Plugin configuration must then include bearerJwtAzure.tenantIdGUID. Click "Test Connection" in Azure to verify
737
+ - For using OAuth/JWT credentials, Entra ID configuration "Secret Token" (bearer token) should be blank. Plugin configuration must then include bearerJwtAzure.tenantIdGUID. Click "Test Connection" in Azure to verify
716
738
 
717
- - Azure AD do a regular check for a "none" existing user/group. This check seems to be a "keep alive" to verify connection.
739
+ - Entra ID do a regular check for a "non" existing user/group. This check seems to be a "keep alive" to verify connection.
718
740
 
719
- - Azure AD first checks if user/group exists, if not exist they will be created (no explore of all users like CA Identity Manager)
741
+ - Entra ID first checks if user/group exists, if not exist they will be created (no explore of all users like CA Identity Manager)
720
742
 
721
- - Deleting a user in Azure AD sends a modify user `{"active":"False"}` which means user should be disabled. This logic is default set in attribute mappings expression rule `Switch([IsSoftDeleted], , "False", "True", "True", "False")`. Standard SCIM "DELETE" method seems not to be used.
743
+ - Deleting a user in Entra ID sends a modify user `{"active":"False"}` which means user should be disabled. This logic is default set in attribute mappings expression rule `Switch([IsSoftDeleted], , "False", "True", "True", "False")`. Standard SCIM "DELETE" method seems not to be used.
722
744
 
723
745
 
724
746
  ## CA Identity Manager as IdP using SCIM Gateway
@@ -758,18 +780,15 @@ Each baseEntity should then be defined in the plugin configuration file with cus
758
780
  IM 12.6 SP7 (and above) also supports pagination for SCIM endpoint (data transferred in bulks - endpoint explore of users). Loki plugin supports pagination. Other plugin may ignore this setting.
759
781
 
760
782
 
761
- ## Azure Active Directory provisioning
762
- Using plugin-azure-ad we could do user provisioning towards Azure AD including license management e.g. O365
783
+ ## Entra ID provisioning
784
+ Using plugin-entra-id we could do user provisioning towards Entra ID including license management e.g. O365
763
785
 
764
786
  For testing purposes we could get an Azure free account and in addition the free Office 365 for testing license management through Azure.
765
787
 
766
- There are two alternative ways of configuring Azure AD. Alternative #1 is probably best and easiest
767
-
768
-
769
- ### Azure AD configuration
788
+ ### Entra ID configuration
770
789
 
771
790
  - Logon to [Azure](https://portal.azure.com) as global administrator
772
- - Azure Active Directory - App registrations
791
+ - Microsoft Entra ID - App registrations
773
792
  - Click "New registration"
774
793
  - Name = SCIM Gateway Inbound
775
794
  - Select: Accounts in this organizational directory only
@@ -792,7 +811,7 @@ There are two alternative ways of configuring Azure AD. Alternative #1 is probab
792
811
  - Organization - Organization.ReadWrite.All
793
812
  - Click "Add permissions"
794
813
  Note, we also have to go to Enterprise application to grant these consents
795
- - Azure Active Directory - Enterprise applications - SCIM Gateway Inbound
814
+ - Microsoft Entra ID - Enterprise applications - SCIM Gateway Inbound
796
815
  - Permissions:
797
816
  - Click "Grant admin consent for [tenant name]"
798
817
  - In the logon dialog, logon as global administrator
@@ -804,7 +823,7 @@ There are two alternative ways of configuring Azure AD. Alternative #1 is probab
804
823
 
805
824
  Also note, enable/disable user (accountEnabled - through Graph API) will fail if user have an "Administrator" role other than above mentioned "User Administrator" e.g. "Group Administrator"/"Application Administrator". To be sure we can enable/disable all users, application needs to be member of **"Global administrator"** - 62e90394-69f5-4237-9190-012177145e10.
806
825
 
807
- - Azure Active Directory - Roles and administration
826
+ - Microsoft Entra ID - Roles and administration
808
827
  - Click on role **"User administrator"**
809
828
  - Click "Add assignments"
810
829
  - Search: SCIM Gateway Inbound (application name)
@@ -813,11 +832,11 @@ Also note, enable/disable user (accountEnabled - through Graph API) will fail if
813
832
  ### SCIM Gateway configuration
814
833
 
815
834
  **Edit index.js**
816
- Uncomment startup of plugin-azure-ad, other plugins could be comment out if not needed
835
+ Uncomment startup of plugin-entra-id, other plugins could be comment out if not needed
817
836
 
818
- const azureAD = require('./lib/plugin-azure-ad')
837
+ const entra = require('./lib/plugin-entra-id')
819
838
 
820
- **Edit plugin-azure-ad.json**
839
+ **Edit plugin-entra-id.json**
821
840
 
822
841
  Note, for Symantec/Broadcom/CA Provisioning we have to use SCIM version 1.1
823
842
 
@@ -838,7 +857,7 @@ Note, for Symantec/Broadcom/CA Provisioning we have to use SCIM version 1.1
838
857
  }
839
858
  ],
840
859
 
841
- Update `tenantIdGUID`, `clientID` and `clientSecret` according to what you copied from the previous Azure AD configuration.
860
+ Update `tenantIdGUID`, `clientID` and `clientSecret` according to what you copied from the previous Entra ID configuration.
842
861
 
843
862
  If using proxy, set proxy.host to `"http://<FQDN-ProxyHost>:<port>"` e.g `"http://proxy.mycompany.com:3128"`
844
863
 
@@ -883,8 +902,8 @@ Note, we should normally use certificate (https) for communicating with SCIM Gat
883
902
  Create a new endpoint type "Azure - ScimGateway"
884
903
 
885
904
  - Start SCIM Gateway
886
- - "const azureAD" must be uncomment in `index.js`
887
- - username, password and port defined in `plugin-azure-ad.json` must also be known
905
+ - "const entra" must be uncomment in `index.js`
906
+ - username, password and port defined in `plugin-entra-id.json` must also be known
888
907
  - Start ConnectorXpress
889
908
  - Setup Data Sources
890
909
  - Add
@@ -1082,6 +1101,16 @@ Plugins should have following initialization:
1082
1101
  ret.Resources = array filled with user objects according to getObj/attributes, we could normally include all attributes having id and userName as mandatory e.g [{"id": "bjensen", "userName": "bjensen"}, {"id":"jsmith", "userName":"jsmith"}]
1083
1102
  ret.totalResults = if supporting pagination, then it should be set to the total numbers of elements (users), else set to null
1084
1103
 
1104
+ ### createUser
1105
+ scimgateway.createUser = async (baseEntity, userObj, ctx) => {
1106
+ ...
1107
+ return { "id": uniqueID }
1108
+ })
1109
+
1110
+ * userObj = user object containing userattributes according to scim standard
1111
+ userObj.userName contains the unique naming at IdP
1112
+ * return the created user object or minimum the id generated { "id": uniqueID }, null is also accepted else throw error
1113
+
1085
1114
  ### deleteUser
1086
1115
 
1087
1116
  scimgateway.deleteUser = async (baseEntity, id, ctx) => {
@@ -1131,12 +1160,12 @@ ret.totalResults = if supporting pagination, then it should be set to the total
1131
1160
  ### createGroup
1132
1161
  scimgateway.createGroup = async (baseEntity, groupObj, ctx) => {
1133
1162
  ...
1134
- return null
1163
+ return { "id": uniqueID }
1135
1164
  })
1136
1165
 
1137
1166
  * groupObj = group object containing groupattributes according to scim standard
1138
1167
  groupObj.displayName contains the group name to be created
1139
- * return null: null if OK, else throw error
1168
+ * return the created group object or minimum the id generated { "id": uniqueID }, null is also accepted else throw error
1140
1169
 
1141
1170
  ### deleteGroup
1142
1171
  scimgateway.deleteGroup = async (baseEntity, id, ctx) => {
@@ -1170,6 +1199,28 @@ MIT © [Jarle Elshaug](https://www.elshaug.xyz)
1170
1199
 
1171
1200
  ## Change log
1172
1201
 
1202
+ ### v4.4.0
1203
+
1204
+ [Added]
1205
+
1206
+ - SCIM Gateway now offers enhanced functionality with support for message subscription and automated provisioning using [SCIM Stream](https://elshaug.xyz/docs/scim-stream)
1207
+ - plugin-entra-id, plugin-scim and plugin-api having updated `REST endpoint helpers-template` to address and resolve endpoint throttling
1208
+
1209
+ Note, module soap is not default included anymore. SOAP based plugins e.g., plugin-soap therefore needs `npm install soap` for including module in your package
1210
+
1211
+ ### v4.3.0
1212
+
1213
+ [Added]
1214
+
1215
+ - configuration `scimgateway.scim.port` can now be set to 0 or removed for deactivating listener
1216
+ - configuration `cimgateway.scim.usePutSoftSync` set to `true` now includes additional logic that do not change existing user attributes not included in PUT body content
1217
+ - createUser/createGroup no longer return id if id have not been returned by plugin or by getUser filtering on userName. Previously userName was returned as id when missing plugin logic.
1218
+ - plugin-ldap supporting simpel filtering
1219
+ - plugin-loki using baseEntity configuration for supporting multi loki endpoints
1220
+ - plugin-azure-ad renamed to plugin-entra-id
1221
+ - plugin-entra-id and plugin-scim now using an updated default REST helpers-template that gives more flexible endpoint authentication support like OAuth, Basic, Bearer, custom-headers, no-auth,...
1222
+ - Dependencies bump
1223
+
1173
1224
  ### v4.2.17
1174
1225
 
1175
1226
  [Fixed]
@@ -93,6 +93,30 @@
93
93
  "enabled": false,
94
94
  "shutdownTimeout": 15000,
95
95
  "forceExitTimeout": 1000
96
+ },
97
+ "stream": {
98
+ "baseUrls": [],
99
+ "certificate": {
100
+ "ca": null
101
+ },
102
+ "subscriber": {
103
+ "enabled": false,
104
+ "entity": {
105
+ "undefined": {
106
+ "nats": {
107
+ "tenant": null,
108
+ "subject": null,
109
+ "jwt": null,
110
+ "secret": null
111
+ },
112
+ "deleteUserOnLastGroupRoleRemoval": false,
113
+ "convertRolesToGroups": false,
114
+ "generateUserPassword": false,
115
+ "modifyOnly": false,
116
+ "replaceDomains": []
117
+ }
118
+ }
119
+ }
96
120
  }
97
121
  },
98
122
  "endpoint": {
@@ -101,8 +125,9 @@
101
125
  "baseUrls": [
102
126
  "http://fakerestapi.azurewebsites.net"
103
127
  ],
104
- "username": "endpointuser",
105
- "password": "password",
128
+ "oauth": null,
129
+ "bearerAuth": null,
130
+ "basicAuth": null,
106
131
  "proxy": {
107
132
  "host": null,
108
133
  "username": null,
@@ -111,4 +136,4 @@
111
136
  }
112
137
  }
113
138
  }
114
- }
139
+ }
@@ -7,8 +7,7 @@
7
7
  "version": "2.0",
8
8
  "customSchema": null,
9
9
  "skipTypeConvert": false,
10
- "usePutSoftSync": false,
11
- "usePutGroupMemberOfUser": false
10
+ "usePutSoftSync": false
12
11
  },
13
12
  "log": {
14
13
  "loglevel": {
@@ -93,14 +92,44 @@
93
92
  "enabled": false,
94
93
  "shutdownTimeout": 15000,
95
94
  "forceExitTimeout": 1000
95
+ },
96
+ "stream": {
97
+ "baseUrls": [],
98
+ "certificate": {
99
+ "ca": null
100
+ },
101
+ "subscriber": {
102
+ "enabled": false,
103
+ "entity": {
104
+ "undefined": {
105
+ "nats": {
106
+ "tenant": null,
107
+ "subject": null,
108
+ "jwt": null,
109
+ "secret": null
110
+ },
111
+ "deleteUserOnLastGroupRoleRemoval": false,
112
+ "convertRolesToGroups": false,
113
+ "generateUserPassword": false,
114
+ "modifyOnly": false,
115
+ "replaceDomains": []
116
+ }
117
+ }
118
+ }
96
119
  }
97
120
  },
98
121
  "endpoint": {
99
122
  "entity": {
100
123
  "undefined": {
101
- "tenantIdGUID": "DomanName or DirectoryID (GUID)",
102
- "clientId": "Applicatin ID",
103
- "clientSecret": "Generated application key value",
124
+ "baseUrls": ["not in use by plugin-entra-id (hardcoded)"],
125
+ "oauth": {
126
+ "tenantIdGUID": "DomainName or DirectoryID (GUID) - only used by plugin-entra-id",
127
+ "tokenUrl": "not in use by plugin-entra-id (hardcoded)",
128
+ "clientId": "Application ID",
129
+ "clientSecret": "Generated application secret value"
130
+ },
131
+ "bearerAuth": null,
132
+ "basicAuth": null,
104
133
  "proxy": {
105
134
  "host": null,
106
135
  "username": null,
@@ -271,4 +300,4 @@
271
300
  }
272
301
  }
273
302
  }
274
- }
303
+ }
@@ -93,6 +93,30 @@
93
93
  "enabled": false,
94
94
  "shutdownTimeout": 15000,
95
95
  "forceExitTimeout": 1000
96
+ },
97
+ "stream": {
98
+ "baseUrls": [],
99
+ "certificate": {
100
+ "ca": null
101
+ },
102
+ "subscriber": {
103
+ "enabled": false,
104
+ "entity": {
105
+ "undefined": {
106
+ "nats": {
107
+ "tenant": null,
108
+ "subject": null,
109
+ "jwt": null,
110
+ "secret": null
111
+ },
112
+ "deleteUserOnLastGroupRoleRemoval": false,
113
+ "convertRolesToGroups": false,
114
+ "generateUserPassword": false,
115
+ "modifyOnly": false,
116
+ "replaceDomains": []
117
+ }
118
+ }
119
+ }
96
120
  }
97
121
  },
98
122
  "endpoint": {
@@ -93,10 +93,38 @@
93
93
  "enabled": false,
94
94
  "shutdownTimeout": 15000,
95
95
  "forceExitTimeout": 1000
96
+ },
97
+ "stream": {
98
+ "baseUrls": [],
99
+ "certificate": {
100
+ "ca": null
101
+ },
102
+ "subscriber": {
103
+ "enabled": false,
104
+ "entity": {
105
+ "undefined": {
106
+ "nats": {
107
+ "tenant": null,
108
+ "subject": null,
109
+ "jwt": null,
110
+ "secret": null
111
+ },
112
+ "deleteUserOnLastGroupRoleRemoval": false,
113
+ "convertRolesToGroups": false,
114
+ "generateUserPassword": false,
115
+ "modifyOnly": false,
116
+ "replaceDomains": []
117
+ }
118
+ }
119
+ }
96
120
  }
97
121
  },
98
122
  "endpoint": {
99
- "dbname": "loki.db",
100
- "persistence": false
123
+ "entity": {
124
+ "undefined": {
125
+ "dbname": "loki.db",
126
+ "persistence": false
127
+ }
128
+ }
101
129
  }
102
- }
130
+ }
@@ -99,6 +99,30 @@
99
99
  "enabled": false,
100
100
  "shutdownTimeout": 15000,
101
101
  "forceExitTimeout": 1000
102
+ },
103
+ "stream": {
104
+ "baseUrls": [],
105
+ "certificate": {
106
+ "ca": null
107
+ },
108
+ "subscriber": {
109
+ "enabled": false,
110
+ "entity": {
111
+ "undefined": {
112
+ "nats": {
113
+ "tenant": null,
114
+ "subject": null,
115
+ "jwt": null,
116
+ "secret": null
117
+ },
118
+ "deleteUserOnLastGroupRoleRemoval": false,
119
+ "convertRolesToGroups": false,
120
+ "generateUserPassword": false,
121
+ "modifyOnly": false,
122
+ "replaceDomains": []
123
+ }
124
+ }
125
+ }
102
126
  }
103
127
  },
104
128
  "endpoint": {
@@ -93,6 +93,30 @@
93
93
  "enabled": false,
94
94
  "shutdownTimeout": 15000,
95
95
  "forceExitTimeout": 1000
96
+ },
97
+ "stream": {
98
+ "baseUrls": [],
99
+ "certificate": {
100
+ "ca": null
101
+ },
102
+ "subscriber": {
103
+ "enabled": false,
104
+ "entity": {
105
+ "undefined": {
106
+ "nats": {
107
+ "tenant": null,
108
+ "subject": null,
109
+ "jwt": null,
110
+ "secret": null
111
+ },
112
+ "deleteUserOnLastGroupRoleRemoval": false,
113
+ "convertRolesToGroups": false,
114
+ "generateUserPassword": false,
115
+ "modifyOnly": false,
116
+ "replaceDomains": []
117
+ }
118
+ }
119
+ }
96
120
  }
97
121
  },
98
122
  "endpoint": {
@@ -93,6 +93,30 @@
93
93
  "enabled": false,
94
94
  "shutdownTimeout": 15000,
95
95
  "forceExitTimeout": 1000
96
+ },
97
+ "stream": {
98
+ "baseUrls": [],
99
+ "certificate": {
100
+ "ca": null
101
+ },
102
+ "subscriber": {
103
+ "enabled": false,
104
+ "entity": {
105
+ "undefined": {
106
+ "nats": {
107
+ "tenant": null,
108
+ "subject": null,
109
+ "jwt": null,
110
+ "secret": null
111
+ },
112
+ "deleteUserOnLastGroupRoleRemoval": false,
113
+ "convertRolesToGroups": false,
114
+ "generateUserPassword": false,
115
+ "modifyOnly": false,
116
+ "replaceDomains": []
117
+ }
118
+ }
119
+ }
96
120
  }
97
121
  },
98
122
  "endpoint": {