python - 我怎样才能让 django-rest-framework-jwt 在注册时返回 token ?

标签 python django authentication django-registration django-rest-auth

我有一个基本的 django 休息服务,它

  1. 注册一个人
  2. 更新他的密码。

我想在上面添加 jwt 身份验证。如果我按照教程进行操作,我需要在项目的 urls.py 中添加一个名为“api-token-auth”的新 url。但是,我不想添加这个新的 url 并希望我的注册调用发送 token 作为响应。

这是我的代码:

序列化器.py

class UserSerializer(serializers.HyperlinkedModelSerializer):
    def create(self, validated_data):
        user = User(
            username=validated_data['username']
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

    def update(self, instance, validated_data):
        instance.set_password(validated_data['password'])
        instance.save()
        return instance

    class Meta:
        model = User
        fields = ('url', 'username', 'password')
        lookup_field = 'username'
        write_only_fields = ('password',)

View .py

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.exclude(is_superuser=1)
    serializer_class = UserSerializer
    lookup_field = 'username'
  1. 应该怎么做才能实现这一目标?我应该在序列化程序的创建方法中调用 api-auth-token 吗?
  2. django-rest-framework-jwt 如何处理多个身份验证 token 并正确识别哪个 token 属于哪个用户?特别是当它不在数据库中存储 token 时。
  3. 我如何使用此身份验证机制来限制我的用户只能查看/更新/删除他的用户?
  4. 一般情况下,我如何使用这种身份验证机制来做任何事情。例如,如果用户想将他的名字写入/tmp/abcd.txt。我如何确保只有经过身份验证的用户才能这样做?
  5. 此方法是否存在任何潜在漏洞。如果我的应用要存储大量 secret 数据,我是否应该使用相同的代码?

最佳答案

问题 1:要在注册时手动生成 token ,您可以定义并使用如下方法:

import jwt
from rest_framework_jwt.utils import jwt_payload_handler

def create_token(user):
    payload = jwt_payload_handler(user)
    token = jwt.encode(payload, settings.SECRET_KEY)
    return token.decode('unicode_escape')

您可以将此方法添加到 View 并在用户注册后生成 token 并在响应中返回它。

问题 2:JWT token 不需要存储在数据库中。您可以在 http://jwt.io/ 阅读有关 JWT 工作原理的更多信息。

问题 3 和 4:要使用 token 限制对特定 View 的访问,尤其是 APIView 或其子类之一或 Django Rest 框架提供的 View ,您需要指定 permission classes 。例如:

from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

问题 5:使用 Django Rest Framework 时的一个潜在漏洞是您从应用程序设置中设置的默认权限;例如,如果您在设置中 AllowAny,它将使所有 View 都可公开访问,除非您特别覆盖每个 View 中的权限类。

关于python - 我怎样才能让 django-rest-framework-jwt 在注册时返回 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31147430/

相关文章:

asp.net - 制作安全登录cookie

python - 使用tesseract和opencv进行python字符串比较

python - 给定两个整数列表,我们如何找到一个列表中与另一个列表中最接近的数字?

javascript - 如何保护仅从前端使用的 API(Ajax 调用)

在 heroku 上使用 nested_inline 时 collectstatic 期间出现 Django 错误

django - Django 对象的深度 JSON 序列化

django - Django 中的身份验证不起作用?

python - Python 生成器表达式中的变量范围

python - 为什么在创建 OptionGroup 时必须提供解析器两次?

django - 为什么 Django 应用程序迁移到 GitHub?