opengater-globalauth-client
Python client library for GlobalAuth authentication service.
Features
- 🔐 HTTP client for token validation and referral operations
- 🐰 RabbitMQ integration for events and commands
- ⚡ FastAPI middleware and dependencies
- 💾 Built-in caching for introspect results
- 🔄 Async-first design
Installation
pip install opengater-globalauth-client
Or with uv:
uv add opengater-globalauth-client
Quick Start
HTTP Client
import os
from opengater_globalauth_client import GlobalAuthClient
client = GlobalAuthClient(
base_url="https://auth.example.com",
service_slug="opengater",
internal_api_key=os.environ.get("GLOBALAUTH_INTERNAL_API_KEY"), # since 0.4.0
cache_ttl=300 # Cache introspect results for 5 minutes
)
# Validate token
user = await client.introspect(token)
print(f"User: {user.id}, verified: {user.verified}")
# Decode referral code
ref_info = await client.decode_referral("ref_xxx")
if ref_info.type == "referral":
print(f"Invited by: {ref_info.inviter_id}")
# Get referral link for user
link = await client.get_referral_link(user_token)
print(f"Share this link: {link.link}")
# Get referral stats
stats = await client.get_referral_stats(user_token)
print(f"Total invited: {stats.total_invited}")
# Auth method bonuses (inter-service, needs internal_api_key; since 0.5.1)
weights = await client.get_auth_method_weights() # list[AuthMethodWeight]
profile = await client.get_auth_profile(user_id) # AuthProfile
print(profile.registration_auth_type, profile.linked_auth_types)
RabbitMQ Integration
from faststream.rabbit import RabbitBroker
from opengater_globalauth_client.broker import (
GlobalAuthConsumer,
GlobalAuthPublisher,
UserCreatedEvent,
CreateUserCommand,
)
# Use your existing broker
broker = RabbitBroker(settings.rabbitmq_url)
# Consumer for events
consumer = GlobalAuthConsumer(broker, "globalauth.opengater")
@consumer.on_user_created
async def handle_user_created(event: UserCreatedEvent):
print(f"New user: {event.user_id}")
if event.invited_by_id:
# Award referral bonus
await award_bonus(event.invited_by_id)
@consumer.on_auth_method_linked
async def handle_linked(event):
print(f"User {event.user_id} linked {event.auth_type}")
# Publisher for commands (service_slug is required)
publisher = GlobalAuthPublisher(broker=broker, service_slug="opengater")
# Create user from Telegram bot
cmd = CreateUserCommand(
auth_type="telegram",
identifier="123456789",
language="ru",
extra_data={"username": "john", "first_name": "John"},
invited_by_id="uuid-of-inviter",
)
await publisher.create_user(cmd)
FastAPI Integration
With Middleware (Recommended)
from fastapi import FastAPI, Depends, Request
from opengater_globalauth_client import GlobalAuthClient
from opengater_globalauth_client.fastapi import AuthMiddleware, get_current_user
app = FastAPI()
client = GlobalAuthClient(
base_url="https://auth.example.com",
service_slug="opengater"
)
# Add middleware for automatic token validation
app.add_middleware(
AuthMiddleware,
client=client,
exclude_paths=["/health", "/public/*"] # Optional
)
@app.get("/me")
async def me(user = Depends(get_current_user())):
return {
"id": user.id,
"verified": user.verified,
"trust_level": user.trust.level
}
@app.get("/admin-only")
async def admin_only(user = Depends(require_admin())):
return {"message": "Welcome, admin!"}
Without Middleware
from fastapi import FastAPI, Depends
from opengater_globalauth_client import GlobalAuthClient
from opengater_globalauth_client.fastapi import get_current_user
app = FastAPI()
client = GlobalAuthClient(
base_url="https://auth.example.com",
service_slug="opengater"
)
# Pass client to dependency
@app.get("/me")
async def me(user = Depends(get_current_user(client))):
return {"id": user.id}
Available Events
| Event | Description |
|---|---|
user_created |
New user registered |
auth_method_linked |
User linked auth method (email, telegram) |
auth_method_unlinked |
User unlinked auth method |
user_banned |
User was banned |
user_unbanned |
User was unbanned |
User Model
class User:
id: str
verified: bool
is_banned: bool
role: Literal["user", "support", "admin"]
trust: TrustInfo # score, level
auth_methods: list[AuthMethod]
invited_by_id: str | None
registered_via_event: str | None
registered_via_service: str | None
Configuration
| Parameter | Description | Default |
|---|---|---|
base_url |
GlobalAuth service URL | Required |
service_slug |
Your service identifier | Required |
internal_api_key |
Inter-service API key (sent as X-API-Key, since 0.4.0) |
None |
cache_ttl |
Introspect cache TTL (seconds) | 300 |
timeout |
HTTP timeout (seconds) | 30 |
Inter-service API key (since 0.4.0)
client = GlobalAuthClient(
base_url="https://auth.example.com",
service_slug="my-service",
internal_api_key=os.environ.get("GLOBALAUTH_INTERNAL_API_KEY"),
)
internal_api_key (optional) — inter-service API ключ. Когда задан,
отправляется как X-API-Key на /auth/jwt/introspect. Нужен начиная
с GlobalAuth E5 (hard requirement). До E5 — игнорируется сервером.
Error Handling
from opengater_globalauth_client import (
GlobalAuthClient,
TokenExpiredError,
TokenInvalidError,
UserBannedError,
GlobalAuthConnectionError,
)
try:
user = await client.introspect(token)
except TokenExpiredError:
# Token expired, need to refresh
pass
except UserBannedError:
# User is banned
pass
except TokenInvalidError:
# Invalid token
pass
except GlobalAuthConnectionError:
# GlobalAuth service unavailable
pass
Development
This package uses uv for dependency management.
# Install dev dependencies
uv sync --group dev
# Run tests
uv run pytest
# Lint & type-check
uv run ruff check src tests
uv run mypy src
# Build a release
uv build # → dist/opengater_globalauth_client-X.Y.Z-*.whl
Publishing to PyPI (maintainer-only):
uv build
twine upload dist/opengater_globalauth_client-X.Y.Z*
License
MIT
Metadata
Release files for opengater-globalauth-client 0.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| opengater_globalauth_client-0.5.1.tar.gz | 32.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| opengater_globalauth_client-0.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 54.6 kB
Release files / opengater_globalauth_client-0.5.1.tar.gz
| Download URL | opengater_globalauth_client-0.5.1.tar.gz |
|---|---|
| Size | 32.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fb2fc02e557a913135ddc1b1e9e47ce9d41ae57fc9c86f938a33094c7b95a920
|
|
BLAKE2b-256 checksum How to use checksums |
ba5f1d394d2f337a68f096b6577cea0ce02e28c82d7245531bf315cd932064b7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / opengater_globalauth_client-0.5.1-py3-none-any.whl
| Download URL | opengater_globalauth_client-0.5.1-py3-none-any.whl |
|---|---|
| Size | 22.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
69c981bc63ce1493602197c8ba18f7f6303f03bb05f00e4f4621d94f606a6bfa
|
|
BLAKE2b-256 checksum How to use checksums |
40148541e2a7427565b98099347080393e031cb04b7fccb7fb4891daeef03ad0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|