替换Django Rest Framework中的基本身份验证

时间:2019-07-09 19:04:27

标签: django authentication django-rest-framework

我目前具有使用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',
],

1 个答案:

答案 0 :(得分:1)

一种非常常见的方法是使用JSON Web令牌(JWT)。基本软件包为django-rest-framework-jwtdocumentation中的说明非常清楚,但是这里是一个概述:

$> 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"

一些注意事项

  • JWT令牌是 meant ,可供客户端解码。它们受签名保护,因此无法修改
  • 您可以解码令牌(online),并查看到期时间和其他数据
  • 可以通过软件包提供的其他网址刷新或验证令牌
  • 最终刷新将失败,并且用户将需要重新登录。该时间跨度是可配置的(请参阅我对this other question的回复)