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
      }'
⚠️ Warning: This request might fail if required fields like `schemas` and `name` are missing.

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
      }'
Best Practice: Always include the `schemas` field and ensure all required attributes are present.

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
        }
      ]'
💜 Pro Tip: Use PATCH for partial updates to avoid overwriting unchanged fields.

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'
💡 Key Point: Deleting a user is irreversible. Ensure you have backups or confirmations before proceeding.

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"
}
⚠️ Warning: Check your authorization token and ensure it has the correct permissions.

Error: Not Found

{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
  "status": "404",
  "detail": "Resource not found"
}
⚠️ Warning: Verify the resource ID and endpoint URL.

Error: Bad Request

{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
  "status": "400",
  "detail": "Invalid attribute value"
}
⚠️ Warning: Review the request payload for any invalid or missing fields.

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

ApproachProsConsUse When
SCIMAutomates user provisioning and deprovisioningRequires SCIM support from both IdP and SPManaging user identities in cloud applications
SAMLEnables single sign-on (SSO)Does not automate user provisioningSecuring access to web applications

Quick Reference

📋 Quick Reference

  • POST /Users - Create a new user
  • PATCH /Users/{userId} - Update an existing user
  • DELETE /Users/{userId} - Delete a user
  • GET /Users - List all users
  • GET /Users/{userId} - Retrieve a specific user

Testing and Validation

Testing is critical to ensure your SCIM implementation works as expected. Follow these steps:

  1. Create Users: Test creating users with different attributes.
  2. Update Users: Test updating attributes like email and status.
  3. Delete Users: Test deleting users and verify they are removed from the system.
  4. 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.

💜 Pro Tip: Regularly review and update your SCIM configurations to adapt to changing requirements.