2017-11-02 12 views
0

DRFとJWTトークンを使用してログイン/登録APIを作成しました。 APIはうまく動作し、トークンを生成します。今私は認証されたユーザーにのみ通知を追加する機能を提供する別のアプリを持っています。私がテストしようとすると 、私は郵便配達にAuthorization JWT <token>ように、ヘッダを供給しますが、私はエラーとして、以下の取得:"詳細:無効な署名です。" JWT

"detail : Invalid signature ." 

私もここhttps://jwt.io/、それはsignature verifiedを示しtokenをチェックします。

問題を検出できません。私はインターネットを介してすべてのサーフィンをしたが運がない。誰もがこれで私を助けることができますようにしてください。

フル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 

更新:

私は郵便配達してみました。この

enter image description here

+0

あなたが作成した正確なリクエストと、「curl」形式を使用できるヘッダを指定してください。 –

+0

私は郵便配達員を使います。 。質問に画像を追加しました。見てみましょう。 –

答えて

1

問題のようなものは、あなたがあなたのマネージャーに定義されているget_by_natural_key方法を持っていないということです。

このライブラリは、ユーザーオブジェクト取得するために使用するメソッドです。これは文書化されていない理由

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

わからない:単にあなたのAccountManagerに、このメソッドを追加し、それを解決するには https://github.com/GetBlimp/django-rest-framework-jwt/blob/0a0bd402ec21fd6b9a5f715d114411836fbb2923/rest_framework_jwt/authentication.py#L59

django-rest-framework-jwt文書でもっと詳しく:

+0

ありがとう@mariodev、それは働いた。 :) –

+0

上記を追加した後で、別のログイン手段を追加したい場合、ユーザー名だけでログインできます。どうすればいいですか? –

+1

これに応じてロジックを変更する必要があります。 1.デフォルトでusernameフィールドを取る 'JWT_PAYLOAD_GET_USERNAME_HANDLER'を定義します。 2. 'get_by_natural_key'を変更してusernameの代わりに必要なフィールドでオブジェクトを取得します(渡された値は' JWT_PAYLOAD_GET_USERNAME_HANDLER'ハンドラによって返されます) 'username'変数はちょっと誤っています。 – mariodev