【问题标题】:"detail : Invalid signature ." in JWT“详细信息:无效签名。”在智威汤逊
【发布时间】:2018-04-14 20:55:34
【问题描述】:

我已经使用 DRF 和 JWT 令牌创建了登录/注册 API。该 api 工作正常,它生成令牌。现在我有另一个应用程序,它提供了只向经过身份验证的用户添加通知的功能。 当我尝试测试时,我在邮递员中将标题提供为Authorization JWT <token>,但我得到以下错误:

"detail : Invalid signature ."

我什至在这里查看了token https://jwt.io/,它显示signature verified

现在我无法检测到问题。我浏览了整个互联网,但没有运气。请任何人都可以帮助我解决这个问题。

完整的 api 你可以在 github here 看到它,如果我在任何地方错了,请建议我。

views.py

class AddNotice(APIView):

    permission_class = (AllowAny,)
    serializer_class = AddNoticeSerializer
    def post(self, request, format=None):
        data = request.data
        serializer = AddNoticeSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            return Response(new_data)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)

serializers.py

class AddNoticeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Api
        fields = ('id', 'notice_name', 'notice_desc', 'notice_author', 'notice_valid_till', 'notice_publish_date')

    def create(self, validated_data):
            return Api.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.notice_name =  validated_data.get('name', instance.notice_name)
        instance.notice_desc = validated_data.get('category', instance.notice_desc)
        instance.notice_author = validated_data.get('subcategory', instance.notice_author)
        instance.notice_valid_till = validated_data.get('subcategory', instance.notice_valid_till)
        instance.notice_publish_date = validated_data.get('subcategory', instance.notice_publish_date)
        instance.save()
        return instance

更新:

我试过邮递员。像这样的

【问题讨论】:

  • 请提供您提出的确切请求和标头,您可以使用curl 格式
  • 我用的是邮递员,希望没问题。我在问题中添加了一张图片。看看吧。

标签: python django django-rest-framework jwt


【解决方案1】:

问题是您的管理器中没有定义get_by_natural_key 方法。

这是库用来检索用户对象的方法: https://github.com/GetBlimp/django-rest-framework-jwt/blob/0a0bd402ec21fd6b9a5f715d114411836fbb2923/rest_framework_jwt/authentication.py#L59

要解决它,只需将此方法添加到您的AccountManager

def get_by_natural_key(self, username):
    return self.get(username=username)

不知道为什么django-rest-framework-jwt docs 中没有更详细地记录这一点。

【讨论】:

  • 有一点是,添加了以上内容后,如果我想添加其他登录方式,我只能通过用户名登录,我该怎么办?
  • 您需要相应地更改逻辑。 1. 定义JWT_PAYLOAD_GET_USERNAME_HANDLER,默认取用户名字段; 2.更改get_by_natural_key以通过您想要的字段而不是用户名获取对象(传递的值由JWT_PAYLOAD_GET_USERNAME_HANDLER处理程序返回。username变量有点误导imo,他们应该将其更改为更通用的......
【解决方案2】:

发现当我创建自定义用户模型时出现“无效签名”错误。我通过以下方式解决了这个问题:

基于 Django 的 User 模型实例化模型:

``

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
.....

``

在 settings.py 中,使用 AUTH_USER_MODEL 指向自定义用户模型。

``

AUTH_USER_MODEL = 'user.User'

``

“user.User”指向用户应用中的用户模型。

继续生成令牌。令牌将立即生效。

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 2016-09-21
    • 2017-01-30
    • 2020-12-27
    • 2020-10-24
    • 2015-05-25
    • 2015-04-03
    • 2023-03-10
    • 2015-10-16
    相关资源
    最近更新 更多