我有一个基本的django rest服务
我想在此基础上添加jwt身份验证。如果我遵循本教程,我需要在项目的urls.py中添加一个名为“”的新url。但是,我不想添加这个新的url,并且希望我的注册电话发送一个令牌作为响应。
这是我的密码:
serializers.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',)views.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'发布于 2015-06-30 22:36:44
问题1:要在注册时手动生成令牌,您可以定义并使用如下方法:
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')您可以将此方法添加到视图中,并在用户注册后生成令牌,并在响应中返回它。
问题2: JWT令牌不需要存储在数据库中。您可以更多地了解JWT在http://jwt.io/中的工作方式。
问题3和4:要使用令牌限制对特定视图的访问,特别是APIView或它的子类或Django Rest框架提供的视图,您需要指定权限类。例如:
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,它将使所有视图公开访问,除非您具体覆盖每个视图中的权限类。
发布于 2017-04-02 07:32:23
接受的答案有一些代码可以生成令牌,但它没有说明如何将其集成到序列化程序/视图中。此外,如果我们已经有了jwt.encode,也不能确定手动jwt_encode_handler是否是一种很好的现代方法。您可以在那里创建SerializerMethodField和创建令牌:
token = serializers.SerializerMethodField()
def get_token(self, obj):
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(obj)
token = jwt_encode_handler(payload)
return token然后将token字段添加到Meta.fields中。
https://stackoverflow.com/questions/31147430
复制相似问题