Skip to content

Commit 7617bc1

Browse files
committed
fix: tested with Okta, type annotations
1 parent 649bdd9 commit 7617bc1

2 files changed

Lines changed: 12 additions & 10 deletions

File tree

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,7 @@ This provider can be used as a starting point if you want to implement a SCIM pr
4949
- Support the `/Me` endpoint, if it applies in your use case
5050
- Add support for using either a static URL prefix or improve the support for usage behind a reverse proxy
5151

52-
The provider in its current state has been tested successfully against a live Microsoft Entra system.
52+
The provider in its current state has been tested successfully against a live
53+
[Microsoft Entra](https://learn.microsoft.com/en-us/entra/identity/app-provisioning/scim-validator-tutorial)
54+
system as well as a live
55+
[Okta](https://developer.okta.com/docs/guides/scim-provisioning-integration-test/main/) system.

scim2_server/provider.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import copy
21
import json
32
import logging
43
import traceback
@@ -435,7 +434,7 @@ def forbid_filter(request: Request):
435434
if "filter" in request.args:
436435
raise Forbidden
437436

438-
def call_service_provider_config(self, request, **kwargs):
437+
def call_service_provider_config(self, request: Request, **kwargs):
439438
"""Returns the ServiceProviderConfig."""
440439
self.forbid_filter(request)
441440
auth_scheme = (
@@ -467,25 +466,25 @@ def call_service_provider_config(self, request, **kwargs):
467466
).model_dump()
468467
)
469468

470-
def call_resource_type(self, request, resource_type: str, **kwargs):
469+
def call_resource_type(self, request: Request, resource_type: str, **kwargs):
471470
"""Returns a single resource type."""
472471
self.forbid_filter(request)
473472
if res := self.backend.get_resource_type(resource_type):
474-
cp = copy.copy(res)
473+
cp = res.model_copy(deep=True)
475474
cp.meta.location = request.url
476475
return self.make_response(cp.model_dump())
477476
raise NotFound
478477

479-
def call_schema(self, request, schema_id: str):
478+
def call_schema(self, request: Request, schema_id: str):
480479
"""Returns a single schema."""
481480
self.forbid_filter(request)
482481
if res := self.backend.get_schema(schema_id):
483-
cp = copy.copy(res)
482+
cp = res.model_copy(deep=True)
484483
cp.meta.location = request.url
485484
return self.make_response(cp.model_dump())
486485
raise NotFound
487486

488-
def call_resource_types(self, request, **kwargs):
487+
def call_resource_types(self, request: Request, **kwargs):
489488
"""Returns a ListResponse of all known resource types."""
490489
self.forbid_filter(request)
491490
results = self.backend.get_resource_types()
@@ -497,7 +496,7 @@ def call_resource_types(self, request, **kwargs):
497496
).model_dump()
498497
return self.make_response(resp)
499498

500-
def call_schemas(self, request, **kwargs):
499+
def call_schemas(self, request: Request, **kwargs):
501500
"""Returns a ListResponse of all known schemas."""
502501
self.forbid_filter(request)
503502
results = self.backend.get_schemas()
@@ -509,7 +508,7 @@ def call_schemas(self, request, **kwargs):
509508
).model_dump()
510509
return self.make_response(resp)
511510

512-
def wsgi_app(self, request, environ):
511+
def wsgi_app(self, request: Request, environ):
513512
try:
514513
if environ.get("PATH_INFO", "").endswith(".scim"):
515514
# RFC 7644, Section 3.8

0 commit comments

Comments
 (0)