我目前具有使用Knox令牌身份验证的Django基本身份验证设置。基本身份验证似乎不足以进行生产工作,因此我想替换它。 Django是否有另一个我可以轻松替换为authentication_class
的基于密码的BasicAuthentication
,或者这是一个涉及更多的过程?如果是这样,我应该从哪里开始?
我的登录api视图:
class UserLoginView(GenericAPIView):
serializer_class = UserOrganizationSerializer
authentication_classes = (BasicAuthentication,)
permission_classes = (IsAuthenticated,)
def post(self, request):
"""User login with username and password."""
token = AuthToken.objects.create(request.user)
return Response({
'user': self.get_serializer(request.user).data,
'token': token
})
我的默认身份验证类:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
答案 0 :(得分:1)
一种非常常见的方法是使用JSON Web令牌(JWT)。基本软件包为django-rest-framework-jwt。 documentation中的说明非常清楚,但是这里是一个概述:
$> pip install djangorestframework-jwt
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
...
),
添加网址格式
url_patterns = [
path('jwt/', obtain_jwt_token, name='jwt'),
...
]
获取令牌(使用出色的httpie实用工具)
http post localhost:8000/api/jwt/ username=u password=p
{
"token": "REALLY-LONG-TOKEN"
}
使用该令牌发出请求:
http get localhost:8000/api/some-endpoint/ Authorization:"JWT REALLY-LONG_TOKEN"