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 basic auth (매개 변수 데이터 = {#various stuff} 및 follow_redirects = True를 사용)와 관련된 몇 가지 제안을 추적했지만 성공하지 못했습니다.

누군가이 경우에 unittests를 구현하는 방법에 대한 단서가 있습니까?

답변

3

불행히도 다이제스트 인증은 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에 해당 자격 증명을 연결합니다. 이 인증 춤은 테스트 중에 요청 보내기를 감싸는 보조 기능에 포함될 수 있으므로 모든 테스트에서이 춤을 반복하지 않아도됩니다.

+0

예. 요청을 만들고, 401을 얻고, 반환을 기반으로 auth digest 헤더를 구성해야합니다 (이는 pycharm의 응답 객체에서 찾을 수 있습니다). 복사 한 코드와 붙여 넣기가 수행하는 것처럼 ... 돈으로 고마워요. –

0

실제 인증을 테스트에 사용해야하는 것은 아닙니다. 테스트를 실행할 때 인증을 사용하지 않거나 테스트 사용자를 생성하고이 테스트 사용자를 테스트에 사용하십시오. 예를 들어

:

(당신이 py.test를 사용하는 경우) running_from_tests()Test if code is executed from within a py.test session 볼이 테스트 사용자가 구현을 위해 : 생산의 활성화해서는 안 나오긴의
@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 

.

+0

답변 해 주셔서 감사합니다. 나는 테스트 사용자를 설정하고 패스워드를받는 것으로 설정되어있다. DB에서 바로 할 수 있습니다. 내 문제는 test_client(). get() 함수입니다. 나는 다른 파이썬 함수에서 다음 플라스크 서버를 실행한다면 내가 요청 라이브러리를 사용한다면 , 나는 이런 식으로 뭔가를 할 수 있습니다 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/'인증 = HTTPDigestAuth ('테스트', 'mytestpw'))' –

+1

에서 @ MikeLane 어쩌면 이것 : https://gist.github.com/jarus/1160696 – Messa