2017-11-02 1 views
0

Ich habe Login/Register API mit DRF und JWT-Token erstellt. Die API funktioniert gut, es erzeugt das Token. Jetzt habe ich eine andere App, mit der Benachrichtigungen nur für authentifizierte Benutzer hinzugefügt werden können. Wenn ich versuche, zu testen, liefere ich den Header als Authorization JWT <token> in Postbote, aber ich habe folgenden als Fehler:"Detail: Ungültige Unterschrift." in JWT

"detail : Invalid signature ." 

ich sogar die token hier https://jwt.io/ geprüft, es zeigt signature verified.

Jetzt kann ich das Problem nicht erkennen. Ich surfte durch das Internet, aber kein Glück. Bitte, jeder kann mir dabei helfen.

Für volle api können Sie es in github here sehen, und schlagen Sie mir vor, wenn ich irgendwo falsch bin.

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 

Update:

ich in Postbote versucht. so etwas wie dies

enter image description here

+0

Bitte liefern Sie die genaue Anfrage, die Sie gemacht und welche Kopfzeilen, können Sie 'Curl' Format verwenden –

+0

Ich benutze Briefträger, hoffe, es wäre in Ordnung . Ich habe der Frage ein Bild hinzugefügt. Guck mal. –

Antwort

1

Das Problem ist, dass Sie nicht get_by_natural_key Methode in ihrem Manager definiert haben.

Dies ist die Methode, die die Bibliothek Benutzerobjekt abruft: https://github.com/GetBlimp/django-rest-framework-jwt/blob/0a0bd402ec21fd6b9a5f715d114411836fbb2923/rest_framework_jwt/authentication.py#L59

es zu beheben, fügen Sie einfach diese Methode, um Ihre AccountManager:

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

nicht sicher, warum dies nicht dokumentiert ausführlicher in django-rest-framework-jwt docs ..

+0

Dank @Mariiodev, es hat funktioniert. :) –

+0

Eine Sache ist, dass nach dem Hinzufügen der oben genannten kann ich nur von Benutzernamen anmelden, wenn ich ein anderes Mittel zum Login hinzufügen möchte, was soll ich tun? –

+1

Sie müssten die Logik entsprechend ändern. 1. Definiere 'JWT_PAYLOAD_GET_USERNAME_HANDLER', das standardmäßig das Feld username annimmt; 2. Ändere 'get_by_natural_key', um das Objekt durch das gewünschte Feld anstelle des Benutzernamens zu erhalten (der übergebene Wert wird vom' JWT_PAYLOAD_GET_USERNAME_HANDLER' Handler zurückgegeben. Die 'username' Variable ist irgendwie irreführend imo, sie sollte sie zu etw allgemeiner machen. – mariodev

Verwandte Themen