我有一个基本的 django 休息服务,它
- 注册一个人
- 更新他的密码。
我想在上面添加 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'
- 应该怎么做才能实现这一目标?我应该在序列化程序的创建方法中调用 api-auth-token 吗?
- django-rest-framework-jwt 如何处理多个身份验证 token 并正确识别哪个 token 属于哪个用户?特别是当它不在数据库中存储 token 时。
- 我如何使用此身份验证机制来限制我的用户只能查看/更新/删除他的用户?
- 一般情况下,我如何使用这种身份验证机制来做任何事情。例如,如果用户想将他的名字写入/tmp/abcd.txt。我如何确保只有经过身份验证的用户才能这样做?
- 此方法是否存在任何潜在漏洞。如果我的应用要存储大量 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/