theloftstore/app/Http/Controllers/Api/Auth/AuthController.php
2025-02-26 08:57:46 +01:00

78 lines
2.0 KiB
PHP

<?php
namespace Vanguard\Http\Controllers\Api\Auth;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
use Vanguard\Events\User\LoggedIn;
use Vanguard\Events\User\LoggedOut;
use Vanguard\Http\Controllers\Api\ApiController;
use Vanguard\Http\Requests\Auth\ApiLoginRequest;
use Vanguard\User;
class AuthController extends ApiController
{
public function __construct()
{
$this->middleware('guest')->only('login');
$this->middleware('auth')->only('logout');
}
/**
* Attempt to log the user in and generate unique JWT token on successful authentication.
*
* @throws BindingResolutionException
* @throws ValidationException
*/
public function token(ApiLoginRequest $request): JsonResponse
{
$user = $this->findUser($request);
if ($user->isBanned()) {
return $this->errorUnauthorized(trans('auth.banned'));
}
Auth::setUser($user);
event(new LoggedIn);
return $this->respondWithArray([
'token' => $user->createToken($request->device_name)->plainTextToken,
]);
}
/**
* Find the user instance from the API request.
*
* @throws BindingResolutionException
* @throws ValidationException
*/
private function findUser(ApiLoginRequest $request): ?User
{
$user = User::where($request->getCredentials())->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'username' => [trans('auth.failed')],
]);
}
return $user;
}
/**
* Logout user and invalidate token.
*/
public function logout(): JsonResponse
{
event(new LoggedOut);
auth()->user()->currentAccessToken()->delete();
return $this->respondWithSuccess();
}
}