8

BenKayıtta django-rest-framework-jwt dönüş jetonunu nasıl yapabilirim?

  1. bir kişi ve
  2. şifresini günceller kaydeder temel Django dinlenme hizmeti var.

Bunun üzerine jwt kimlik doğrulaması eklemek istiyorum. Eğiticiyi takip edersem projenin urls.py dosyasında "api-token-auth" adlı yeni bir url eklemem gerekir. Ancak, bu yeni URL'yi eklemek istemiyorum ve kayıt çağrımın yanıt olarak bir belirteç göndermesini istiyorum.

serializers.py

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    def create(self, validated_data): 
     user = User(
      username=validated_data['username'] 
     ) 
     user.set_password(validated_data['password']) 
     user.save() 
     return user 

    def update(self, instance, validated_data): 
     instance.set_password(validated_data['password']) 
     instance.save() 
     return instance 

    class Meta: 
     model = User 
     fields = ('url', 'username', 'password') 
     lookup_field = 'username' 
     write_only_fields = ('password',) 

views.py

class UserViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows users to be viewed or edited. 
    """ 
    queryset = User.objects.exclude(is_superuser=1) 
    serializer_class = UserSerializer 
    lookup_field = 'username' 
Bunu başarmak için yapılması gerekenler
  1. :

    İşte benim kod? serializer'in yaratma yöntemimin içinde api-auth-token'ı çağırmalı mıyım?

  2. Django-rest-framework-jwt çoklu kimlik doğrulama belirteçlerini nasıl kullanır ve hangi belirtecin hangi kullanıcıya ait olduğunu doğru bir şekilde tanımlar? Özellikle de db'de jeton saklamadığında.
  3. Kullanıcımı yalnızca kullanıcısını görüntülemek/güncellemek/silmek üzere sınırlamak için bu kimlik doğrulama mekanizmasını nasıl kullanabilirim?
  4. Genel olarak herhangi bir şey yapmak için bu kimlik doğrulama mekanizmasını nasıl kullanabilirim. Örneğin, bir kullanıcı kendi adını /tmp/abcd.txt dosyasına yazmak isterse. Sadece kimliği doğrulanmış kullanıcıların bunu yapabileceğinden nasıl emin olabilirim?
  5. Bu yaklaşımda potansiyel boşluklar var mı? Uygulamam çok sayıda gizli veriyi depolayacaksa aynı kodu kullanmalı mıyım?

cevap

12

Soru 1: görüntülemeye bu fonksiyonu ekleyebilir

import jwt 
from rest_framework_jwt.utils import jwt_payload_handler 

def create_token(user): 
    payload = jwt_payload_handler(user) 
    token = jwt.encode(payload, settings.SECRET_KEY) 
    return token.decode('unicode_escape') 

ve oluşturun: Eğer benzeyen bir işlev kullanabilirsiniz django-dinlenme-çerçeve-JWT'de ile çalışacak bir belirteç oluşturmak için Kullanıcı kaydedildikten sonra belirteç.

Soru 2: belirli bir görünümle özellikle APIView erişimi sınırlandırmak için belirteçleri kullanmak için: JWT belirteçleri Eğer JWT http://jwt.io/

Soru 3 ve 4'te nasıl çalıştığı hakkında bana okuyabilir veritabanına int saklanmasına gerek yoktur veya Django istirahat framework tarafından sağlanan onun alt sınıflara veya bir manzarası Örneğin permission classes belirtmeniz gerekir

from rest_framework.permissions import IsAuthenticated 
from rest_framework.response import Response 
from rest_framework.views import APIView 

class ExampleView(APIView): 
    permission_classes = (IsAuthenticated,) 

    def get(self, request, format=None): 
     content = { 
      'status': 'request was permitted' 
     } 
     return Response(content) 

Soru 5: bir potansiyel döngü delikleri Django istirahat Framework ile çalışırken varsayılan izinleri olduğunu kurulum dan Örneğin, uygulamanızın ayarları Tüm izinleri, özellikle izin sınıflarını geçersiz kılmadığınız sürece, tüm görünümleri herkese açık hale getirin.

1

Kabul edilen yanıtın, belirteci oluşturan, ancak seri hale getirici/görünümde nasıl entegre edileceğini gösteren bir kod yoktur.

token = serializers.SerializerMethodField() 

def get_token(self, obj): 
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER 
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER 

    payload = jwt_payload_handler(obj) 
    token = jwt_encode_handler(payload) 
    return token 

Sonra Meta.fields için token alan eklemek: Biz zaten SerializerMethodField oluşturabilir Bunu yapmak ve belirteç orada oluşturmak için jwt_encode_handler varsa emin değil manuel jwt.encode iyi modern bir yol olduğunu. Tam örnek için bkz. here