我有两个应用程序,第一个是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跟踪它们,并在第二个应用程序的数据库上生成其结构,但是当检查了令牌时,即使我告知我要连接到哪个数据库__bind_key__ = 'oauth2'
,也可以使用OAuth 2.0表检查令牌,有关更多详细信息,请参见此thread。
如何在不通知令牌模型的情况下创建require_auth
装饰器以在其他应用程序中使用?
Obs:我试图从OAuth 2.0数据库db.Model.tables
获取令牌模型的Meta Data,但收到一个空的不可变字典
糟糕²:我使用Flask Migrate应用程序生成了迁移
糟糕³:我读过table documentation和protect resource至少没有在数据库/代码中重复表,但是我找不到任何可以帮助我的东西
Obs⁴:我现在正在考虑尝试使用Alembic进行手动设置,或者创建两个连接并通过db.create_all
生成表
额外:SQLalchemy orm skip already-existing tables on create,但在我的上下文中,我需要忽略数据库中不存在的表。