Как создать декоратор require_auth без информирования модели токена

У меня есть два приложения: первое - это сервер OAuth 2.0, а второе - изолированное приложение, присутствующее в другом хранилище.

Второе приложение подключается к базе данных OAuth 2.0, чтобы проверить, является ли токен действительным, это делается декоратором @require_auth, для создания которого требуется модель токена, которая, в свою очередь, требует пользовательской модели:

from authlib.flask.oauth2.sqla import create_bearer_token_validator

from authlib.flask.oauth2 import ResourceProtector

from db import db


class User(db.Model):
     __bind_key__ = 'oauth'  # Database name

    __tablename__ = 'oauth2_user'  # Table name

    # ...


class Token(db.Model):
    __bind_key__ = 'oauth2'  # Database name

    __tablename__ = 'oauth2_token'  # Table name

    id = db.Column(db.BigInteger, primary_key=True)

    user_id = db.Column(sqlalchemy_utils.UUIDType(binary=True), db.ForeignKey('oauth2_user.id', ondelete='SET NULL'))

    user = db.relationship('User', cascade=False)


require_oauth = ResourceProtector()

bearer = create_bearer_token_validator(db.session, Token)  # https://github.com/lepture/authlib/blob/8234da2896c724e3c7c021984175d99f48ef5a70/authlib/flask/oauth2/sqla.py#L306

require_oauth.register_token_validator(bearer())

Поскольку архитектура основана на микросервисах, для создания этого декоратора я дублирую код из OAuth 2.0 (модель токена и модель пользователя) во второе приложение, кроме того, потому что на втором мне нужно подключиться к двум базам данных Приложение и таблицы пользователя и токена дублируются во втором приложении, когда я генерирую миграции второго приложения, SQLAlchemy отслеживает их, а также генерирует их структуру в базе данных второго приложения, но при проверке токена в таблицах OAuth 2.0 используются для проверки токена, даже если я сообщаю, к какой базе данных я хочу подключиться __bind_key__ = 'oauth2', для более подробной информации смотрите эту тему.

Как я могу создать require_auth использовать декоратор в другом приложении без указания токена модели?

Obs: я пытался получить метаданные модели токена из базы данных OAuth 2.0 db.Model.tables, но я получаю пустой неизменный дикт

Obs ²: я генерирую миграции с помощью приложения Flask Migrate

Задачи ³: я прочитал документацию к таблице и ресурс защиты, чтобы хотя бы не дублировать таблицы в базе данных / коде, но я не смог найти ничего, что могло бы мне помочь

Obs ⁴: сейчас я рассматриваю попытку установить его вручную с помощью Alembic или создать два соединения и сгенерировать таблицы с помощью db.create_all

Дополнительно: SQLalchemy orm пропускает уже существующие таблицы при создании, но в моем контексте мне нужно игнорировать таблицу, которой нет в базе данных.

0 ответов

Другие вопросы по тегам