Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
P
perxis-python
Manage
Activity
Members
Labels
Plan
Issues
3
Issue boards
Milestones
Wiki
Custom issue tracker
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
perxis
perxis-python
Commits
f64b9293
Commit
f64b9293
authored
1 month ago
by
Eterevskiy Georgiy
Browse files
Options
Downloads
Plain Diff
Merge branch 'feature/
AUTO-4047
' into 'master'
feat:
AUTO-4047
Add docstrings See merge request
!93
parents
751b4047
31c9b8c4
No related branches found
No related tags found
1 merge request
!93
feat: AUTO-4047 Add docstrings
Pipeline
#78418
passed with stages
Stage:
Stage:
in 48 seconds
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
README.md
+16
-5
16 additions, 5 deletions
README.md
perxis/auth.py
+92
-4
92 additions, 4 deletions
perxis/auth.py
with
108 additions
and
9 deletions
README.md
+
16
−
5
View file @
f64b9293
...
@@ -62,8 +62,8 @@ def metadata_call_credentials(metadata_plugin, name=None):
...
@@ -62,8 +62,8 @@ def metadata_call_credentials(metadata_plugin, name=None):
Объект CallCredentials можно передать непосредственно в RPC, например:
Объект CallCredentials можно передать непосредственно в RPC, например:
```
python
```
python
call_credentials
=
grpc
.
metadata_call_credentials
(
my_foo_plugin
)
>>>
call_credentials
=
grpc
.
metadata_call_credentials
(
my_foo_plugin
)
stub
.
FooRpc
(
request
,
credentials
=
call_credentials
)
>>>
stub
.
FooRpc
(
request
,
credentials
=
call_credentials
)
```
```
### Пример авторизации и аутентификации OAuth2
### Пример авторизации и аутентификации OAuth2
...
@@ -89,11 +89,22 @@ class ExtendedClient(Client):
...
@@ -89,11 +89,22 @@ class ExtendedClient(Client):
def
prepare_request_body
(
self
,
body
=
''
,
scope
=
None
,
include_client_id
=
False
,
**
kwargs
):
def
prepare_request_body
(
self
,
body
=
''
,
scope
=
None
,
include_client_id
=
False
,
**
kwargs
):
kwargs
[
'
client_id
'
]
=
self
.
client_id
kwargs
[
'
client_id
'
]
=
self
.
client_id
kwargs
[
'
include_client_id
'
]
=
include_client_id
kwargs
[
'
include_client_id
'
]
=
include_client_id
return
prepare_token_request
(
self
.
grant_type
,
body
=
body
,
username
=
self
.
username
,
return
prepare_token_request
(
password
=
self
.
password
,
scope
=
scope
,
**
kwargs
)
self
.
grant_type
,
body
=
body
,
username
=
self
.
username
,
password
=
self
.
password
,
scope
=
scope
,
**
kwargs
)
oauth2_plugin
=
OAuth2Plugin
(
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
'
,
client_secret
=
'
client_secret
'
,
token_url
=
'
https://example.com/oauth/token
'
,
token_url
=
'
https://example.com/oauth/token
'
,
audience
=
'
audience
'
audience
=
'
audience
'
...
...
This diff is collapsed.
Click to expand it.
perxis/auth.py
+
92
−
4
View file @
f64b9293
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
oauthlib.oauth2
import
Client
,
OAuth2Token
from
requests_oauthlib
import
OAuth2Session
from
requests_oauthlib
import
OAuth2Session
class
OAuth2Plugin
(
grpc
.
AuthMetadataPlugin
):
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
_token
=
None
def
__init__
(
def
__init__
(
...
@@ -18,12 +52,25 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin):
...
@@ -18,12 +52,25 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin):
signature_header_key
:
str
=
"
authorization
"
,
signature_header_key
:
str
=
"
authorization
"
,
token_type
:
str
=
"
Bearer
"
,
token_type
:
str
=
"
Bearer
"
,
)
->
None
:
)
->
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
.
_client_secret
=
client_secret
self
.
_token_url
=
token_url
self
.
_token_url
=
token_url
self
.
_audience
=
audience
self
.
_audience
=
audience
self
.
_signature_header_key
=
signature_header_key
self
.
_signature_header_key
=
signature_header_key
self
.
_token_type
=
token_type
self
.
_token_type
=
token_type
self
.
oauth2
=
OAuth2Session
(
client
=
client
)
self
.
oauth2
=
OAuth2Session
(
client
=
client
)
def
__call__
(
def
__call__
(
...
@@ -31,6 +78,12 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin):
...
@@ -31,6 +78,12 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin):
context
:
grpc
.
AuthMetadataContext
,
context
:
grpc
.
AuthMetadataContext
,
callback
:
grpc
.
AuthMetadataPluginCallback
,
callback
:
grpc
.
AuthMetadataPluginCallback
,
)
->
None
:
)
->
None
:
"""
Добавляет токен в метаданные gRPC-запроса.
Args:
context (grpc.AuthMetadataContext): Контекст аутентификации gRPC.
callback (grpc.AuthMetadataPluginCallback): Callback для передачи метаданных.
"""
callback
(
callback
(
metadata
=
(
metadata
=
(
(
(
...
@@ -43,6 +96,12 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin):
...
@@ -43,6 +96,12 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin):
@property
@property
def
token
(
self
)
->
OAuth2Token
:
def
token
(
self
)
->
OAuth2Token
:
"""
Получает текущий OAuth2-токен, обновляя его при необходимости.
Returns:
OAuth2Token: Актуальный токен.
"""
def
fetch_token
()
->
OAuth2Token
:
def
fetch_token
()
->
OAuth2Token
:
return
self
.
oauth2
.
fetch_token
(
return
self
.
oauth2
.
fetch_token
(
token_url
=
self
.
_token_url
,
token_url
=
self
.
_token_url
,
...
@@ -65,11 +124,26 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin):
...
@@ -65,11 +124,26 @@ class OAuth2Plugin(grpc.AuthMetadataPlugin):
self
.
_token
=
refresh_token
()
self
.
_token
=
refresh_token
()
else
:
else
:
self
.
_token
=
fetch_token
()
self
.
_token
=
fetch_token
()
return
self
.
_token
return
self
.
_token
class
APIKeyPlugin
(
grpc
.
AuthMetadataPlugin
):
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
_token
=
None
def
__init__
(
def
__init__
(
...
@@ -78,6 +152,14 @@ class APIKeyPlugin(grpc.AuthMetadataPlugin):
...
@@ -78,6 +152,14 @@ class APIKeyPlugin(grpc.AuthMetadataPlugin):
signature_header_key
:
str
=
"
authorization
"
,
signature_header_key
:
str
=
"
authorization
"
,
token_type
:
str
=
"
API-Key
"
,
token_type
:
str
=
"
API-Key
"
,
)
->
None
:
)
->
None
:
"""
Инициализирует объект аутентификации API-ключа для gRPC.
Args:
token (str): API-ключ, используемый для аутентификации.
signature_header_key (str, optional): Заголовок, в который будет добавляться API-ключ.
По умолчанию
"
authorization
"
.
token_type (str, optional): Тип токена. По умолчанию
"
API-Key
"
.
"""
self
.
_token
=
token
self
.
_token
=
token
self
.
_signature_header_key
=
signature_header_key
self
.
_signature_header_key
=
signature_header_key
self
.
_token_type
=
token_type
self
.
_token_type
=
token_type
...
@@ -87,6 +169,12 @@ class APIKeyPlugin(grpc.AuthMetadataPlugin):
...
@@ -87,6 +169,12 @@ class APIKeyPlugin(grpc.AuthMetadataPlugin):
context
:
grpc
.
AuthMetadataContext
,
context
:
grpc
.
AuthMetadataContext
,
callback
:
grpc
.
AuthMetadataPluginCallback
,
callback
:
grpc
.
AuthMetadataPluginCallback
,
)
->
None
:
)
->
None
:
"""
Добавляет API-ключ в метаданные gRPC-запроса.
Args:
context (grpc.AuthMetadataContext): Контекст аутентификации gRPC.
callback (grpc.AuthMetadataPluginCallback): Callback для передачи метаданных.
"""
callback
(
callback
(
metadata
=
(
metadata
=
(
(
self
.
_signature_header_key
,
f
"
{
self
.
_token_type
}
{
self
.
_token
}
"
),
(
self
.
_signature_header_key
,
f
"
{
self
.
_token_type
}
{
self
.
_token
}
"
),
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment