@@ -66,6 +66,8 @@ def create(self, validated_data):
66
66
other = validated_data ['other' ],
67
67
password = validated_data ['password' ],
68
68
)
69
+ user .token_version += 1
70
+ user .save ()
69
71
return user
70
72
except django .core .exceptions .ValidationError as e :
71
73
raise rest_framework .serializers .ValidationError (e .messages )
@@ -80,13 +82,26 @@ class SignInSerializer(
80
82
write_only = True ,
81
83
)
82
84
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' )
86
101
87
102
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' },
90
105
code = 'required' ,
91
106
)
92
107
@@ -95,55 +110,26 @@ def validate(self, data):
95
110
email = email ,
96
111
password = password ,
97
112
)
98
- if not user :
99
- raise rest_framework .exceptions .AuthenticationFailed (
100
- {'status' : 'error' , 'message' : 'Invalid email or password.' },
101
- code = 'authorization' ,
102
- )
103
113
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 :
116
115
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 ' ,
119
118
)
120
119
121
- self .user .token_version += 1
122
- self .user .save ()
120
+ return user
123
121
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 )
137
126
138
127
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 )
144
129
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 ()
147
133
148
134
def get_token (self , user ):
149
135
token = super ().get_token (user )
0 commit comments