@@ -82,13 +82,26 @@ class SignInSerializer(
82
82
write_only = True ,
83
83
)
84
84
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' )
88
101
89
102
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' },
92
105
code = 'required' ,
93
106
)
94
107
@@ -97,55 +110,26 @@ def validate(self, data):
97
110
email = email ,
98
111
password = password ,
99
112
)
100
- if not user :
101
- raise rest_framework .exceptions .AuthenticationFailed (
102
- {'status' : 'error' , 'message' : 'Invalid email or password.' },
103
- code = 'authorization' ,
104
- )
105
113
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 :
118
115
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 ' ,
121
118
)
122
119
123
- self .user .token_version += 1
124
- self .user .save ()
120
+ return user
125
121
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 )
139
126
140
127
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 )
146
129
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 ()
149
133
150
134
def get_token (self , user ):
151
135
token = super ().get_token (user )
0 commit comments