模拟或避免 pytest 的 cognito 身份验证和组权限

Posted

技术标签:

【中文标题】模拟或避免 pytest 的 cognito 身份验证和组权限【英文标题】:Mock or avoid cognito authentication and group permissions for pytest 【发布时间】:2021-10-04 09:00:08 【问题描述】:

我有一个烧瓶应用程序,我正在尝试为我构建的服务实施 pytest。所有路由都需要 cognito 身份验证或 cognito 组权限。有没有办法可以模拟或避免认知?从我在网上阅读的所有文章来看,到目前为止没有任何帮助。

以下示例如何实现 pytest?

@app.route('/hello')
@cognito_auth_required
@cognito_group_permissions(["test"])
def hello():
    return 'Hello, World'

【问题讨论】:

【参考方案1】:

我在努力做同样的事情时发现了这个问题。我试图修补那些被证明是徒劳的装饰器,直到我做了更多的挖掘。事实证明,由于涉及装饰器的语法糖是在运行时处理的,因此您需要使用旁路函数修补库函数,然后重新加载被测库以使其工作。

我使用的是 unittest 而不是 pytest。但是这个例子,它返回一个包含登录用户子的字典(我们也会模拟这个)应该可以工作:

src/controllers/some_module.py:

@cognito_auth_required
def my_example_function() -> dict:
    return 'your_sub' : current_cognito_jwt['sub']

src/test/some_test.py

def mock_cognito_auth_required(fn):
    """
    This is a dummy wrapper of @cognito auth required, it passes-through 
    to the
    wrapped fuction without performing any cognito logic.

    """
    @wraps(fn)
    def decorator(*args, **kwargs):
        return fn(*args, **kwargs)
    return decorator

def setUpModule():
    """
    Patches out the decorator (in the library) and reloads the module
    under test.
    """
    patch('flask_cognito.cognito_auth_required', mock_cognito_auth_required).start()
    reload(some_module)

@patch('src.controllers.some_module.current_cognito_jwt')
class TestSomeModule(unittest.TestCase):
    def test_my_example_function(self, mock_current_cognito_jwt):
        mock_current_cognito_jwt.__getitem__.return_value = 'test'
        response = some_module.my_example_function()
        self.assertEqual(response, 'your_sub': 'test')

您应该能够对 cognito_group_permissions 执行类似操作。

【讨论】:

以上是关于模拟或避免 pytest 的 cognito 身份验证和组权限的主要内容,如果未能解决你的问题,请参考以下文章

AWS API Gateway Cognito 授权模拟

如何从 Cognito 身份池提供的身份凭证访问用户数据?

如何在 Android 上使用 IAM 或 Cognito Pool 作为身份验证方法而不是 API 密钥

将 s3 文件下载限制为 cognito(首选)中经过身份验证的用户或任何人。他们应该只能查看但不能下载

AWS cognito 用户迁移池触发器不适用于登录流程

AWS Cognito 用户池 + 用于身份验证/登录的社交提供商