首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使django-rest-framework-jwt在注册时返回令牌?

如何使django-rest-framework-jwt在注册时返回令牌?
EN

Stack Overflow用户
提问于 2015-06-30 20:01:07
回答 2查看 12.9K关注 0票数 14

我有一个基本的django rest服务

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

我想在此基础上添加jwt身份验证。如果我遵循本教程,我需要在项目的urls.py中添加一个名为“”的新url。但是,我不想添加这个新的url,并且希望我的注册电话发送一个令牌作为响应。

这是我的密码:

serializers.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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. 要做到这一点,应该做些什么呢?应该在序列化程序的create方法中调用api-auth令牌吗?
  2. django-rest框架-jwt如何处理多个身份验证令牌并正确识别哪个令牌属于哪个用户?特别是当它不将令牌存储在db中时。
  3. 如何使用此身份验证机制限制我的用户只查看/更新/删除其用户?
  4. 一般情况下,我如何使用此身份验证机制来执行任何操作。例如,如果用户想将他的名字写到/tmp/a d.txt。如何确保只有经过身份验证的用户才能这样做?
  5. 这种方法是否有任何潜在的漏洞。如果我的应用程序要存储大量机密数据,我应该使用相同的代码吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-30 22:36:44

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

代码语言:javascript
复制
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框架提供的视图,您需要指定权限类。例如:

代码语言:javascript
复制
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,它将使所有视图公开访问,除非您具体覆盖每个视图中的权限类。

票数 24
EN

Stack Overflow用户

发布于 2017-04-02 07:32:23

接受的答案有一些代码可以生成令牌,但它没有说明如何将其集成到序列化程序/视图中。此外,如果我们已经有了jwt.encode,也不能确定手动jwt_encode_handler是否是一种很好的现代方法。您可以在那里创建SerializerMethodField和创建令牌:

代码语言:javascript
复制
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中。

工作实例

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31147430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档