作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个实现 REST api 的 flask 应用程序。由于某些原因,我正在使用 HTTP 摘要身份验证。我已经使用 Flask-HTTPAuth 库来实现摘要身份验证并且它有效;但是,我无法在单元测试中进行身份验证。
对于单元测试,在设置身份验证之前,我正在做这样的事情:
class FooTestCase(unittest.TestCase):
def setUp(self):
self.app = foo.app.test_client()
def test_root(self):
response = self.app.get('/')
# self.assert.... blah blah blah
在实现身份验证之前,这很好。现在我得到一个 401,这是对摘要授权请求的初始响应。我已经搜索和搜索并遵循了一些与 http 基本身份验证相关的建议(使用参数数据 = {#various stuff} 和 follow_redirects=True),但我没有成功。
有人知道如何在这种情况下实现单元测试吗?
最佳答案
不幸的是,摘要式身份验证在 Flask-HTTPAuth 中更难测试或绕过。
一个选项是实际计算正确的哈希值并在测试期间执行完整的身份验证。您可以在 Flask-HTTPAuth unit tests 中看到这方面的一些示例。 .这是一个:
def test_digest_auth_login_valid(self):
response = self.client.get('/digest')
self.assertTrue(response.status_code == 401)
header = response.headers.get('WWW-Authenticate')
auth_type, auth_info = header.split(None, 1)
d = parse_dict_header(auth_info)
a1 = 'john:' + d['realm'] + ':bye'
ha1 = md5(a1).hexdigest()
a2 = 'GET:/digest'
ha2 = md5(a2).hexdigest()
a3 = ha1 + ':' + d['nonce'] + ':' + ha2
auth_response = md5(a3).hexdigest()
response = self.client.get(
'/digest', headers={
'Authorization': 'Digest username="john",realm="{0}",'
'nonce="{1}",uri="/digest",response="{2}",'
'opaque="{3}"'.format(d['realm'],
d['nonce'],
auth_response,
d['opaque'])})
self.assertEqual(response.data, b'digest_auth:john')
在这个例子中,用户名是john
,密码是bye
。假设您有一些预先确定的用户凭据,可以在单元测试中使用,因此您可以将这些凭据插入上面的 a1
变量中。这种身份验证舞蹈可以包含在一个辅助函数中,该函数在测试期间包装请求的发送,这样您就不必在每次测试中都重复此操作。
关于python - 如何在 Flask 中对 HTTP 摘要身份验证进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38925016/
我是一名优秀的程序员,十分优秀!