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