diff --git a/README.md b/README.md index 2d70479c018ec52d0879c8511430a3606f1786b3..c31bd84d3d43d0dfaf8a2f1fdb1a5df3b9950da3 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,8 @@ def metadata_call_credentials(metadata_plugin, name=None): Объект CallCredentials РјРѕР¶РЅРѕ передать непосредственно РІ RPC, например: ```python -call_credentials = grpc.metadata_call_credentials(my_foo_plugin) -stub.FooRpc(request, credentials=call_credentials) +>>> call_credentials = grpc.metadata_call_credentials(my_foo_plugin) +>>> stub.FooRpc(request, credentials=call_credentials) ``` ### Пример авторизации Рё аутентификации OAuth2 @@ -89,11 +89,22 @@ class ExtendedClient(Client): def prepare_request_body(self, body='', scope=None, include_client_id=False, **kwargs): kwargs['client_id'] = self.client_id kwargs['include_client_id'] = include_client_id - return prepare_token_request(self.grant_type, body=body, username=self.username, - password=self.password, scope=scope, **kwargs) + return prepare_token_request( + self.grant_type, + body=body, + username=self.username, + password=self.password, + scope=scope, + **kwargs + ) oauth2_plugin = OAuth2Plugin( - client=ExtendedClient(client_id='client_id', grant_type='password', username='user', password='pass'), + client=ExtendedClient( + client_id='client_id', + grant_type='password', + username='user', + password='pass' + ), client_secret='client_secret', token_url='https://example.com/oauth/token', audience='audience' diff --git a/perxis/auth.py b/perxis/auth.py index d2989bab852ce2b4c84d9a062e80c031223f66e2..9d96e00c9a3f489890213210cea7acd90b8ab16f 100644 --- a/perxis/auth.py +++ b/perxis/auth.py @@ -1,12 +1,46 @@ -import time +""" +Модуль для аутентификации РІ gRPC СЃ использованием OAuth2 Рё API-ключей. -import grpc +Ртот модуль предоставляет РґРІР° класса для аутентификации: + +- [`OAuth2Plugin`](#OAuth2Plugin): Аутентификация СЃ помощью OAuth2. +- [`APIKeyPlugin`](#APIKeyPlugin): Аутентификация СЃ использованием API-ключа. + +Данный РєРѕРґ РјРѕР¶РЅРѕ использовать для настройки gRPC-клиента СЃ нужным типом аутентификации. +## Пример использования: +.. include:: ../README.md + :start-line: 22 + :end-line: 108 +--- +""" + +import time +import grpc from oauthlib.oauth2 import Client, OAuth2Token from requests_oauthlib import OAuth2Session class OAuth2Plugin(grpc.AuthMetadataPlugin): + """Спецификация аутентификации для gRPC СЃ использованием OAuth2. + + Ртот класс управляет получением Рё обновлением токена OAuth2 для аутентификации + gRPC-запросов. + + Attributes: + _token (str | None): Токен. РџРѕ умолчанию None. + oauth2 (OAuth2Session): Сессия OAuth2 для управления токенами. + Args: + client (Client): OAuth2 клиент. + client_secret (str): Секрет клиента. + token_url (str): URL для получения токена. + audience (str): Получатель (аудитория) токена, указывающая, для какого + сервиса РѕРЅ предназначен. + signature_header_key (str, optional): Заголовок для РїРѕРґРїРёСЃРё запроса. + РџРѕ умолчанию "authorization". + token_type (str, optional): РўРёРї токена. РџРѕ умолчанию "Bearer". + """ + _token = None def __init__( @@ -18,12 +52,25 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin): signature_header_key: str = "authorization", token_type: str = "Bearer", ) -> None: + """Рнициализирует объект аутентификации OAuth2 для gRPC. + + Ртот метод устанавливает основные параметры OAuth2-клиента, необходимые + для получения Рё обновления токена. + + Args: + client (Client): OAuth2 клиент для аутентификации. + client_secret (str): Секретный ключ клиента. + token_url (str): URL-адрес сервера авторизации для получения токена. + audience (str): Аудитория токена, указывающая целевой сервис. + signature_header_key (str, optional): Заголовок, РІ который будет добавляться токен. + РџРѕ умолчанию "authorization". + token_type (str, optional): РўРёРї токена. РџРѕ умолчанию "Bearer". + """ self._client_secret = client_secret self._token_url = token_url self._audience = audience self._signature_header_key = signature_header_key self._token_type = token_type - self.oauth2 = OAuth2Session(client=client) def __call__( @@ -31,6 +78,12 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin): context: grpc.AuthMetadataContext, callback: grpc.AuthMetadataPluginCallback, ) -> None: + """Добавляет токен РІ метаданные gRPC-запроса. + + Args: + context (grpc.AuthMetadataContext): Контекст аутентификации gRPC. + callback (grpc.AuthMetadataPluginCallback): Callback для передачи метаданных. + """ callback( metadata=( ( @@ -43,6 +96,12 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin): @property def token(self) -> OAuth2Token: + """Получает текущий OAuth2-токен, обновляя его РїСЂРё необходимости. + + Returns: + OAuth2Token: Актуальный токен. + """ + def fetch_token() -> OAuth2Token: return self.oauth2.fetch_token( token_url=self._token_url, @@ -65,11 +124,26 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin): self._token = refresh_token() else: self._token = fetch_token() - return self._token class APIKeyPlugin(grpc.AuthMetadataPlugin): + """Спецификация аутентификации для gRPC СЃ использованием API-ключа. + + Ртот класс добавляет API-ключ РІ заголовок запроса для аутентификации + gRPC-запросов. + + Attributes: + _token (str): API-ключ. + _signature_header_key (str): Заголовок, РІ который вставляется ключ. + _token_type (str): РўРёРї токена (например, "API-Key"). + Args: + token (str): API-ключ. + signature_header_key (str, optional): Заголовок для РїРѕРґРїРёСЃРё запроса. + РџРѕ умолчанию "authorization". + token_type (str, optional): РўРёРї токена. РџРѕ умолчанию "API-Key". + """ + _token = None def __init__( @@ -78,6 +152,14 @@ class APIKeyPlugin(grpc.AuthMetadataPlugin): signature_header_key: str = "authorization", token_type: str = "API-Key", ) -> None: + """Рнициализирует объект аутентификации API-ключа для gRPC. + + Args: + token (str): API-ключ, используемый для аутентификации. + signature_header_key (str, optional): Заголовок, РІ который будет добавляться API-ключ. + РџРѕ умолчанию "authorization". + token_type (str, optional): РўРёРї токена. РџРѕ умолчанию "API-Key". + """ self._token = token self._signature_header_key = signature_header_key self._token_type = token_type @@ -87,6 +169,12 @@ class APIKeyPlugin(grpc.AuthMetadataPlugin): context: grpc.AuthMetadataContext, callback: grpc.AuthMetadataPluginCallback, ) -> None: + """Добавляет API-ключ РІ метаданные gRPC-запроса. + + Args: + context (grpc.AuthMetadataContext): Контекст аутентификации gRPC. + callback (grpc.AuthMetadataPluginCallback): Callback для передачи метаданных. + """ callback( metadata=( (self._signature_header_key, f"{self._token_type} {self._token}"),