https://github.com/bakdata/python-keycloak-oauth
Keycloak authentication for Python projects with optional integrations for FastAPI & Starlette-Admin
https://github.com/bakdata/python-keycloak-oauth
fastapi keycloak starlette-admin
Last synced: 12 months ago
JSON representation
Keycloak authentication for Python projects with optional integrations for FastAPI & Starlette-Admin
- Host: GitHub
- URL: https://github.com/bakdata/python-keycloak-oauth
- Owner: bakdata
- License: mit
- Created: 2024-02-19T13:05:02.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-03-18T11:23:40.000Z (about 2 years ago)
- Last Synced: 2025-04-10T08:11:44.743Z (12 months ago)
- Topics: fastapi, keycloak, starlette-admin
- Language: Python
- Homepage:
- Size: 70.3 KB
- Stars: 2
- Watchers: 5
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# python-keycloak-oauth
Keycloak OAuth client for Python projects with optional integrations for [FastAPI](https://github.com/tiangolo/fastapi) & [Starlette-Admin](https://github.com/jowilf/starlette-admin).
## Getting started
### FastAPI
```sh
pip install keycloak-oauth[fastapi]
```
```python
from typing import Annotated
from fastapi import FastAPI, Request, Depends
from starlette.middleware.sessions import SessionMiddleware
from backend.settings import settings, BASE_URL, SECRET_KEY # secrets
from keycloak_oauth import KeycloakOAuth2
keycloak = KeycloakOAuth2(
client_id=settings.keycloak.client_id,
client_secret=settings.keycloak.client_secret,
server_metadata_url=str(settings.keycloak.server_metadata_url),
client_kwargs=settings.keycloak.client_kwargs,
base_url=BASE_URL,
)
# create router and register API endpoints
keycloak.setup_fastapi_routes()
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key=SECRET_KEY)
app.include_router(keycloak.router, prefix="/auth")
@app.get("/")
def index(
request: Request, user: Annotated[User, Depends(KeycloakOAuth2.get_user)]
):
"""Protected endpoint, will return 401 Unauthorized if not signed in."""
return f"Hello {user.name}"
```
We now expose the API endpoints for Keycloak:
- `/auth/login`: redirect to Keycloak login page
- `/auth/callback`: authorize user with Keycloak access token
- `/auth/logout`: deauthorize user and redirect to the logout page
### Starlette-Admin
```sh
pip install keycloak-oauth[starlette-admin]
```
```python
from starlette.middleware.sessions import SessionMiddleware
from starlette_admin.contrib.sqla import Admin
from backend.settings import settings, BASE_URL, SECRET_KEY # secrets
from keycloak_oauth import KeycloakOAuth2
from keycloak.starlette_admin import KeycloakAuthProvider
keycloak = KeycloakOAuth2(
client_id=settings.keycloak.client_id,
client_secret=settings.keycloak.client_secret,
server_metadata_url=str(settings.keycloak.server_metadata_url),
client_kwargs=settings.keycloak.client_kwargs,
base_url=BASE_URL,
)
admin = Admin(
# engine,
title=...,
base_url=BASE_URL,
auth_provider=KeycloakAuthProvider(keycloak),
middlewares=[Middleware(SessionMiddleware, secret_key=SECRET_KEY)],
)
admin.add_view(...)
```
## Development
If you want to contribute to this project, you can simply clone the repository and run `poetry install --all-extras`.
Please also run `pre-commit install` for linting and enforcing a consistent code style.
## Contributing
We are happy if you want to contribute to this project. If you find any bugs or have suggestions for improvements, please open an issue. We are also happy to accept your PRs. Just open an issue beforehand and let us know what you want to do and why.
## License
This project is licensed under the MIT license. Have a look at the [LICENSE](LICENSE) for more details.