3

REST API を実装するフラスコ アプリがあります。理由により、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基本認証に関連するいくつかの提案に従いました(パラメーター data = { #various stuff} および follow_redirects=True を使用)が、成功しませんでした。

この場合、単体テストを実装する方法を知っている人はいますか?

4

2 に答える 2

6

残念ながら、ダイジェスト認証は、Flask-HTTPAuth でテストまたはバイパスするのが困難です。

1 つのオプションは、実際に正しいハッシュを計算し、テスト中に完全な認証を実行することです。Flask-HTTPAuth 単体テストで、この例をいくつか見ることができます。ここに1つがあります:

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上記の変数にプラグインします。この認証ダンスは、テスト中にリクエストの送信をラップする補助関数に含めることができます。これにより、すべてのテストでこれを繰り返す必要がなくなります。

于 2016-08-12T23:40:16.683 に答える