New to Claude Skills? Learn how to install them →

mukul975 on GitHub

SCIM Provisioning with Okta

Free

Automate user lifecycle management using SCIM and Okta.

Get this skill

Free · Opens the source repo

What SCIM Provisioning with Okta does

This skill provides a comprehensive solution for automating user lifecycle management through the SCIM 2.0 protocol, utilizing Okta as the identity provider. It enables developers and system administrators to implement automated user provisioning, deprovisioning, and profile updates across various applications. By establishing a SCIM-compliant API endpoint, users can efficiently manage user identities and groups, ensuring that changes in Okta are reflected in downstream applications seamlessly.

The implementation involves building a SCIM server using Python frameworks like Flask or FastAPI, which handles essential operations such as creating, reading, updating, and deleting user accounts. The skill also emphasizes the importance of security by requiring HTTPS and bearer token authentication for all endpoints. This makes it suitable for environments that prioritize compliance and security while managing user identities.

Ideal for organizations looking to streamline their identity management processes, this skill is particularly useful during the deployment of SCIM provisioning capabilities with Okta. It helps in establishing security controls aligned with compliance requirements and enhances the overall security architecture by automating user lifecycle tasks. Additionally, it serves as a valuable resource for troubleshooting SCIM provisioning failures, providing insights into the necessary configurations and mappings.

This skill is targeted at developers and IT professionals who are familiar with REST APIs and have experience working with identity management systems. By leveraging this skill, users can significantly reduce the manual overhead associated with user account management and improve operational efficiency.

When to use it

Use this skill when implementing SCIM provisioning with Okta for automated user management in your applications.

When not to use it

This skill is not suitable for environments that do not utilize Okta or do not require SCIM for identity management.

What you can build with it

Automating User Provisioning

Integrate SCIM with Okta to automate the creation of user accounts in your application based on Okta user data.

Managing User Attributes

Easily sync user attributes between Okta and your application, ensuring profile information is always up to date.

Troubleshooting SCIM Issues

Use this skill to diagnose and resolve SCIM provisioning failures by reviewing the necessary configurations and mappings.

How to install SCIM Provisioning with Okta

View source

1. Install with the skills CLI

npx skills add mukul975/anthropic-cybersecurity-skills/implementing-scim-provisioning-with-okta --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by mukul975

Implementing SCIM Provisioning with Okta

Overview

SCIM (System for Cross-domain Identity Management) is an open standard protocol (RFC 7644) that automates the exchange of user identity information between identity providers like Okta and service providers. This skill covers building a SCIM 2.0-compliant API endpoint and integrating it with Okta for automated user lifecycle management including provisioning, deprovisioning, profile updates, and group management.

When to Use

  • When deploying or configuring implementing scim provisioning with okta capabilities in your environment
  • When establishing security controls aligned to compliance requirements
  • When building or improving security architecture for this domain
  • When conducting security assessments that require this implementation

Prerequisites

  • Okta tenant with admin access (Developer or Production)
  • Application with REST API capable of user management
  • TLS-secured endpoint (HTTPS required)
  • Okta API token or OAuth 2.0 client credentials
  • Python 3.9+ with Flask or FastAPI

Core Concepts

SCIM 2.0 Protocol

SCIM defines a standard schema for representing users and groups via JSON, with a RESTful API for CRUD operations:

OperationHTTP MethodEndpointDescription
Create UserPOST/scim/v2/UsersProvisions a new user account
Read UserGET/scim/v2/Users/{id}Retrieves user details
Update UserPUT/PATCH/scim/v2/Users/{id}Modifies user attributes
Delete UserDELETE/scim/v2/Users/{id}Removes user account
List UsersGET/scim/v2/UsersLists users with filtering
Create GroupPOST/scim/v2/GroupsCreates a group
Manage GroupPATCH/scim/v2/Groups/{id}Add/remove group members

Okta SCIM Integration Architecture

Okta (IdP) ──SCIM 2.0 over HTTPS──> SCIM Server ──> Application Database
     │                                     │
     ├── User Assignment                   ├── Create/Update User
     ├── User Unassignment                 ├── Deactivate User
     ├── Profile Push                      ├── Sync Attributes
     └── Group Push                        └── Manage Groups

Required SCIM Endpoints

  1. ServiceProviderConfig (/scim/v2/ServiceProviderConfig): Advertises SCIM capabilities
  2. ResourceTypes (/scim/v2/ResourceTypes): Describes supported resource types
  3. Schemas (/scim/v2/Schemas): Publishes the SCIM schema definitions
  4. Users (/scim/v2/Users): User lifecycle operations
  5. Groups (/scim/v2/Groups): Group management operations

