首页 文章

需要Django Rest Framework JWT登录

提问于
浏览
0

我正在使用django rest framework jwt身份验证 . 我成功获得令牌并可以向cookie添加令牌 . 但是当我尝试访问需要登录的视图时,JWT身份验证无效 . 始终重定向到login.html .

Http请求标头:

授权:JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjozLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTA1NjU3NDgwLCJlbWFpbCI6ImFkbWluQGdtYWlsLmNvbSJ9.Ro507cIEisRle_iKgH4dm3-tSbrrsaCUYtP2CIK9jLM曲奇:标记= eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjozLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTA1NjU3NDgwLCJlbWFpbCI6ImFkbWluQGdtYWlsLmNvbSJ9.Ro507cIEisRle_iKgH4dm3-tSbrrsaCUYtP2CIK9jLM

class SystemUserView(View):
    @method_decorator(login_required)
    def get(self, request, user_id):
        users = list(User.objects.all().values('email', 'id', 'username'))
        return HttpResponse(HttpResponse(json.dumps(users), content_type="application/json"))

网址:

from django.conf.urls import url
from . import views
from .views import SystemUserView, UserAuthenticationView
from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token, verify_jwt_token
urlpatterns = [
    url(r'^$', views.index, name="index"),
    url(r'^login/?$', UserAuthenticationView.login, name="index"),
    url(r'^user/(?P<user_id>[0-9]+)/$', SystemUserView.as_view(), name='user'),
    url(r'^api-token-auth/', obtain_jwt_token),
    url(r'^api-token-refresh/', refresh_jwt_token),
    url(r'^api-token-verify/', verify_jwt_token),
]

Django版本:(1,11,5,'final',0)

Python 3.6.2

https://getblimp.github.io/django-rest-framework-jwt/

1 回答

  • 1
    class SystemUserView(View):
    

    看起来您正在导入Django视图,而不是DRF APIView . DRF和Django使用不同的身份验证系统 . 如果您使用JWT对DRF进行身份验证,Django Views仍会将您重定向到登录页面 .

    以下是使用普通令牌身份验证的DRF视图示例 . 我没有测试它,你必须为JWT进行调整,但它应该引导你走上正确的道路 .

    from rest_framework import authentication, permissions
    from django.contrib.auth.models import User
    
    class ListUsers(APIView):
        """
        View to list all users in the system.
    
        * Requires token authentication.
        """
        authentication_classes = (authentication.TokenAuthentication,)
        permission_classes = (permissions.IsAuthenticated,)
    
        def get(self, request, user_id):
            """
            Return a list of all users.
            """
            users = list(User.objects.all().values('email', 'id', 'username'))
            return Response(users)
    

    另外,请考虑使用DRF serializer将用户对象转换为json .

相关问题