Skip to content

Commit cf6a6d3

Browse files
committed
feat(scim): Add SCIM 2.0 provisioning support
Implements SCIM 2.0 discovery (ServiceProviderConfig, Schemas, ResourceTypes), Users and Groups CRUD, the Me endpoint, search, eq/and filtering, group PATCH, per RFC 7643 and RFC 7644. Refs #3089
1 parent f24e9ed commit cf6a6d3

78 files changed

Lines changed: 24617 additions & 10 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/scim.yaml

Lines changed: 2316 additions & 0 deletions
Large diffs are not rendered by default.

backend/.mockery.private.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,30 @@ packages:
415415
structname: '{{.InterfaceName}}Mock'
416416
pkgname: attestation
417417
filename: "{{.InterfaceName}}_mock_test.go"
418+
419+
github.com/thunder-id/thunderid/internal/scim/discovery:
420+
config:
421+
all: true
422+
dir: internal/scim/discovery
423+
structname: '{{.InterfaceName}}Mock'
424+
pkgname: discovery
425+
filename: "{{.InterfaceName}}_mock_test.go"
426+
427+
github.com/thunder-id/thunderid/internal/scim/groups:
428+
config:
429+
all: true
430+
dir: internal/scim/groups
431+
structname: '{{.InterfaceName}}Mock'
432+
pkgname: groups
433+
filename: "{{.InterfaceName}}_mock_test.go"
434+
435+
github.com/thunder-id/thunderid/internal/scim/users:
436+
config:
437+
all: true
438+
dir: internal/scim/users
439+
structname: '{{.InterfaceName}}Mock'
440+
pkgname: users
441+
filename: "{{.InterfaceName}}_mock_test.go"
418442

419443
github.com/thunder-id/thunderid/internal/system/resourcedependency:
420444
config:

backend/.mockery.public.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,3 +728,24 @@ packages:
728728
structname: '{{.InterfaceName}}Mock'
729729
pkgname: presentationmock
730730
filename: "{{.InterfaceName}}_mock.go"
731+
github.com/thunder-id/thunderid/internal/scim/discovery:
732+
config:
733+
all: true
734+
dir: tests/mocks/scim/discoverymock
735+
structname: '{{.InterfaceName}}Mock'
736+
pkgname: discoverymock
737+
filename: "{{.InterfaceName}}_mock.go"
738+
github.com/thunder-id/thunderid/internal/scim/groups:
739+
config:
740+
all: true
741+
dir: tests/mocks/scim/groupsmock
742+
structname: '{{.InterfaceName}}Mock'
743+
pkgname: groupsmock
744+
filename: "{{.InterfaceName}}_mock.go"
745+
github.com/thunder-id/thunderid/internal/scim/users:
746+
config:
747+
all: true
748+
dir: tests/mocks/scim/usersmock
749+
structname: '{{.InterfaceName}}Mock'
750+
pkgname: usersmock
751+
filename: "{{.InterfaceName}}_mock.go"

backend/cmd/server/config/default.json

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@
136136
"validity_period": 3600
137137
},
138138
"dcr": {
139-
"enabled" : true,
139+
"enabled": true,
140140
"insecure": false
141141
},
142142
"par": {
@@ -152,14 +152,26 @@
152152
},
153153
"allow_wildcard_redirect_uri": false,
154154
"send_server_errors_to_client": false,
155-
"allowed_auth_methods" :["client_secret_basic", "client_secret_post", "private_key_jwt", "none"],
156-
"allowed_response_types" : ["code"],
157-
"allowed_grant_types" : ["client_credentials", "authorization_code", "refresh_token", "urn:ietf:params:oauth:grant-type:token-exchange", "urn:openid:params:grant-type:ciba", "urn:ietf:params:oauth:grant-type:jwt-bearer"],
158-
"token_revocation" : {
159-
"enabled" : true
155+
"allowed_auth_methods": [
156+
"client_secret_basic",
157+
"client_secret_post",
158+
"private_key_jwt",
159+
"none"
160+
],
161+
"allowed_response_types": ["code"],
162+
"allowed_grant_types": [
163+
"client_credentials",
164+
"authorization_code",
165+
"refresh_token",
166+
"urn:ietf:params:oauth:grant-type:token-exchange",
167+
"urn:openid:params:grant-type:ciba",
168+
"urn:ietf:params:oauth:grant-type:jwt-bearer"
169+
],
170+
"token_revocation": {
171+
"enabled": true
160172
},
161-
"logout" : {
162-
"enabled" : true
173+
"logout": {
174+
"enabled": true
163175
},
164176
"revocation": {
165177
"token_family": {
@@ -191,6 +203,10 @@
191203
"group": {
192204
"store": "composite"
193205
},
206+
"scim": {
207+
"core_attrs_on_get": false,
208+
"core_user_type_id": "01900000-0000-7000-8000-000000000010"
209+
},
194210
"declarative_resources": {
195211
"enabled": false
196212
},

backend/cmd/server/deployment.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,6 @@ email:
7878
from_address: "noreply@thunderid.dev"
7979
enable_start_tls: false
8080
enable_authentication: true
81+
82+
gate_client:
83+
port: 5190

backend/cmd/server/servicemanager.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ import (
7070
"github.com/thunder-id/thunderid/internal/resource"
7171
"github.com/thunder-id/thunderid/internal/role"
7272
"github.com/thunder-id/thunderid/internal/runtimestore"
73+
"github.com/thunder-id/thunderid/internal/scim"
74+
scimconfig "github.com/thunder-id/thunderid/internal/scim/config"
7375
"github.com/thunder-id/thunderid/internal/serverconfig"
7476
"github.com/thunder-id/thunderid/internal/system/cache"
7577
"github.com/thunder-id/thunderid/internal/system/cmodels"
@@ -208,6 +210,15 @@ func registerServices(mux *http.ServeMux, cacheManager cache.CacheManagerInterfa
208210
fatalOnError(ctx, logger, err, "Failed to initialize Resource Service")
209211
exporters = append(exporters, resourceExporter)
210212

213+
// Initialize SCIM service.
214+
scim.Initialize(
215+
mux,
216+
userService,
217+
entityTypeService,
218+
groupService,
219+
scimconfig.FromServerRuntime(),
220+
)
221+
211222
roleService, roleAssignmentService, ouRoleResolver, roleExporter, err := role.Initialize(
212223
mux, entityService, groupService, ouService, resourceService, entityTypeService, ouAuthzService,
213224
)

0 commit comments

Comments
 (0)