SCIM 2.0 is a standard for automating user and group provisioning between identity providers (IdPs) and service providers (SPs). It simplifies the process of adding, updating, and removing users across multiple systems, reducing manual effort and minimizing errors.
What is SCIM 2.0?
SCIM 2.0 is a RESTful protocol designed to manage user identities in cloud applications. It provides a standardized way to create, read, update, and delete (CRUD) user and group data, making it easier to integrate with various systems.
Why use SCIM 2.0?
Using SCIM 2.0 streamlines identity management by automating user lifecycle operations. This reduces administrative overhead, ensures consistency across systems, and enhances security by minimizing manual interactions.
How does SCIM 2.0 work?
SCIM 2.0 operates via RESTful APIs, allowing systems to communicate and exchange user data. The protocol uses standard HTTP methods like GET, POST, PUT, and DELETE to perform CRUD operations on user and group resources.
SCIM Endpoints
SCIM 2.0 defines several endpoints for managing users and groups:
/Users: Manages individual user records./Groups: Manages group records./ServiceProviderConfig: Provides configuration details about the SCIM service provider./ResourceTypes: Lists the resource types supported by the service provider./Schemas: Describes the schema definitions used by the service provider.
Example SCIM User Resource
Here’s an example of a SCIM user resource:
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "2819c223-7f76-453a-919d-413861904646",
"externalId": "jdoe123",
"meta": {
"resourceType": "User",
"created": "2011-08-01T18:29:49.797Z",
"lastModified": "2011-08-01T18:29:49.797Z",
"location": "https://example.com/v2/Users/2819c223-7f76-453a-919d-413861904646",
"version": "W/\"Wf8PHmeuEpeO3lu0Q34lsw==\""
},
"name": {
"formatted": "John Doe",
"familyName": "Doe",
"givenName": "John"
},
"userName": "johndoe",
"emails": [
{
"value": "[email protected]",
"type": "work",
"primary": true
}
],
"active": true,
"groups": [
{
"value": "12345678-9abc-def0-1234-56789abcdef0",
"$ref": "https://example.com/v2/Groups/12345678-9abc-def0-1234-56789abcdef0",
"display": "Developers"
}
]
}
Setting Up SCIM 2.0
To implement SCIM 2.0, follow these steps:
Step 1: Choose a Service Provider
Select a service provider that supports SCIM 2.0. Popular options include Okta, Azure AD, and OneLogin.
Step 2: Configure SCIM Endpoints
Set up the necessary SCIM endpoints on your service provider. Ensure they are accessible and secured with HTTPS.
Step 3: Define Mappings
Map the attributes from your identity provider to the SCIM schema used by your service provider. Common attributes include username, email, and group membership.
Step 4: Test the Integration
Test the SCIM integration by creating, updating, and deleting users and groups. Verify that changes are reflected correctly in both systems.
Implementing SCIM 2.0 with Code Examples
Let’s walk through implementing SCIM 2.0 with some code examples.
Creating a User
To create a user, send a POST request to the /Users endpoint.
Wrong Way
curl -X POST \
https://example.com/v2/Users \
-H 'Content-Type: application/json' \
-d '{
"userName": "johndoe",
"emails": [
{
"value": "[email protected]",
"type": "work",
"primary": true
}
],
"active": true
}'
Right Way
curl -X POST \
https://example.com/v2/Users \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "johndoe",
"name": {
"givenName": "John",
"familyName": "Doe"
},
"emails": [
{
"value": "[email protected]",
"type": "work",
"primary": true
}
],
"active": true
}'
Updating a User
To update a user, send a PATCH request to the /Users/{userId} endpoint.
curl -X PATCH \
https://example.com/v2/Users/2819c223-7f76-453a-919d-413861904646 \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '[
{
"op": "replace",
"path": "active",
"value": false
}
]'
Deleting a User
To delete a user, send a DELETE request to the /Users/{userId} endpoint.
curl -X DELETE \
https://example.com/v2/Users/2819c223-7f76-453a-919d-413861904646 \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
Handling Errors
When working with SCIM 2.0, you may encounter various errors. Here are some common ones and how to handle them.
Error: Unauthorized
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
"status": "401",
"detail": "Unauthorized"
}
Error: Not Found
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
"status": "404",
"detail": "Resource not found"
}
Error: Bad Request
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
"status": "400",
"detail": "Invalid attribute value"
}
Security Considerations
Implementing SCIM 2.0 securely is crucial to protect user data and maintain system integrity.
Secure Communication
Always use HTTPS to encrypt data in transit. Avoid using HTTP, as it exposes sensitive information.
Protect API Keys
Store API keys and tokens securely. Never hard-code them in your source code or commit them to version control systems.
Validate Inputs
Validate all incoming data to prevent injection attacks. Use input validation libraries and follow best practices for secure coding.
Rate Limiting
Implement rate limiting to prevent abuse and denial-of-service attacks. Set appropriate limits based on your system’s capacity.
Comparison: SCIM vs SAML
| Approach | Pros | Cons | Use When |
|---|---|---|---|
| SCIM | Automates user provisioning and deprovisioning | Requires SCIM support from both IdP and SP | Managing user identities in cloud applications |
| SAML | Enables single sign-on (SSO) | Does not automate user provisioning | Securing access to web applications |
Quick Reference
📋 Quick Reference
POST /Users- Create a new userPATCH /Users/{userId}- Update an existing userDELETE /Users/{userId}- Delete a userGET /Users- List all usersGET /Users/{userId}- Retrieve a specific user
Testing and Validation
Testing is critical to ensure your SCIM implementation works as expected. Follow these steps:
- Create Users: Test creating users with different attributes.
- Update Users: Test updating attributes like email and status.
- Delete Users: Test deleting users and verify they are removed from the system.
- Edge Cases: Handle edge cases like duplicate usernames and invalid data.
🎯 Key Takeaways
- SCIM 2.0 automates user provisioning and deprovisioning.
- Implement SCIM by setting up endpoints, configuring mappings, and testing integrations.
- Ensure secure communication and protect API keys.
- Compare SCIM with SAML for different use cases.
Troubleshooting Common Issues
Issue: Authentication Failure
Symptom: 401 Unauthorized error.
Solution: Verify your API key and ensure it has the correct permissions.
Issue: Invalid Payload
Symptom: 400 Bad Request error.
Solution: Validate your request payload and ensure all required fields are present.
Issue: Resource Not Found
Symptom: 404 Not Found error.
Solution: Verify the resource ID and endpoint URL.
Conclusion
Implementing SCIM 2.0 for user provisioning and deprovisioning can significantly enhance your identity management processes. By following best practices and handling common issues, you can ensure a smooth and secure integration. That’s it. Simple, secure, works.