Workflow

Step 1: Build SCIM 2.0 API Server

Create a Flask-based SCIM server that implements the core endpoints. The server must handle:

  • User CRUD: Create, read, update, delete, and list users
  • Filtering: Support eq filter on userName (required by Okta)
  • Pagination: Return startIndex, itemsPerPage, and totalResults
  • Authentication: Bearer token validation on all endpoints
from flask import Flask, request, jsonify
import uuid
from datetime import datetime

app = Flask(__name__)

# Bearer token for Okta authentication
SCIM_BEARER_TOKEN = "your-secure-token-here"

def require_auth(f):
    def wrapper(*args, **kwargs):
        auth = request.headers.get("Authorization", "")
        if not auth.startswith("Bearer ") or auth[7:] != SCIM_BEARER_TOKEN:
            return jsonify({"detail": "Unauthorized"}), 401
        return f(*args, **kwargs)
    wrapper.__name__ = f.__name__
    return wrapper

@app.route("/scim/v2/Users", methods=["POST"])
@require_auth
def create_user():
    data = request.json
    user_id = str(uuid.uuid4())
    user = {
        "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
        "id": user_id,
        "userName": data.get("userName"),
        "name": data.get("name", {}),
        "emails": data.get("emails", []),
        "active": True,
        "meta": {
            "resourceType": "User",
            "created": datetime.utcnow().isoformat() + "Z",
            "lastModified": datetime.utcnow().isoformat() + "Z",
            "location": f"/scim/v2/Users/{user_id}"
        }
    }
    # Persist user to database
    return jsonify(user), 201

@app.route("/scim/v2/Users", methods=["GET"])
@require_auth
def list_users():
    filter_param = request.args.get("filter", "")
    start_index = int(request.args.get("startIndex", 1))
    count = int(request.args.get("count", 100))
    # Parse filter: userName eq "john@example.com"
    # Query database with filter
    return jsonify({
        "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
        "totalResults": 0,
        "startIndex": start_index,
        "itemsPerPage": count,
        "Resources": []
    })

Step 2: Configure Okta Application

  1. Create SCIM App Integration:

    • Navigate to Okta Admin Console > Applications > Create App Integration
    • Select SWA or SAML 2.0 as sign-on method
    • In the General tab, select SCIM for Provisioning
  2. Configure SCIM Connection:

    • SCIM connector base URL: https://your-app.com/scim/v2
    • Unique identifier field: userName
    • Supported provisioning actions: Push New Users, Push Profile Updates, Push Groups
    • Authentication Mode: HTTP Header (Bearer Token)
  3. Enable Provisioning Features:

    • To App: Create Users, Update User Attributes, Deactivate Users
    • Configure attribute mappings between Okta profile and SCIM schema

Step 3: Map Attributes

Map Okta user profile attributes to your SCIM schema:

Okta AttributeSCIM AttributeDirection
loginuserNameOkta -> App
firstNamename.givenNameOkta -> App
lastNamename.familyNameOkta -> App
emailemails[type eq "work"].valueOkta -> App
departmenturn:ietf:params:scim:schemas:extension:enterprise:2.0:User:departmentOkta -> App

Step 4: Implement Error Handling

SCIM specifies standard error response format:

{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
  "detail": "User already exists",
  "status": "409",
  "scimType": "uniqueness"
}

Common error codes: 400 (Bad Request), 401 (Unauthorized), 404 (Not Found), 409 (Conflict), 500 (Internal Server Error).

Step 5: Test with Runscope/Okta SCIM Validator

Okta provides an automated SCIM test suite (via Runscope/BlazeMeter) that validates your SCIM implementation against all required operations:

  1. Import the Okta SCIM 2.0 test suite from the OIN submission portal
  2. Configure the base URL and authentication token
  3. Run the full test suite covering user CRUD, filtering, and pagination
  4. Fix any failing tests before submitting to OIN

Validation Checklist

  • SCIM server accessible over HTTPS with valid TLS certificate
  • Bearer token authentication enforced on all endpoints
  • User creation returns 201 with full user representation
  • User search by userName eq "..." filter works correctly
  • Pagination parameters (startIndex, count) handled properly
  • User deactivation sets active: false (not hard delete)
  • PATCH operations support add, replace, remove ops
  • Group push creates and manages group memberships
  • Okta SCIM validator test suite passes all tests
  • Error responses conform to SCIM error schema

References

Frequently asked questions about SCIM Provisioning with Okta

Similar skills