2
2
3
3
namespace App \Http \Controllers ;
4
4
5
+ use App \Helpers \Utils ;
5
6
use App \Models \User ;
6
7
use App \Models \UserProvider ;
7
8
use Illuminate \Auth \Events \PasswordReset ;
10
11
use Illuminate \Http \JsonResponse ;
11
12
use Illuminate \Http \RedirectResponse ;
12
13
use Illuminate \Http \Request ;
13
- use Illuminate \Support \Facades \Crypt ;
14
+ use Illuminate \Support \Facades \Auth ;
14
15
use Illuminate \Support \Facades \Hash ;
15
16
use Illuminate \Support \Facades \Password ;
16
17
use Illuminate \Support \Str ;
@@ -112,23 +113,19 @@ public function callback(Request $request, string $provider): View
112
113
$ user = $ userProvider ->user ;
113
114
}
114
115
115
- $ token = $ user ->createDeviceToken (
116
- device: $ request ->deviceName (),
117
- ip: $ request ->ip (),
118
- remember: true
119
- );
116
+ Auth::login ($ user , true );
117
+ $ request ->session ()->regenerate ();
120
118
121
119
return view ('oauth ' , [
122
120
'message ' => [
123
121
'ok ' => true ,
124
122
'provider ' => $ provider ,
125
- 'token ' => $ token ,
126
123
],
127
124
]);
128
125
}
129
126
130
127
/**
131
- * Generate sanctum token on successful login
128
+ * Login user
132
129
* @throws ValidationException
133
130
*/
134
131
public function login (Request $ request ): JsonResponse
@@ -138,23 +135,16 @@ public function login(Request $request): JsonResponse
138
135
'password ' => ['required ' , 'string ' ],
139
136
]);
140
137
141
- $ user = User::select (['id ' , 'password ' ])->where ('email ' , $ request ->email )->first ();
142
-
143
- if (!$ user || !Hash::check ($ request ->password , $ user ->password )) {
138
+ if (!Auth::attempt ($ request ->only ('email ' , 'password ' ), $ request ->remember )) {
144
139
throw ValidationException::withMessages ([
145
140
'email ' => __ ('auth.failed ' ),
146
141
]);
147
142
}
148
143
149
- $ token = $ user ->createDeviceToken (
150
- device: $ request ->deviceName (),
151
- ip: $ request ->ip (),
152
- remember: $ request ->input ('remember ' , false )
153
- );
144
+ $ request ->session ()->regenerate ();
154
145
155
146
return response ()->json ([
156
147
'ok ' => true ,
157
- 'token ' => $ token ,
158
148
]);
159
149
}
160
150
@@ -163,7 +153,7 @@ public function login(Request $request): JsonResponse
163
153
*/
164
154
public function logout (Request $ request ): JsonResponse
165
155
{
166
- $ request -> user ()-> currentAccessToken ()-> delete ();
156
+ Auth:: logout ();
167
157
168
158
return response ()->json ([
169
159
'ok ' => true ,
@@ -226,7 +216,7 @@ public function resetPassword(Request $request): JsonResponse
226
216
{
227
217
$ request ->validate ([
228
218
'token ' => ['required ' ],
229
- 'email ' => ['required ' , 'email ' , 'exists: ' . User::class],
219
+ 'email ' => ['required ' , 'email ' , 'exists: ' . User::class],
230
220
'password ' => ['required ' , 'confirmed ' , Rules \Password::defaults ()],
231
221
]);
232
222
@@ -287,7 +277,7 @@ public function verificationNotification(Request $request): JsonResponse
287
277
'email ' => ['required ' , 'email ' ],
288
278
]);
289
279
290
- $ user = $ request ->user ()?: User::where ('email ' , $ request ->email )->whereNull ('email_verified_at ' )->first ();
280
+ $ user = $ request ->user () ?: User::where ('email ' , $ request ->email )->whereNull ('email_verified_at ' )->first ();
291
281
292
282
abort_if (!$ user , 400 );
293
283
@@ -306,22 +296,19 @@ public function devices(Request $request): JsonResponse
306
296
{
307
297
$ user = $ request ->user ();
308
298
309
- $ devices = $ user ->tokens ()
310
- ->select ('id ' , 'name ' , 'ip ' , 'last_used_at ' )
311
- ->orderBy ('last_used_at ' , 'DESC ' )
312
- ->get ();
313
-
314
- $ currentToken = $ user ->currentAccessToken ();
315
-
316
- foreach ($ devices as $ device ) {
317
- $ device ->hash = Crypt::encryptString ($ device ->id );
299
+ $ currentSessionId = $ request ->session ()->getId ();
318
300
319
- if ($ currentToken ->id === $ device ->id ) {
320
- $ device ->is_current = true ;
321
- }
301
+ $ devices = $ user ->sessions ()
302
+ ->select (['id as key ' , 'ip_address as ip ' , 'user_agent as name ' , 'last_activity ' ])
303
+ ->orderBy ('last_activity ' , 'DESC ' )
304
+ ->get ()
305
+ ->map (function ($ device ) use ($ currentSessionId ) {
306
+ $ device ->is_current = $ currentSessionId === $ device ->key ;
307
+ $ device ->name = Utils::getDeviceNameFromDetector (Utils::getDeviceDetectorByUserAgent ($ device ->name ));
308
+ $ device ->last_used_at = now ()->parse ($ device ->last_activity );
322
309
323
- unset( $ device-> id ) ;
324
- }
310
+ return $ device ;
311
+ });
325
312
326
313
return response ()->json ([
327
314
'ok ' => true ,
@@ -330,21 +317,16 @@ public function devices(Request $request): JsonResponse
330
317
}
331
318
332
319
/**
333
- * Revoke token by id
320
+ * Disconnect device by id
334
321
*/
335
322
public function deviceDisconnect (Request $ request ): JsonResponse
336
323
{
337
324
$ request ->validate ([
338
- 'hash ' => 'required ' ,
325
+ 'key ' => 'required|size:40 ' ,
339
326
]);
340
327
341
328
$ user = $ request ->user ();
342
-
343
- $ id = (int ) Crypt::decryptString ($ request ->hash );
344
-
345
- if (!empty ($ id )) {
346
- $ user ->tokens ()->where ('id ' , $ id )->delete ();
347
- }
329
+ $ user ->sessions ()->where ('id ' , $ request ->key )->delete ();
348
330
349
331
return response ()->json ([
350
332
'ok ' => true ,
0 commit comments