如何在视图之前实现令牌认证?

时间:2018-12-14 17:50:21

标签: django django-rest-framework token http-token-authentication

我一直在学习如何通过不同的博客帖子和youtube视频使用djangorestframework令牌认证。 作为参考,我在这里关注博客:https://chrisbartos.com/articles/how-to-implement-token-authentication-with-django-rest-framework/

我无法理解在访问任何页面之前我们将如何检查令牌。我的意思是,我正在开发一个应用程序,该应用程序公开了用户通过其余框架创建的任务。我添加了一个登录名,该登录名可以保存用户并返回为该人创建的令牌。现在,我想检查该令牌以找到该人创建的todos api,并在我的浏览器中以单独的网址查看它。 举个例子: 通过localhost:8000 / api / v1 / login登录后, 我应该以json rest api格式在api / v1 / todos处获得由我创建的待办事项。 而且,如果我转到api / v1 / todos / 1 /,它应该给我详细的待办事项,就像我在序列化程序中创建的一样。

我想添加更多信息: 因此,假设我已经为登录表单创建了一个类。它将为我创建一个令牌。 因此,以下是视图中的登录名:

    def signin(request):
        username = password = ''
        if request.method == 'POST':
            username = request.POST['username']
            password = request.POST['password']

            user = authenticate(username=username, password=password)
            if user is not None:
                if user.is_active:
                    return HttpResponse('Logged In')
            else:
                return HttpResponse('Wrong credentials')

        return render(request,'login.html')

因此,我想为此创建一个令牌。如djangorestframework文档https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication中所述 它创建了一个单独的视图来访问从功能get_auth_token获得的api-auth-token。但是,如何应用此功能在基于类的视图中保存当前登录的令牌。 另外,如何在另一个基于类的视图中传递此信息,以防万一我未登录但在通过身份验证时在json中提供给我api的情况下不显示身份验证?

2 个答案:

答案 0 :(得分:0)

https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication

在Django rest_framework.authentication.TokenAuthentication文件的DEFAULT_AUTHENTICATION_CLASSES选项的REST_FRAMEWORK中向settings.py添加rest_framework.authtoken

INSTALLED_APPS添加到settings.py中的@authentication_classes

您可以在要保护的视图之前使用@authentication_classes((TokenAuthentication,)) def sample_function(request): 装饰器,如下所示:

{{1}}

您还需要为用户创建令牌,该令牌记录在该初始链接中。

答案 1 :(得分:0)

class loginview(APIView):
permission_classes = [
    permissions.AllowAny  # Anyone can Login
]
   def post(self,request):

      email_address = request.data.get('email')
      user_request = get_object_or_404(
        User,
        email=email_address,
    )
    username = user_request.username

    password = request.data.get("password")

    user = authenticate(username=username, password=password)
    id_u = user.id
    if not user:
        return Response({"error": "Login failed"}, 
                               status=status.HTTP_401_UNAUTHORIZED)

    token, _ = Token.objects.get_or_create(user=user)
    return Response({"token": token.key,'id':id_u})

以下是示例代码,您可以在使用来自应用程序前端的Login API时获取令牌。可以从令牌模型访问身份验证令牌。不要忘记添加

    from rest_framework.authtoken.models import Token

还将rest_framework.authtoken添加到settings.py中的已安装应用中