Django RestAPI-仅允许通过JWT身份验证访问用户数据
我有以下API: 型号: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.
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")