114 lines
3.2 KiB
PHP
114 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Auth\ApiLoginRequest;
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Validation\ValidationException;
|
|
|
|
class AuthController extends Controller
|
|
{
|
|
/**
|
|
* Handle API login using Sanctum tokens
|
|
*/
|
|
public function login(ApiLoginRequest $request)
|
|
{
|
|
$data = $request->validated();
|
|
$identifier = $data['identifier'];
|
|
$password = $data['password'];
|
|
$device = $data['device_name'] ?? $request->header('User-Agent') ?? 'api-client';
|
|
|
|
// Find user by email or username
|
|
$user = User::where('email', $identifier)
|
|
->orWhere('username', $identifier)
|
|
->first();
|
|
|
|
if (!$user || !Hash::check($password, $user->password)) {
|
|
throw ValidationException::withMessages([
|
|
'identifier' => ['Email/username atau password yang diberikan salah.'],
|
|
]);
|
|
}
|
|
|
|
// Delete existing tokens for this device to prevent token accumulation
|
|
$user->tokens()->where('name', $device)->delete();
|
|
|
|
// Create new token
|
|
$token = $user->createToken($device)->plainTextToken;
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Login berhasil',
|
|
'token' => $token,
|
|
'token_type' => 'Bearer',
|
|
'user' => [
|
|
'id' => $user->id,
|
|
'name' => $user->name,
|
|
'email' => $user->email,
|
|
'username' => $user->username,
|
|
'roles' => $user->getRoleNames(),
|
|
'permissions' => $user->getAllPermissions()->pluck('name'),
|
|
],
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Get authenticated user information
|
|
*/
|
|
public function me(Request $request)
|
|
{
|
|
$user = $request->user();
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'user' => [
|
|
'id' => $user->id,
|
|
'name' => $user->name,
|
|
'email' => $user->email,
|
|
'username' => $user->username,
|
|
'roles' => $user->getRoleNames(),
|
|
'permissions' => $user->getAllPermissions()->pluck('name'),
|
|
],
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Logout current API session (revoke current token)
|
|
*/
|
|
public function logout(Request $request)
|
|
{
|
|
$user = $request->user();
|
|
|
|
// Revoke current access token
|
|
if ($user && method_exists($user, 'currentAccessToken')) {
|
|
$token = $user->currentAccessToken();
|
|
if ($token) {
|
|
$token->delete();
|
|
}
|
|
}
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Logout berhasil'
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Logout from all devices (revoke all tokens)
|
|
*/
|
|
public function logoutAll(Request $request)
|
|
{
|
|
$user = $request->user();
|
|
|
|
// Revoke all tokens for this user
|
|
$user->tokens()->delete();
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Logout dari semua perangkat berhasil'
|
|
]);
|
|
}
|
|
}
|