2016-07-28 12 views
1

認証のためにJWTをユーザーログインAPIに追加したいとします。このコードに従って私は何をすべきですか?私はmanuelによってトークンを作成します。しかし、それは変化しなければならない。どうすれば統合できますか?ありがとうございました。Django Rest FrameworkでのユーザーログインへのJson Web Tokenの作成方法?

シリアライザ

class UserLoginSerializer(ModelSerializer): 
token = CharField(allow_blank=True, read_only=True) 

class Meta: 
    model = User 
    fields = [ 
     'username', 
     'password', 
     'token', 
    ] 
    extra_kwargs = {"password": 
         {"write_only": True} 
        } 

def validate(self, data): 
    user_obj = None 
    username = data.get("username", None) 
    password = data["password"] 
    if not username: 
     raise ValidationError("Kullanıcı adı gerekli.") 

    user = User.objects.filter(
     Q(username=username) 
     ).distinct() 
    user = user.exclude(email__isnull=True).exclude(email__iexact='') 
    if user.exists() and user.count() == 1: 
     user = user.first() 
    else: 
     raise ValidationError("Böyle bir Kullanıcı Adı yoktur.") 

    if user_obj: 
     if not user_obj.check_password(password): 
      raise ValidationError("Tekrar deneyiniz.") 
    data["token"] = "asdasdasdasd" 
    return data 

ビュー

class UserLoginAPIView(APIView): 
permission_classes = [AllowAny] 
serializer_class = UserLoginSerializer 

def post(self, request, *args, **kwargs): 
    data = request.data 
    serializer = UserLoginSerializer(data=data) 
    if serializer.is_valid(raise_exception=True): 
     new_data = serializer.data 
     return Response(new_data, status=HTTP_200_OK) 
    return Response(serializer.errors, status=HTTP_400_BAD_REQUEST) 

設定

REST_FRAMEWORK = { 
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated', 
), 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.SessionAuthentication', 
    'rest_framework.authentication.BasicAuthentication', 
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 
), 

}

のURL

urlpatterns = [ 
url(r'^login/$', UserLoginAPIView.as_view(), name='login'), 
url(r'^api-token-auth/', obtain_jwt_token), 
url(r'^api-token-refresh/', refresh_jwt_token), 
url(r'^api-token-verify/', verify_jwt_token), 
url(r'^register/$', UserCreateAPIView.as_view(), name='register'), 

]

+0

このパッケージを調べましたか? https://github.com/GetBlimp/django-rest-framework-jwt – jape

+0

はい、私はすでにこのパッケージを見てきました。しかし、私は正確にどのように変更することができないのか分かりません。それについての例があれば教えてください。ありがとうございました – bysucpmeti

答えて

2

自動的に、ユーザーログインに「rest_framework_jwt.views.obtain_jwt_token」を使用できます。トークンを作成します。そしてRestrictedViewに行き、認証のためにトークンを使う必要があります。基本的に、それだけです。

0

あなたはこのような何かをやって試すことができます:

まず、pip install djangorestframework-jwtをインストールしてください。

settings.py:

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 
    ), 
} 

def jwt_response_payload_handler(token, user, request, *args, **kwargs): 
    data = { 
     "token": token, 
     "user": "{}".format(user.id), 
     "userid": user.id, 
     "active": user.is_active 
    } 
    return data 

JWT_AUTH = { 
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'jwt_response_payload_handler', 
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=180), 
    'JWT_ALLOW_REFRESH': False, 
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30), 
    'JWT_SECRET_KEY': 'generate_a_secret_key', 
} 

serializers.py:

from rest_framework import serializers 
from rest_framework.authtoken.models import Token 

class TokenSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Token 
     fields = ('key',) 

どこでもauthenication_classesはあなたが追加したいと思うでしょう、あなたのビューに適用されます。

from rest_framework_jwt.authentication import JSONWebTokenAuthentication 

私はあなたを助けることを願っています!

0

PyJWT

ステップと呼ばれるライブラリを使用してPythonでJWTを使用する最も簡単な方法の詳細:

  1. はviews.pyでJWT($ pip install PyJWT
  2. のピップパッケージをインストールする:

    import jwt 
    
  3. が続いて以下のように は、それを使用し、あなたがトークンを生成したい場所を、後藤

    encoded = jwt.encode({'email': uemail, 'phone':phone}, 'MySecretKey', algorithm='HS256') 
    
  4. 印刷または応答でエンコードされた変数を追加し、応答が得られます。

関連する問題