You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django签名模块报错:No ':' found in value,Postman正常Axios异常

Django REST Framework签名Token在Axios调用时验签失败

我基于Django REST Framework开发API,使用django.core.signing模块生成token。在Postman等API客户端中,签名与验签功能正常,但通过Next.js前端的Axios调用时,出现错误提示No ':' found in value。排查发现,传入的token中冒号被转义为%3A,而实际正确的token包含冒号。

相关代码

API代码(Django)

def create(self, request, *args, **kwargs):
    activation_token = request.data.get("activation_token")
    activation_code = request.data.get("activation_code")
    print(activation_token)
    try:
        data = signer.unsign_object(
            activation_token, max_age=timedelta(minutes=10))
    except Exception as e:
        print(e)
        return Response({"message": "OTP has expired! Try registering again."}, status=status.HTTP_400_BAD_REQUEST)
    if data["activation_code"] == activation_code:
        user = User.objects.create_user(
            email=data["email"], password=data["password"], first_name=data["first_name"], last_name=data["last_name"])
        serializer = UserSerializer(user, many=False)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response({"message": "Invalid OTP"}, status=status.HTTP_400_BAD_REQUEST)

原Axios代码(Next.js)

const response = await axios.post(
    `${BASEURL}auth/users/activate/`,
    JSON.stringify({
      activation_code: values.otp,
      activation_token: token,
    }),
    {
      headers: {
        Accept: "*/*",
        "Content-Type": "application/json",
      },
    }
);

问题原因

手动用JSON.stringify()序列化请求体,同时又设置了Content-Type: application/json,会触发Axios对已经是JSON字符串的内容再次进行URL编码,导致token里的冒号被转成%3A。后端收到的不是原始token,自然无法通过signer.unsign_object的验签,抛出No ':' found in value错误。

解决方法

直接把请求数据以对象形式传给Axios,不要手动调用JSON.stringify()。Axios会自动帮你完成JSON序列化,并且确保特殊字符不会被错误编码。

修改后的Axios代码

const response = await axios.post(
    `${BASEURL}auth/users/activate/`,
    {
      activation_code: values.otp,
      activation_token: token,
    },
    {
      headers: {
        Accept: "*/*",
        "Content-Type": "application/json",
      },
    }
);

或者可以省略手动设置的Content-Type,Axios会自动添加正确的请求头:

const response = await axios.post(
    `${BASEURL}auth/users/activate/`,
    {
      activation_code: values.otp,
      activation_token: token,
    },
    {
      headers: {
        Accept: "*/*",
      },
    }
);

后端代码无需修改,只要前端传入原始的token,signer.unsign_object就能正常解析验签。

内容的提问来源于stack exchange,提问作者Ramon Rasheed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:10:36