Skip to main content

Keycloak authentication for FastAPI that helps to secure your API endpoints with RBAC with minimal configurations

Project description

FastAPI Keycloak Auth Version License

Fast API Keycloak

A lightweight library to secure FastAPI APIs using Keycloak, enabling Role-Based Access Control (RBAC) with minimal configuration.


Features

  • Simple integration with Keycloak for FastAPI applications.
  • Built-in support for Role-Based Access Control (RBAC) using Keycloak roles.
  • Works seamlessly with both realm roles and client roles.
  • Automatically decodes and validates JWT tokens.

Minimum Requirements

  • Python: 3.12 or higher
  • FastAPI: 0.115.6 or higher
  • Keycloak: 5.1.1 or higher

Installation

Install the library using pip:

pip install fastapi-keycloak-auth

Usage Guide

1. Initialize KeycloakAuth

Start by initializing the KeycloakAuth instance with your Keycloak server configuration. There are two ways that you can use to initialize the KeycloakAuth instance:

  1. Providing keycloak configurations as arguments in the initializer

    from keycloak_auth.keycloak_auth import KeycloakAuth
    
    auth = KeycloakAuth(
    server_url=KEYCLOAK_URL,
    client_id=KEYCLOAK_CLIENT_ID,
    realm_name=KEYCLOAK_REALM_NAME,
    client_secret_key=KEYCLOAK_CLIENT_SECRET,
    use_resource_access=True
    )
    

    Replace KEYCLOAK_URL, KEYCLOAK_CLIENT_ID, KEYCLOAK_REALM_NAME, and KEYCLOAK_CLIENT_SECRET with your Keycloak instance details.

    • server_url: The URL of your Keycloak server. Ex: http://localhost:8080/auth/
    • client_id: The client ID of your Keycloak client.
    • realm_name: The name of your Keycloak realm.
    • client_secret_key: The client secret of your Keycloak client.
    • use_resource_access: Set to True if you want to use client roles in RBAC instead of realm roles (Default is set to False).
  2. Setting up Keycloak configurations as environmental variables (This method is recommended when this application is running in a containerized environment)

    from keycloak_auth.keycloak_auth import KeycloakAuth
    import os
    
    os.environ['KEYCLOAK_URL'] = KEYCLOAK_URL
    os.environ['KEYCLOAK_CLIENT_ID'] = KEYCLOAK_CLIENT_ID
    os.environ['KEYCLOAK_REALM_NAME'] = KEYCLOAK_REALM_NAME
    os.environ['KEYCLOAK_CLIENT_SECRET'] = KEYCLOAK_CLIENT_SECRET
    
    auth = KeycloakAuth()
    

    Replace KEYCLOAK_URL, KEYCLOAK_CLIENT_ID, KEYCLOAK_REALM_NAME, and KEYCLOAK_CLIENT_SECRET with your Keycloak instance details.

    • KEYCLOAK_URL: The URL of your Keycloak server. Ex: http://localhost:8080/auth/
    • KEYCLOAK_CLIENT_ID: The client ID of your Keycloak client.
    • KEYCLOAK_REALM_NAME: The name of your Keycloak realm.
    • KEYCLOAK_CLIENT_SECRET: The client secret of your Keycloak client.

2. Protect Routes with Roles

Use the RolesAllowed decorator to protect your FastAPI routes based on roles defined in Keycloak. You can pass a list of roles that are allowed to access the route.

Important Note: make sure to add authorization: str | None = Header(default=None) as a parameter in the route function to receive the JWT token. Otherwise, the library will not be able to decode and validate the token.

from fastapi import FastAPI, Header
from keycloak_auth.keycloak_auth import KeycloakAuth

app = FastAPI()

auth: KeycloakAuth = KeycloakAuth(
    server_url=KEYCLOAK_URL,
    client_id=KEYCLOAK_CLIENT_ID,
    realm_name=KEYCLOAK_REALM_NAME,
    client_secret_key=KEYCLOAK_CLIENT_SECRET,
    use_resource_access=True
)


@app.get('/admin')
@auth.RolesAllowed(['admin'])
async def admin_route(authorization: str | None = Header(default=None)):
    return {'message': 'Hello Admin'}


@app.get('/user')
@auth.RolesAllowed(['admin', 'user'])
async def user_route(authorization: str | None = Header(default=None)):
    return {'message': 'Hello User'}

See Full Code Example


3. Additional Features

  1. You can also use the KeycloakAuth instance to decode and validate JWT tokens manually.

    from keycloak_auth.keycloak_auth import KeycloakAuth
    
    auth = KeycloakAuth()
    
    token = auth.current_token
    
  2. You can use the KeycloakAuth instance to get the current user's profile.

    from keycloak_auth.keycloak_auth import KeycloakAuth
    
    auth = KeycloakAuth()
    
    user = auth.get_user_info()
    

4. Custom Error Handling

The library automatically raises HTTPException for errors such as:

  • 401 Unauthorized: When the token is missing or expired.
  • 403 Forbidden: When the user does not have sufficient permissions.
  • For advanced scenarios, you can implement additional error handling logic in your application.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_keycloak_auth-1.0.1.tar.gz (5.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastapi_keycloak_auth-1.0.1-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_keycloak_auth-1.0.1.tar.gz.

File metadata

  • Download URL: fastapi_keycloak_auth-1.0.1.tar.gz
  • Upload date:
  • Size: 5.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.7

File hashes

Hashes for fastapi_keycloak_auth-1.0.1.tar.gz
Algorithm Hash digest
SHA256 93ec27393737a03bdc039cf29d6da511641721b4525682f56ffcebefbd09114d
MD5 280e6a37fac66978ca58e1c7eea8e12c
BLAKE2b-256 98a9573b4025c24635f0d49f133ad0d514a02f1b037b2a24f440ccb361e6873d

See more details on using hashes here.

File details

Details for the file fastapi_keycloak_auth-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_keycloak_auth-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6483d7c3b8f8d28c7644f17a40c590c0ca40f27efdcaec0e781f25aba84e5ceb
MD5 c7f2d05291912999438d05a6b352b81d
BLAKE2b-256 73135444f0dc9d4606398c3758a7437d3fd8f63a58573a215495835cbafb7a8b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page