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 +105 -54
- package/config/plugin-api.json +28 -3
- package/config/{plugin-azure-ad.json → plugin-entra-id.json} +35 -6
- package/config/plugin-ldap.json +24 -0
- package/config/plugin-loki.json +31 -3
- package/config/plugin-mongodb.json +24 -0
- package/config/plugin-mssql.json +24 -0
- package/config/plugin-saphana.json +24 -0
- package/config/plugin-scim.json +37 -5
- package/config/plugin-soap.json +24 -0
- package/index.js +3 -3
- package/lib/plugin-api.js +187 -17
- package/lib/{plugin-azure-ad.js → plugin-entra-id.js} +265 -177
- package/lib/plugin-ldap.js +20 -12
- package/lib/plugin-loki.js +80 -51
- package/lib/plugin-mongodb.js +3 -16
- package/lib/plugin-mssql.js +3 -28
- package/lib/plugin-saphana.js +3 -21
- package/lib/plugin-scim.js +187 -42
- package/lib/plugin-soap.js +6 -30
- package/lib/postinstall.js +2 -2
- package/lib/scim-stream.js +13 -0
- package/lib/scimgateway.js +165 -99
- package/lib/utils.js +19 -5
- package/package.json +12 -13
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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|

|
|
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
|
-
* **
|
|
80
|
-
|
|
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-
|
|
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')
|
|
195
|
-
// const
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
##
|
|
681
|
+
## Entra ID as IdP using SCIM Gateway
|
|
660
682
|
|
|
661
|
-
|
|
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 **
|
|
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
|
|
687
|
-
`tenantIdGUID` configuration must correspond with
|
|
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-
|
|
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-
|
|
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-
|
|
719
|
+
`Azure-Microsoft Entra ID-Enterprise Application-<My Application>-Provisioning-Edit attribute mappings-Mappings`
|
|
698
720
|
|
|
699
|
-
|
|
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
|
-
|
|
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
|
|
733
|
+
Some notes related to Entra ID:
|
|
712
734
|
|
|
713
|
-
-
|
|
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,
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
|
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
|
-
##
|
|
762
|
-
Using plugin-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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-
|
|
835
|
+
Uncomment startup of plugin-entra-id, other plugins could be comment out if not needed
|
|
817
836
|
|
|
818
|
-
const
|
|
837
|
+
const entra = require('./lib/plugin-entra-id')
|
|
819
838
|
|
|
820
|
-
**Edit plugin-
|
|
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
|
|
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
|
|
887
|
-
- username, password and port defined in `plugin-
|
|
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
|
|
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
|
|
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]
|
package/config/plugin-api.json
CHANGED
|
@@ -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
|
-
"
|
|
105
|
-
"
|
|
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
|
-
"
|
|
102
|
-
"
|
|
103
|
-
|
|
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
|
+
}
|
package/config/plugin-ldap.json
CHANGED
|
@@ -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": {
|
package/config/plugin-loki.json
CHANGED
|
@@ -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
|
-
"
|
|
100
|
-
|
|
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": {
|
package/config/plugin-mssql.json
CHANGED
|
@@ -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": {
|