|
| 1 | +# scim2-server |
| 2 | + |
| 3 | +This is an example WSGI-SCIM server using [scim2-models](https://github.com/yaal-coop/scim2-models). |
| 4 | +It utilizes [werkzeug](https://werkzeug.palletsprojects.com/) and [scim2-filter-parser](https://github.com/15five/scim2-filter-parser) and keeps all resources in-memory, |
| 5 | +they are lost once the process exits. |
| 6 | + |
| 7 | +## Features |
| 8 | + |
| 9 | +- [x] Discovery endpoints (`/v2/ServiceProviderConfig`, `/v2/ResourceTypes`, `/v2/Schemas`) |
| 10 | +- [x] Create/Read/Update/Delete resources (`POST`, `GET`, `PUT`, `DELETE`) |
| 11 | +- [x] Searching & Filtering |
| 12 | +- [x] Support for ETags |
| 13 | +- [x] Unique Constraints |
| 14 | +- [x] HTTP PATCH (Add/Remove/Replace) |
| 15 | +- [x] Sorting |
| 16 | + |
| 17 | +The only optional feature currently missing is support for Bulk operations ([RFC 7644, Section 3.7](https://datatracker.ietf.org/doc/html/rfc7644#section-3.7)). |
| 18 | + |
| 19 | +## Usage |
| 20 | + |
| 21 | +This repository functions as a submodule of the parent [scim2-models](https://github.com/yaal-coop/scim2-models). To use it in stand-alone |
| 22 | +mode, apply this diff to `pyproject.toml`: |
| 23 | + |
| 24 | +```diff |
| 25 | +-scim2-models = { path = "../../", develop = true } |
| 26 | ++scim2-models = { git = "https://github.com/yaal-coop/scim2-models" } |
| 27 | +``` |
| 28 | + |
| 29 | +```shell |
| 30 | +$ scim2-server [-h] [--schema SCHEMA] [--resource-type RESOURCE_TYPE] [--bearer-token BEARER_TOKEN] [--hostname HOSTNAME] [--port PORT] [--reverse-proxy] [--dump-resources DUMP_RESOURCES] |
| 31 | +``` |
| 32 | + |
| 33 | +- `-h`/`--help`: Show help message |
| 34 | +- `--reverse-proxy`: Allow using the provider behind a Reverse Proxy (required for URL rewriting). |
| 35 | +- `--schema`: Register schemas from specified JSON file. If not provided, loads the default schemas from RFC 7643. |
| 36 | +- `--resource-type`: Register resource types from specified JSON file. If not provided, loads the default resource types from RFC 7643. |
| 37 | +- `--bearer-token`: Registers a bearer token that can be used for accessing the service. If no tokens are provided, anonymous access without authentication is allowed. |
| 38 | +- `--hostname`: The hostname to listen on. Defaults to `127.0.0.1`. |
| 39 | +- `--port`: The port to listen on. Defaults to `8080`. |
| 40 | +- `--dump-resources`: Dump a JSON document containing all resources when the provider exits normally. |
| 41 | + |
| 42 | +## Notes |
| 43 | + |
| 44 | +This provider can be used as a starting point if you want to implement a SCIM provider. You should probably change the following things, if you want to use it in production: |
| 45 | + |
| 46 | +- Use a proper production WSGI server instead of the one provided by Werkzeug |
| 47 | +- Implement your own Backend as a subclass of `scim2_server.backend.Backend` |
| 48 | +- Implement proper authorization with OAuth instead of public access or static bearer tokens |
| 49 | +- Support the `/Me` endpoint, if it applies in your use case |
| 50 | +- Add support for using either a static URL prefix or improve the support for usage behind a reverse proxy |
| 51 | + |
| 52 | +The provider in its current state has been tested successfully against a live Microsoft Entra system. |
0 commit comments