@@ -66,6 +66,8 @@ def create(self, validated_data):
6666 other = validated_data ['other' ],
6767 password = validated_data ['password' ],
6868 )
69+ user .token_version += 1
70+ user .save ()
6971 return user
7072 except django .core .exceptions .ValidationError as e :
7173 raise rest_framework .serializers .ValidationError (e .messages )
@@ -80,13 +82,26 @@ class SignInSerializer(
8082 write_only = True ,
8183 )
8284
83- def validate (self , data ):
84- email = data .get ('email' )
85- 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' )
86101
87102 if not email or not password :
88- raise rest_framework .serializers .ValidationError (
89- {'status ' : 'error' , 'message' : 'Both fields are required. ' },
103+ raise rest_framework .exceptions .ValidationError (
104+ {'detail ' : 'Both email and password are required' },
90105 code = 'required' ,
91106 )
92107
@@ -95,55 +110,26 @@ def validate(self, data):
95110 email = email ,
96111 password = password ,
97112 )
98- if not user :
99- raise rest_framework .exceptions .AuthenticationFailed (
100- {'status' : 'error' , 'message' : 'Invalid email or password.' },
101- code = 'authorization' ,
102- )
103113
104- authenticate_kwargs = {
105- self .username_field : data [self .username_field ],
106- 'password' : data ['password' ],
107- }
108- try :
109- authenticate_kwargs ['request' ] = self .context ['request' ]
110- except KeyError :
111- pass
112-
113- self .user = django .contrib .auth .authenticate (** authenticate_kwargs )
114-
115- if not getattr (self .user , 'is_active' , None ):
114+ if not user or not user .is_active :
116115 raise rest_framework .exceptions .AuthenticationFailed (
117- self . error_messages [ 'no_active_account' ] ,
118- 'no_active_account ' ,
116+ { 'detail' : 'Invalid credentials or inactive account' } ,
117+ code = 'authentication_failed ' ,
119118 )
120119
121- self .user .token_version += 1
122- self .user .save ()
120+ return user
123121
124- refresh = self .get_token (self .user )
125- data = {
126- 'refresh' : str (refresh ),
127- 'access' : str (refresh .access_token ),
128- }
129-
130- current_jti = refresh ['jti' ]
131-
132- tokens_qs = tb_models .OutstandingToken .objects .filter (
133- user = self .user ,
134- )
135-
136- 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 )
137126
138127 for token in outstanding_tokens :
139- (
140- tb_models .BlacklistedToken .objects .get_or_create (
141- token = token ,
142- )
143- )
128+ tb_models .BlacklistedToken .objects .get_or_create (token = token )
144129
145- data ['token_version' ] = self .user .token_version
146- return data
130+ def update_token_version (self , user ):
131+ user .token_version += 1
132+ user .save ()
147133
148134 def get_token (self , user ):
149135 token = super ().get_token (user )
0 commit comments