从消费者(即您的应用程序)方面来看,OAuth2 流程可以分为两部分:
- 从您的应用程序重定向到 OAuth2 提供者的“授权”URL
- 将 OAuth2 提供者返回的“代码”交换为访问令牌
对于#1,您需要测试的是,当您调用启动身份验证过程的路由时,返回的响应是重定向到 OAuth2 提供程序。这可以通过 Flask 的测试客户端轻松完成。响应应具有 302 的状态代码和设置为 OAuth2 提供程序的授权 URL 的“位置”标头。请注意,您不需要提供程序启动,您只是测试响应是重定向,但您不需要实际重定向。
对#2 的测试涉及更多一点。您的 Flask 应用程序有一个特殊的 URL,该 URL 被指定为 OAuth2 提供程序的“重定向 URL”,以将授权代码发回给您。您可以使用传递模拟代码的 Flask 测试客户端调用此 URL,这没有问题。
问题在于,在处理重定向 URL 的视图函数中,您需要调用 OAuth2 提供程序以将身份验证代码交换为访问令牌,并且这是同步完成的。为了防止此事务发生,您必须检查app.config['TESTING']
并在这种情况下跳过实际请求并将其替换为包含模拟访问令牌的虚假响应。
从那时起,您还需要伪造对发送访问令牌以请求数据的 OAuth2 提供程序的任何其他调用。
如果您在 Flask 应用程序中使用 OAuth2 客户端库,则创建模拟提供程序可能更容易,而无需在应用程序中创建测试异常。在我的例子中,我使用的是rauth,为此我创建了该类的一个子OAuth2Service
类,它覆盖了正确的方法并使用我从真实会话中捕获的模拟数据进行响应。然后在我的测试设置中,我只是创建了模拟服务,应用程序被愚弄以为它正在与真实的服务器通信。
我希望这有帮助。