Как создать декоратор 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 пропускает уже существующие таблицы при создании, но в моем контексте мне нужно игнорировать таблицу, которой нет в базе данных.