问题 在测试时模拟Oauth提供程序


我有一个我正在编写的应用程序,它针对Oauth 2.0授权服务器进行身份验证。我想测试只有在你登录后才能访问的部分,但Oauth服务器是一个外部依赖项,使我的测试变得复杂并变得脆弱。

关于我应该怎么做的任何建议?这个行业的做法是什么?我的直觉是以某种方式模拟服务器,以便它允许访问受保护的资源。

如果重要,这是一个使用Flask编写的Python webapp。

我正在使用一个自定义的oauth服务器,它将在我自己的域上运行,虽然可以像FoxMask建议的那样添加某种沙盒功能,但我更喜欢能够在不需要额外服务器运行的情况下运行测试。


5844
2017-09-16 12:23


起源

通常,“外部”Oauth(如服务Twitter,Evernote等)提供了一个sanbox来进行测试。你没有为此目的找到一个吗?
但他们仍然要求你对他们进行身份验证吗?只是他们发给你测试的伪凭证? - Noufal Ibrahim
是的,他们当然要求。是的,他们返回了一个虚拟凭证或等同物例如,Evernote仅提供用于测试目的的特殊键。这就是用API完成我们开发的诀窍。一旦你将你的开发卷曲到推动生产,你将获得新的生产密钥。
我的Oauth2提供商是一个 定制服务器 在我自己的机器上运行。我可以在那里添加这个功能,但我更喜欢能够运行测试,甚至不需要实际运行的Oauth服务器。 - Noufal Ibrahim
我知道,你应该从这个细节开始。我本可以避免为你说无用的东西;)所以我们现在回到起点。抱歉。


答案:


从消费者(即您的应用程序)方面来看,OAuth2流程可以分为两部分:

  1. 从您的应用程序重定向到OAuth2提供程序的“授权”URL
  2. OAuth2提供程序为访问令牌返回的“代码”的交换

对于#1,您需要测试的是,当您调用启动身份验证过程的路由时,返回的响应是重定向到OAuth2提供程序。这可以通过Flask轻松完成 测试客户端。响应的状态代码应为302,并且“Location”标头设置为OAuth2提供程序的授权URL。请注意,您不需要提供程序,您只是测试响应是重定向,但您不需要实际重定向。

对#2的测试更复杂一些。您的Flask应用程序有一个特殊的URL,指定为OAuth2提供程序的“重定向URL”,以便向您发送授权代码。您可以使用Flask测试客户端调用此URL来传递模拟代码,这没有任何问题。

问题是在处理重定向URL的视图函数中,您需要调用OAuth2提供程序来交换访问令牌的身份验证代码,这是同步完成的。要防止此事务发生,您必须检查 app.config['TESTING'] 在这种情况下,跳过实际请求并将其替换为包含模拟访问令牌的虚假响应。

从那时起,您还需要伪造进入OAuth2提供程序的任何其他调用,以便发送访问令牌以请求数据。

如果您在Flask应用程序中使用OAuth2客户端库,则可以更轻松地创建模拟提供程序,而无需在应用程序中创建测试例外。就我而言,我正在使用 rauth为此我创建了一个子类 OAuth2Service 覆盖正确方法的类,并使用我从真实会话中捕获的模拟数据进行响应。然后在我的测试设置中,我只是创建模拟服务,并且应用程序被欺骗,认为它正在与真实服务器通信。

我希望这有帮助。


10
2017-09-16 16:15



因此,对于OAuth2Service的子类化,您必须充分分离会话的创建,以便您可以指定要为测试实例化哪个版本的OAuth2Service? - Basil