Как создать декоратор require_auth без информирования модели токена - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть два приложения, первое - сервер 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', для получения более подробной информации см. thread .

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

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

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

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

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

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

...