@@ -82,13 +82,26 @@ class SignInSerializer(
8282 write_only = True ,
8383 )
8484
85- def validate (self , data ):
86- email = data .get ('email' )
87- password = data .get ('password' )
85+ def validate (self , attrs ):
86+ user = self .authenticate_user (attrs )
87+
88+ self .update_token_version (user )
89+
90+ data = super ().validate (attrs )
91+
92+ refresh = rest_framework_simplejwt .tokens .RefreshToken (data ['refresh' ])
93+
94+ self .invalidate_previous_tokens (user , refresh ['jti' ])
95+
96+ return data
97+
98+ def authenticate_user (self , attrs ):
99+ email = attrs .get ('email' )
100+ password = attrs .get ('password' )
88101
89102 if not email or not password :
90- raise rest_framework .serializers .ValidationError (
91- {'status ' : 'error' , 'message' : 'Both fields are required. ' },
103+ raise rest_framework .exceptions .ValidationError (
104+ {'detail ' : 'Both email and password are required' },
92105 code = 'required' ,
93106 )
94107
@@ -97,55 +110,26 @@ def validate(self, data):
97110 email = email ,
98111 password = password ,
99112 )
100- if not user :
101- raise rest_framework .exceptions .AuthenticationFailed (
102- {'status' : 'error' , 'message' : 'Invalid email or password.' },
103- code = 'authorization' ,
104- )
105113
106- authenticate_kwargs = {
107- self .username_field : data [self .username_field ],
108- 'password' : data ['password' ],
109- }
110- try :
111- authenticate_kwargs ['request' ] = self .context ['request' ]
112- except KeyError :
113- pass
114-
115- self .user = django .contrib .auth .authenticate (** authenticate_kwargs )
116-
117- if not getattr (self .user , 'is_active' , None ):
114+ if not user or not user .is_active :
118115 raise rest_framework .exceptions .AuthenticationFailed (
119- self . error_messages [ 'no_active_account' ] ,
120- 'no_active_account ' ,
116+ { 'detail' : 'Invalid credentials or inactive account' } ,
117+ code = 'authentication_failed ' ,
121118 )
122119
123- self .user .token_version += 1
124- self .user .save ()
120+ return user
125121
126- refresh = self .get_token (self .user )
127- data = {
128- 'refresh' : str (refresh ),
129- 'access' : str (refresh .access_token ),
130- }
131-
132- current_jti = refresh ['jti' ]
133-
134- tokens_qs = tb_models .OutstandingToken .objects .filter (
135- user = self .user ,
136- )
137-
138- outstanding_tokens = tokens_qs .exclude (jti = current_jti )
122+ def invalidate_previous_tokens (self , user , current_jti ):
123+ outstanding_tokens = tb_models .OutstandingToken .objects .filter (
124+ user = user ,
125+ ).exclude (jti = current_jti )
139126
140127 for token in outstanding_tokens :
141- (
142- tb_models .BlacklistedToken .objects .get_or_create (
143- token = token ,
144- )
145- )
128+ tb_models .BlacklistedToken .objects .get_or_create (token = token )
146129
147- data ['token_version' ] = self .user .token_version
148- return data
130+ def update_token_version (self , user ):
131+ user .token_version += 1
132+ user .save ()
149133
150134 def get_token (self , user ):
151135 token = super ().get_token (user )
0 commit comments