python - 需要 Django Rest Framework JWT 登录

标签 python django python-3.x

我正在使用 django Rest Framework jwt 身份验证。我成功获取token并可以将token添加到cookie中。但是,当我尝试访问需要登录的 View 时,JWT 身份验证不起作用。始终重定向到 login.html。

Http请求头:

Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjozLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTA1NjU3NDgwLCJlbWFpbCI6ImFkbWluQGdtYWlsLmNvbSJ9.Ro507cIEisRle_iKgH4dm3-tSbrrsaCUYtP2CIK9jLM

Cookie: token=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, '最终', 0)

Python 3.6.2

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

最佳答案

 class SystemUserView(View):

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

以下是使用普通 token 身份验证的 DRF View 示例。我还没有测试过它,您必须将其适应 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。

关于python - 需要 Django Rest Framework JWT 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46265104/

相关文章:

c++ - 使用 Python.h 从 C++ 调用 Django

python - 从 SQL 搜索结果中获取正确的日期格式 (datetime.datetime)

python - 使用 Pandas 将多列取消列为行

python - Discord.py Cog//如何发送消息到特定 channel

python - 将 Paho MQTT 与 Django 集成

python - django-filter:风格选择

python-2.7 - ImportError : No module named 'skimage' , 但我安装了所有依赖项和 scikit-image

Python 请求不适用于网站 API,但适用于浏览器 (chrome)

javascript - 在关闭的 python 服务器上的 ajax 请求中获取 0 作为 Http 响应代码

python - django:根据条件排除某些表单元素