2

私は、REST APIを実装したフラスコアプリを持っています。理由から、私はHTTPダイジェスト認証を使用しています。私はFlask-HTTPAuthライブラリを使ってダイジェスト認証を実装しています。ただし、単体テストでは認証できません。ユニットテストのために FlaskでHTTPダイジェスト認証の単体テストをテストするにはどうすればいいですか?

は、認証を設定する前に、私はこのような何かをやっている:

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を使用して)に関するいくつかの提案に従っていますが、私は成功しませんでした。

誰もがこの場合にunittestsを実装する手掛かりを持っていますか?

答えて

3

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

実際に正しいハッシュを計算し、テスト中に完全な認証を実行することもできます。これについては、Flask-HTTPAuth unit testsにいくつかの例があります。ここでは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変数にそれらを接続します。この認証ダンスは、テスト中に要求の送信をラップする補助機能に含めることができます。つまり、すべてのテストでこれを繰り返す必要はありません。

+0

私はリクエストを作成し、401を取得し、戻り値に基づいてauthダイジェストヘッダを構築する必要があります(これはpycharmのレスポンスオブジェクトにあります)。コピーして貼り付けたコードと同じように... お金に、ありがとうございます。 –

0

実際の認証をテストで使用する必要はありません。テストの実行時に認証を無効にするか、テストユーザーを作成してテストでこのテストユーザーを使用します。例えば

:(あなたがpy.testを使用している場合)カウスの

@digest_auth.get_password 
    def get_pw(username): 
     if running_from_tests(): 
      if username == 'test': 
       return 'testpw' 
      else: 
       return None 
     else: 
      # ... normal auth that you have 

このテストユーザーが生産にアクティブにすることはできません:) running_from_tests()の実現のためには、Test if code is executed from within a py.test sessionを参照してください。

+0

お返事ありがとうございます。私はすべてテストユーザーを設定し、パスワードを取得するように設定されています。私はDBからそうすることができます。私の問題は、test_client()。get()関数です。私は別のPythonの関数から、その後フラスコサーバを実行し、した場合、私は要求ライブラリを使用した場合 は、私はこのような何かを行うことができます:requests.authのインポートHTTPDigestAuth 結果= requests.getから ( 'http://127.0.0.1:5000/'、auth = HTTPDigestAuth( 'test'、 'mytestpw')) これは、サーバー上でダイジェスト認証を設定して、うまくログインできるようにします。しかし、どのように私はtest_client()。get()でそのプロセスを行うのですか? –

+0

申し訳ありませんが、コメントの書式を調べました。上記のコードでない場合はクリア: 'requests.authインポートからHTTPDigestAuth 結果= requests.get( '127.0.0.1:5000/'、AUTH = HTTPDigestAuth( 'テスト'、 'mytestpw'))' –

+1

@ MikeLaneおそらくこれ:https://gist.github.com/jarus/1160696 – Messa

関連する問題