Django rest框架认证测试
Posted
技术标签:
【中文标题】Django rest框架认证测试【英文标题】:Django rest framework Authentcation Testing 【发布时间】:2015-03-29 12:45:54 【问题描述】:我正在尝试使用 JWT 进行身份验证的测试用例,在这种情况下使用 django-rest-framework-jwt,然后使用 curl
我得到下一个,所以:
curl -X POST -d "email=testuser@test.com&password=testing" http://localhost:8000/api/auth/token/
获取:
"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo0LCJlbWFpbCI6InRlc3R1c2VyQHRlc3QuY29tIiwiZXhwIjoxNDIyNTkxMTQ5LCJ1c2VybmFtZSI6InRlc3R1c2VyQHRlc3QuY29tIn0.OT8ggcZYWxcbSy0Vv8u5PA3QISIdarNXTVuvu4QQjnw"
但是,当我运行我的测试用例时:
class BaseTestCase(TestCase):
def setUp(self):
self.csrf_client = APIClient(enforce_csrf_checks=True)
self.email = 'testuser@test.com'
self.name = 'test user'
self.password = 'testing'
user = Usuario.objects.create_user(email=self.email, name=self.name, password=self.password)
user.save()
self.data =
'email': self.email,
'password': self.password
self.url = '/api/auth/token/'
class ObtainJSONWebTokenTests(BaseTestCase):
def test_jwt_login_json(self):
"""
Ensure JWT login view using JSON POST works.
"""
client = APIClient(enforce_csrf_checks=True)
response = client.post(self.url, self.data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
def test_jwt_login_json_incomplete_creds(self):
"""
Ensure JWT login view using JSON POST fails
if incomplete credentials are used.
"""
client = APIClient(enforce_csrf_checks=True)
self.data =
'email': self.email
response = client.post(self.url, self.data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST, response.data)
我知道了:
Creating test database for alias 'default'...
F.
======================================================================
FAIL: test_jwt_login_json (user.tests.ObtainJSONWebTokenTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/rizotas/Proyects/django/src/rescue/user/tests.py", line 34, in test_jwt_login_json
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
AssertionError: 400 != 200 : ReturnDict([('non_field_errors', ['Unable to login with provided credentials.'])])
----------------------------------------------------------------------
Ran 2 tests in 0.374s
FAILED (failures=1)
Destroying test database for alias 'default'...
有什么想法吗?
非常感谢!
更新:
我的设置
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
#'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'debug_toolbar',
'debug_panel',
...)
REST_FRAMEWORK =
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
'TEST_REQUEST_DEFAULT_FORMAT': 'json',
'TEST_REQUEST_RENDERER_CLASSES': (
'rest_framework.renderers.MultiPartRenderer',
'rest_framework.renderers.JSONRenderer',
#'rest_framework.renderers.YAMLRenderer'
)
【问题讨论】:
嘿,这有什么进展/解决方案吗?我在完全同一条船上 【参考方案1】:我没有准备好在计算机上进行测试,但我相信 Django 在测试时使用了一个单独的数据库,该数据库分别在测试开始和结束时创建和销毁。如果您尚未在测试中创建用户,则必须尝试使用它登录。测试数据库不包含通过这些凭据进行身份验证的用户。
【讨论】:
是的,但是创建了用户,请看:如果我将print(User.objects.get(email=self.email))
添加到test_jwt_login_json
得到1 - test user
【参考方案2】:
在您的 cURL 示例中,您没有传递 JSON,而是传递标准的 POST 正文。看起来“/api/auth/token/”解析为的视图不接受 JSON。此 cURL 命令应该以同样的方式失败:
curl -H "Content-Type: application/json" -d '"email":"xyz","password":"xyz"' http://localhost:8000/api/auth/token/
如果您发布您的视图代码可能会有所帮助。
【讨论】:
我尝试使用curl -H "Content-Type: application/json" .....
并且可以工作,但是当我尝试curl -H "Authorization: JWT eyJhb...." http://localhost:8000/<protected>
时得到"detail":"Authentication credentials were not provided."
。我的设置是REST framework JWT Auth
听起来你没有正确配置djangorestframework-jwt
。如果您发布您的设置可能会有所帮助。
我刚刚注意到您对问题的更新。您没有将密码传递给 self.client.post,只有用户名。你试过了吗?
我已经添加了我的设置【参考方案3】:
遇到了同样的问题。显然,当您使用默认序列化程序和路径 localhost:8000/users/ 创建用户时,不会保存密码。通过运行 curl 请求然后查询数据库来确认这一点。
按照该站点的说明:http://www.django-rest-framework.org/api-guide/serializers/#hyperlinkedmodelserializer 这是我的新 UserSerializer 类:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password')
extra_kwargs = 'password': 'write_only': True
def create(self, validated_data):
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
此代码假定用户名和电子邮件都是必填字段。显然,这可以根据您自己的业务逻辑进行更改
希望对你有帮助,
一晒
【讨论】:
以上是关于Django rest框架认证测试的主要内容,如果未能解决你的问题,请参考以下文章
基于Django的Rest Framework框架的认证组件
Django REST框架+ Angular项目上的令牌认证