Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django RestAPI-仅允许通过JWT身份验证访问用户数据_Django_Django Rest Framework_Django Authentication - Fatal编程技术网

Django RestAPI-仅允许通过JWT身份验证访问用户数据

Django RestAPI-仅允许通过JWT身份验证访问用户数据,django,django-rest-framework,django-authentication,Django,Django Rest Framework,Django Authentication,我有以下API: 型号: class Todo(models.Model): owner = models.ForeignKey(User, on_delete=models.CASCADE) name = models.CharField(max_length=20, default="") text = models.TextField(max_length=450, default="") done = models.

我有以下API:

型号:

class Todo(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=20, default="")
    text = models.TextField(max_length=450, default="")
    done = models.BooleanField(default=False)
视图:

序列化程序:

class TodoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Todo
        fields = ("id", "owner", "name", "text", "done")
我对我的令牌使用
rest\u framework\u simplejwt
,并通过以下路径接收令牌:

path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
这是标记:
eyj0exaiioijkv1qilcjhbgcioijiuzi1nij9.eyj0b2tlbl90exblywjznznziijjjjjjjjjjjjjg4mj5zgmyzja0nge5yw4nzm3nwzjjjjjjjjjjjjf9.xJ4s971XE0c9iX0Ar1HQSE84u/lbdkll4imswyswk2u8

当我在jwt.io上解码它时,我可以看到它包含用户id:

{
  "token_type": "access",
  "exp": 1619288800,
  "jti": "aca8239dc2f044a9aa87375fc0765d4a",
  "user_id": 1
}
http://localhost:8000/todos/?id=1
在我的请求头中没有令牌是不起作用的(很好!),但是有了令牌,我也可以访问
http://localhost:8000/todos/?id=2
这当然是不需要的。我只想访问
http://localhost:8000/todos/?id=1
(来自有效负载的响应用户id


如何执行此操作?

使用以下内容更改您的
get\u queryset
方法:

def get_queryset(self):
    reque Todo.objects.filter(owner=self.request.user)
现在,任何人都只能访问自己的Todo记录

Url应该是这样的
http://localhost:8000/todos/

额外: 不要从客户那里拿走
所有者
。相反,让你自己决定。 如下图所示

class TodoSerializer(serializers.ModelSerializer):
    owner = serializers.HiddenField(default=serializers.CurrentUserDefault())

    class Meta:
        model = Todo
        fields = ("id", "owner", "name", "text", "done")

嗯,我得到了一个新的错误:TypeError:Field'id'需要一个数字,但得到了。@DataMastery看起来您仍然在过滤器上使用
owner\uu id
,而不是
owner
,您还应该在url中为id指定一个int
/todos/
,但是如果您使用的是
Todo.objects.filter(owner=self.request.user)
则无需在URL中传递id,因此
/todos/
class TodoSerializer(serializers.ModelSerializer):
    owner = serializers.HiddenField(default=serializers.CurrentUserDefault())

    class Meta:
        model = Todo
        fields = ("id", "owner", "name", "text", "done")