Skip to content

Фиктивный провайдер аутентификации

Описание

Этот провайдер аутентификации позволяет войти в систему с любым именем пользователя и паролем, а затем выдаёт токен доступа.

После успешной аутентификации имя пользователя сохраняется в базе данных сервера.

Схема взаимодействия

        @startuml
            title Фиктивный провайдер аутентификации 
            participant "Клиент"
            participant "Сервер"

            == POST v1/auth/token ==

            activate "Клиент"
            alt Успешный случай
                "Клиент" -> "Сервер" ++ : логин + пароль
                "Сервер" --> "Сервер" : Пароль полностью игнорируется
                "Сервер" --> "Сервер" : Проверить пользователя во внутренней базе данных сервера
                "Сервер" -> "Сервер" : Создать пользователя, если он не существует 
                "Сервер" -[#green]> "Клиент" -- : Сгенерировать и вернуть access_token

            else Пользователь блокирован
                "Клиент" -> "Сервер" ++ : логин + пароль
                "Сервер" --> "Сервер" : Пароль полностью игнорируется
                "Сервер" --> "Сервер" : Проверить пользователя во внутренней базе данных сервера
                "Сервер" x-[#red]> "Клиент" -- : 401 Не авторизован

            else Пользователь удален
                "Клиент" -> "Сервер" ++ : логин + пароль
                "Сервер" --> "Сервер" : Проверить пользователя во внутренней базе данных сервера
                "Сервер" --> "Сервер" : Check user in internal server database
                "Сервер" x-[#red]> "Клиент" -- : 404 Не найден
            end

            == GET v1/users/me ==

            alt Успешный случай
                "Клиент" -> "Сервер" ++ : токен доступа
                "Сервер" --> "Сервер" : Валидация токена
                "Сервер" --> "Сервер" : Проверить пользователя во внутренней базе данных сервера
                "Сервер" -> "Сервер" : Предоставить данные
                "Сервер" -[#green]> "Клиент" -- : Вернуть данные

            else Срок действия токена истек
                "Клиент" -> "Сервер" ++ : токен доступа
                "Сервер" --> "Сервер" : Валидация токена
                "Сервер" x-[#red]> "Клиент" -- : 401 не авторизован

            else Пользователь блокирован
                "Клиент" -> "Сервер" ++ : токен доступа
                "Сервер" --> "Сервер" : Валидация токена
                "Сервер" --> "Сервер" : Проверить пользователя во внутренней базе данных сервера
                "Сервер" x-[#red]> "Клиент" -- : 401 не авторизован

            else Пользователь удален
                "Клиент" -> "Сервер" ++ : токен доступа
                "Сервер" --> "Сервер" : Валидация токена
                "Сервер" --> "Сервер" : Проверить пользователя во внутренней базе данных сервера
                "Сервер" x-[#red]> "Клиент" -- : 404 не найден
            end

            deactivate "Клиент"
        @enduml
sequenceDiagram
participant "Клиент"
participant "Сервер"
activate "Клиент"
alt Успешный случай
"Клиент" ->> "Сервер" : логин + пароль
"Сервер" ->> "Сервер" : Пароль полностью игнорируется
"Сервер" ->> "Сервер" : Проверить пользователя во внутренней базе данных сервера
"Сервер" ->> "Сервер" : Создать пользователя, если он не существует
else
"Клиент" ->> "Сервер" : логин + пароль
"Сервер" ->> "Сервер" : Пароль полностью игнорируется
"Сервер" ->> "Сервер" : Проверить пользователя во внутренней базе данных сервера
else
"Клиент" ->> "Сервер"  : логин + пароль
"Сервер" ->> "Сервер" : Проверить пользователя во внутренней базе данных сервера
"Сервер" ->> "Сервер" : Check user in internal server database
end
alt Успешный случай
"Клиент" ->> "Сервер" : токен доступа
"Сервер" ->> "Сервер" : Валидация токена
"Сервер" ->> "Сервер" : Проверить пользователя во внутренней базе данных сервера
"Сервер" ->> "Сервер" : Предоставить данные
else
"Клиент" ->> "Сервер" : токен доступа
"Сервер" ->> "Сервер" : Валидация токена
else
"Клиент" ->> "Сервер" : токен доступа
"Сервер" ->> "Сервер" : Валидация токена
"Сервер" ->> "Сервер" : Проверить пользователя во внутренней базе данных сервера
else
"Клиент" ->> "Сервер" : токен доступа
"Сервер" ->> "Сервер" : Валидация токена
"Сервер" ->> "Сервер" : Проверить пользователя во внутренней базе данных сервера
end
deactivate "Клиент"

Конфигурация

Bases: BaseModel

Settings for DummyAuthProvider.

Examples

.. code-block:: yaml :caption: config.yml

auth:
    provider: syncmaster.server.providers.auth.dummy_provider.DummyAuthProvider
    access_key:
        secret_key: jwt_secret
Source code in syncmaster/server/settings/auth/dummy.py
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class DummyAuthProviderSettings(BaseModel):
    """Settings for DummyAuthProvider.

    Examples
    --------

    .. code-block:: yaml
        :caption: config.yml

        auth:
            provider: syncmaster.server.providers.auth.dummy_provider.DummyAuthProvider
            access_key:
                secret_key: jwt_secret
    """

    access_token: JWTSettings = Field(description="Access-token related settings")

Bases: BaseModel

Settings related to JWT tokens.

Examples

.. code-block:: yaml :caption: config.yml

auth:
    access_key:
        secret_key: jwt_secret
        expire_seconds: 3600  # 1 hour
Source code in syncmaster/server/settings/auth/jwt.py
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class JWTSettings(BaseModel):
    """Settings related to JWT tokens.

    Examples
    --------

    .. code-block:: yaml
        :caption: config.yml

        auth:
            access_key:
                secret_key: jwt_secret
                expire_seconds: 3600  # 1 hour
    """

    secret_key: SecretStr = Field(
        description=textwrap.dedent(
            """
            Secret key for signing JWT tokens.

            Can be any string. It is recommended to generate random value for every application instance, e.g.:

            .. code:: shell

                pwgen 32 1
            """,
        ),
    )
    security_algorithm: str = Field(
        default="HS256",
        description=textwrap.dedent(
            """
            Algorithm used for signing JWT tokens.

            See `pyjwt <https://pyjwt.readthedocs.io/en/latest/algorithms.html>`_
            documentation.
            """,
        ),
    )
    expire_seconds: int = Field(
        default=10 * 60 * 60,
        description="Token expiration time, in seconds",
    )