2016-09-16 82 views
0

我不確定我是否正確理解它。我正在使用Django Rest Framework讓用戶登錄(顯然還有很多其他的事情)。在我的情況下,用戶從IOS應用程序登錄後,我想獲取一個令牌並使用該令牌,因此只要令牌有效,它們就只需登錄一次。在Django休息框架登錄後獲取JWT令牌

我得到了兩個部分的工作,使用用戶名或電子郵件登錄和獲取令牌curl工作(如在JWT手冊顯示)。

如何組合這兩個,所以如果登錄成功,在登錄響應之前,我會調用JWT,創建令牌,然後將其返回給登錄響應,並且應用程序將獲得令牌與響應。

我不確定它是否應該這樣做,我想在一次調用API的時候這樣做,而不是兩次。這兩個看起來很簡單,但任何不需要的呼叫都不應該在我眼中完成。

class UserLoginSerializer(ModelSerializer): 
    user_id = IntegerField(read_only=True) 
    token = CharField(allow_blank=True, read_only=True) 
    username = CharField(required=False, allow_blank= True) 
    email = EmailField(label='Email Address', required=False, allow_blank= True) 
    class Meta: 
     model = User 
     fields = [ 
      'user_id', 
      'username', 
      'email', 
      'password', 
      'token', 
     ] 
     extra_kwargs = {"password": {"write_only": True}} 

    def validate(self, data): 
     user_obj = None 
     email = data.get("email", None) 
     username = data.get("username", None) 
     password = data["password"] 

     if not email and not username: 
      raise ValidationError("A username or email is required to login.") 

     user = User.objects.filter(
       Q(email=email) | 
       Q(username=username) 
       ).distinct() 
     user = user.exclude(email__isnull=True).exclude(email__iexact='') 

     if user.exists() and user.count() == 1: 
      user_obj = user.first() 
     else: 
      raise ValidationError("This username/email is not valid!") 

     if user_obj: 
      if not user_obj.check_password(password): 
       raise ValidationError("Incorrect credentials, please try again!") 


     data["token"] = "SOME RANDOM TOKEN" 
     data["user_id"] = user_obj.id 

     return data 

我在數據恢復的道理,所以我需要的是一種方式來獲得從JWT令牌之前,然後返回數據,就像我在這裏做。

感謝

+0

你使用jwt視圖嗎? – arcegk

+0

對不起,我不認爲我理解這個問題....你的意思是Django rest framework JWT?什麼意見? Django有一個名爲「REST框架JWT Auth」的框架,我正在使用它,它爲你實現標記化,稱爲「curl -X POST -d」username = admin&password = abc123「http:// localhost:8000/api-token-auth /「將創建並返回令牌,然後您可以將令牌從客戶端來回發送到服務器......我需要從django rest框架中調用該令牌,而不是在IOS應用程序中創建是一種做到這一點的方法,10倍 – Erez

回答

0

你不應該這樣做,因爲django-rest-framework JWT爲您管理的所有令牌。

只需:

from rest_framework_jwt.views import obtain_jwt_token 

urlpatterns = [ 
    # ... 

    url(r'^api-token-auth/', obtain_jwt_token), 
] 

你將被允許獲得JWT。

另外,您可以在創建/登錄用戶後在settings.py文件中指定JWT_PAYLOAD_HANDLER來設置自定義用戶負載。