Skip to main content

Python клиент для взаимодействия с MS Auth Service API

Project description

SSO Zenna Client

Python клиент для взаимодействия с MS Auth Service API. Предоставляет удобные классы для работы с OAuth 2.0 Authorization Code Flow с PKCE (для пользователей) и Client Credentials Grant (для микросервисов).

Установка

pip install -e .

Или если пакет опубликован:

pip install sso_zenna

Быстрый старт

Для пользователей (UserClient)

import asyncio
from sso_client import UserClient

async def main():
    # Создаем клиент
    client = UserClient(
        base_url="http://localhost:8000",
        client_id="your_client_id",
        redirect_uri="http://localhost:3000/callback"
    )
    
    # Полный цикл авторизации
    token_response = await client.full_auth_flow(
        login="user@example.com",
        password="password123",
        scope="sso.admin.read sso.admin.create"
    )
    
    print(f"Access token: {token_response.access_token}")
    print(f"Refresh token: {token_response.refresh_token}")
    
    # Получаем информацию о пользователе
    user_info = await client.get_current_user()
    print(f"Пользователь: {user_info.name} {user_info.surname}")
    
    # Обновляем токен
    new_token = await client.refresh_access_token()
    print(f"Новый access token: {new_token.access_token}")
    
    await client.close()

asyncio.run(main())

Пошаговая авторизация

import asyncio
from sso_client import UserClient

async def main():
    client = UserClient(
        base_url="http://localhost:8000",
        client_id="your_client_id"
    )
    
    # 1. Получаем PKCE параметры
    pkce_params = await client.get_pkce_params()
    
    # 2. Инициируем авторизацию
    auth_response = await client.authorize(
        scope="sso.admin.read",
        pkce_params=pkce_params
    )
    
    # 3. Выполняем логин
    login_response = await client.login(
        login="user@example.com",
        password="password123",
        session_id=auth_response.session_id
    )
    
    # 4. Обмениваем код на токены
    token_response = await client.exchange_code_for_tokens(
        authorization_code=login_response.authorization_code,
        pkce_params=pkce_params
    )
    
    print(f"Токены получены: {token_response.access_token}")
    
    await client.close()

asyncio.run(main())

Для микросервисов (ServiceClient)

import asyncio
from sso_client import ServiceClient

async def main():
    # Создаем клиент для микросервиса
    client = ServiceClient(
        base_url="http://localhost:8000",
        client_id="service_id",
        client_secret="service_secret"
    )
    
    # Получаем access token
    token_response = await client.get_access_token(
        scope="system.client.read system.client.edit"
    )
    
    print(f"Access token: {token_response.access_token}")
    
    # Выполняем запросы с авторизацией
    user_info = await client.get_current_user()
    
    # Или используем request_with_auth для любых endpoints
    data = await client.request_with_auth(
        method="GET",
        endpoint="admin/users",
        params={"skip": 0, "limit": 10}
    )
    
    await client.close()

asyncio.run(main())

Использование с async context manager

import asyncio
from sso_client import UserClient

async def main():
    async with UserClient(
        base_url="http://localhost:8000",
        client_id="your_client_id"
    ) as client:
        token_response = await client.full_auth_flow(
            login="user@example.com",
            password="password123"
        )
        # Сессия автоматически закроется при выходе

asyncio.run(main())

Пример для получения информации по пользвателю для подстановки в Depends

from fastapi import FastAPI, Header, HTTPException
from typing import Optional

app = FastAPI()

sso_client = ServiceClient(
    base_url="http://localhost:8000",
    client_id="your_service_id",
    client_secret="your_service_secret"
)

async def get_current_user(authorization: Optional[str] = Header(None)):
    """
    Dependency для получения текущего пользователя из токена
    """
    if not authorization:
        raise HTTPException(status_code=401, detail="Токен не предоставлен")
    
    # Извлекаем токен из заголовка "Bearer <token>"
    try:
        token = authorization.split(" ")[1]
    except IndexError:
        raise HTTPException(status_code=401, detail="Неверный формат токена")
    
    try:
        user_info = await sso_client.get_current_user(access_token=token)
        return user_info
    except AuthenticationError:
        raise HTTPException(status_code=401, detail="Невалидный токен")
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Ошибка при проверке токена: {e}")

@app.get("/protected")
async def protected_endpoint(current_user = Depends(get_current_user)):
    """
    Защищенный endpoint, который требует валидный токен пользователя
    """
    return {
        "message": f"Привет, {current_user.name} {current_user.surname}!",
        "user_id": current_user.id,
        "email": current_user.email,
        "scopes": current_user.scopes
    }

API Reference

UserClient

Класс для пользовательского взаимодействия с OAuth 2.0 Authorization Code Flow с PKCE.

Методы

  • get_pkce_params() - Получить PKCE параметры от сервера
  • authorize(scope, redirect_uri, pkce_params) - Инициировать OAuth 2.0 flow
  • login(login, password, session_id) - Выполнить аутентификацию
  • exchange_code_for_tokens(authorization_code, redirect_uri, pkce_params) - Обменять код на токены
  • refresh_access_token(refresh_token) - Обновить access token
  • get_current_user(access_token) - Получить информацию о пользователе
  • logout(refresh_token) - Выйти из системы
  • get_available_services() - Получить список доступных микросервисов
  • full_auth_flow(login, password, scope, redirect_uri) - Выполнить полный цикл авторизации

ServiceClient

Класс для микросервисного взаимодействия с Client Credentials Grant.

Методы

  • get_access_token(scope) - Получить access token
  • get_current_user(access_token) - Получить информацию о текущем пользователе/сервисе
  • request_with_auth(method, endpoint, json_data, params, auto_refresh) - Выполнить запрос с авторизацией

Исключения

  • SSOClientError - Базовое исключение
  • AuthenticationError - Ошибка аутентификации (401)
  • AuthorizationError - Ошибка авторизации (403)
  • APIError - Ошибка API (4xx, 5xx)
  • TokenError - Ошибка работы с токенами

Лицензия

MIT

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

sso_zenna-0.1.3.tar.gz (19.0 kB view details)

Uploaded Source

Built Distribution

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

sso_zenna-0.1.3-py3-none-any.whl (25.5 kB view details)

Uploaded Python 3

File details

Details for the file sso_zenna-0.1.3.tar.gz.

File metadata

  • Download URL: sso_zenna-0.1.3.tar.gz
  • Upload date:
  • Size: 19.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.1 CPython/3.13.11 Windows/10

File hashes

Hashes for sso_zenna-0.1.3.tar.gz
Algorithm Hash digest
SHA256 96df2ccfe6beb3169af8263223f61d69fcc916fa9334147d79ed185aaf096bbd
MD5 3b66ff07fdbffef69e70f3bdd398a71b
BLAKE2b-256 8faded910ad538b4a6b20ca6d12efc33b90d40ae0b10282321f54ef697e6e1b9

See more details on using hashes here.

File details

Details for the file sso_zenna-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: sso_zenna-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 25.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.1 CPython/3.13.11 Windows/10

File hashes

Hashes for sso_zenna-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 55413bd424c505cd3f27557b38a4b2971f6fadb52ae11e694f464c72490d0619
MD5 36d11206d3ab2030c982a694bc20297b
BLAKE2b-256 8a2907e0bb623448a83338f09b3046e77ed3e26003c63a5c7c2fea11a628c265

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