反应 axios 补丁请求给出 401 错误但提供了授权

Posted

技术标签:

【中文标题】反应 axios 补丁请求给出 401 错误但提供了授权【英文标题】:React axios patch request giving 401 error but authorization is provided 【发布时间】:2022-01-08 17:10:15 【问题描述】:

我正在尝试通过 axios 补丁请求将用户添加到组中。数据都是正确的,但即使我在标题中包含授权,我也会收到 401 错误。代码如下,非常感谢任何帮助。

    handleJoin = (e, group) => 
        e.preventDefault();
        axios.get('http://localhost:8000/core/current_user/', 
                headers: 
                    Authorization: `JWT $localStorage.getItem('token')`
                
        )
        .then((user) => 
            let group_data = new FormData();
            group_data.append('user', user.data.id);
            group_data.append('group', group.id);
            for (var value of group_data.values()) 
               console.log(value);
            
            axios.patch(`http://localhost:8000/core/usergroup/$user.data.id/`, 
                group_data,
                headers: 
                    Authorization: `JWT $localStorage.getItem('token')`,
                    'Content-Type': 'application/json',
                ,
            )
            .then((res) => 
                console.log(res.data);
            )
            .catch((err) =>  
                console.log(err);
            );
        )
        .catch((err) => 
            console.log(err);
        );
    

编辑:尝试重写请求并更改 group_data 变量的位置会停止 401 错误,但不会更改模型中的数据。

    handleJoin = (e, group) => 
        e.preventDefault();
        axios.get('http://localhost:8000/core/current_user/', 
                headers: 
                    Authorization: `JWT $localStorage.getItem('token')`
                
        )
        .then((user) => 
            let group_data = new FormData();
            group_data.append('user', user.data.id);
            group_data.append('group', group.id);
            for (var value of group_data.values()) 
               console.log(value);
            
            axios.patch(`http://localhost:8000/core/usergroup/$user.data.id/`, group_data,
                headers: 
                    Authorization: `JWT $localStorage.getItem('token')`,
                    'Content-Type': 'application/json',
                ,
            )
            .then((res) => 
                console.log(res.data);
            )
            .catch((err) =>  
                console.log(err);
            );
        )
        .catch((err) => 
            console.log(err);
        );
    

编辑:

我更改了处理程序,现在它正在更新组字段但完全覆盖它。当我尝试将组作为列表发送时,它会给出错误,期望一个代表 pk 的 int。所以我的问题是,有没有一种方法可以在不覆盖之前的信息的情况下修补模型。

以组值为 id 的处理程序

        e.preventDefault();
        axios.get('http://127.0.0.1:8000/core/current_user/', 
                headers: 
                    Authorization: `JWT $localStorage.getItem('token')`
                
        )
        .then((user) => 
                let group_data = new FormData();
                group_data.append('user', user.data.id);
                group_data.append('group', group.id);
                for (var value of group_data.values()) 
                   console.log(value);
                
                axios.patch(`http://127.0.0.1:8000/core/usergroup/$user.data.id/`, group_data,
                    headers: 
                        Authorization: `JWT $localStorage.getItem('token')`,
                        'Content-Type': 'application/json',
                    ,
                )
                .then((res) => 
                    console.log(res.data);
                )
                .catch((err) =>  
                    console.log(err);
                );
        )
        .catch((err) => 
            console.log(err);
        );
    

以组为列表的处理程序

handleJoin = (e, group) => 
        e.preventDefault();
        axios.get('http://127.0.0.1:8000/core/current_user/', 
                headers: 
                    Authorization: `JWT $localStorage.getItem('token')`
                
        )
        .then((user) => 
            axios.get(`http://127.0.0.1:8000/core/usergroup/$user.data.id/`, 
                headers: 
                    Authorization: `JWT $localStorage.getItem('token')`,
                    'Content-Type': 'application/json',
                
            )
            .then((usergroup) =>  
                let group_data = new FormData();
                let prev = usergroup.data.group
                prev.push(group.id);
                console.log(prev);
                group_data.append('user', user.data.id);
                group_data.append('group', prev);
                for (var value of group_data.values()) 
                   console.log(value);
                
                axios.patch(`http://127.0.0.1:8000/core/usergroup/$user.data.id/`, group_data,
                    headers: 
                        Authorization: `JWT $localStorage.getItem('token')`,
                        'Content-Type': 'application/json',
                    ,
                )
                .then((res) => 
                    console.log(res.data);
                )
                .catch((err) =>  
                    console.log(err);
                );
            )
        )
        .catch((err) => 
            console.log(err);
        );
    

后端是用 Django 编写的,我意识到问题可能出在前端而不是前端。我还发布了我的序列化程序和视图,以防它们可能是问题。任何帮助将不胜感激。

序列化器

    class UserGroupSerializer(serializers.ModelSerializer):
    groups = GroupSerializer(many=True, read_only=True,)

    class Meta:
        model = UserGroup
        fields = '__all__'

查看


        class UserGroupDetail(APIView):
        def patch(self, request, pk):
            usergroup = UserGroup.objects.get(pk=pk)
            serializer = UserGroupSerializer(instance=usergroup, data=request.data, partial=True)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

【问题讨论】:

【参考方案1】:

您的授权标头应该是

Authorization: `Bearer $localStorage.getItem('token')`
           

【讨论】:

感谢您的回复!我已经尝试过了,但它仍然给我 401 错误。

以上是关于反应 axios 补丁请求给出 401 错误但提供了授权的主要内容,如果未能解决你的问题,请参考以下文章

Axios 发布请求适用于 Postman,但不适用于浏览器(它返回“错误 401-未授权”)

执行带有axios的GET请求时出现401错误

Axios GET 请求 Spotify API 返回 401

使用 Auth Headers 发送 axios get 请求时出现 401 错误

Vue-axios拦截器401错误

为啥在 React 中,我的 axios API 调用有 Authorization Header,其中包含 Bearer <token> 但未被授权并给出 401 错误