如何在不通知令牌模型的情况下创建'require_auth'装饰器

时间:2019-02-01 04:16:09

标签: python-3.x oauth-2.0 authlib

我有两个应用程序,第一个是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 documentationprotect resource至少没有在数据库/代码中重复表,但是我找不到任何可以帮助我的东西

Obs⁴:我现在正在考虑尝试使用Alembic进行手动设置,或者创建两个连接并通过db.create_all生成表

额外:SQLalchemy orm skip already-existing tables on create,但在我的上下文中,我需要忽略数据库中不存在的表。

0 个答案:

没有答案