# API Login Fix Report - Sanctum Authentication

## Vấn đề
**Lỗi:** `Method Illuminate\Auth\RequestGuard::attempt does not exist`

**Nguyên nhân:** 
- Code đang sử dụng JWT syntax (`auth('api')->attempt()`, `factory()->getTTL()`)
- Nhưng project chỉ cài **Laravel Sanctum**, không có JWT package
- Sanctum sử dụng token-based authentication, không hỗ trợ phương thức `attempt()`

## Giải pháp đã thực hiện

### 1. Cập nhật hàm `login()` trong UserController
**File:** `app/Http/Controllers/Api/UserController.php`

**Thay đổi:**
```php
// ❌ CŨ - Sử dụng JWT syntax (sai)
if (!$token = auth('api')->attempt($credentials)) {
    // ...
}
$user = auth('api')->user();
'expires_in' => auth('api')->factory()->getTTL() * 60

// ✅ MỚI - Sử dụng Sanctum đúng cách
$user = User::where('phone', $request->input('phone'))
    ->where('status', 1)
    ->first();

if (!$user || !Hash::check($request->input('pass'), $user->password)) {
    // Trả về lỗi
}

$token = $user->createToken('api-token')->plainTextToken;
'expires_in' => null // Sanctum không có expiration mặc định
```

**Cách hoạt động:**
1. Tìm user theo số điện thoại và status = 1
2. Kiểm tra password bằng `Hash::check()`
3. Tạo token mới với `$user->createToken()`
4. Trả về token dạng plain text để client sử dụng

### 2. Chạy migration Sanctum
**Command:**
```bash
php artisan migrate --path=database/migrations/2025_02_25_030836_create_personal_access_tokens_table.php --force
```

**Kết quả:** Tạo bảng `nk_personal_access_tokens` để lưu trữ API tokens

## Cách sử dụng API sau khi fix

### 1. Login Request
```http
POST /api/login
Content-Type: application/json

{
    "phone": "0123456789",
    "pass": "password123",
    "fcm_token": "optional_fcm_token",
    "token_user": "optional_device_token"
}
```

### 2. Login Response (Success)
```json
{
    "status": 1,
    "message": "success",
    "data": {
        "access_token": "1|abcdef123456...",
        "token_type": "bearer",
        "expires_in": null,
        "user": {
            "id": 1,
            "username": "John Doe",
            "phone": "0123456789",
            ...
        }
    }
}
```

### 3. Sử dụng token cho các API khác
**Header:**
```http
Authorization: Bearer 1|abcdef123456...
```

**Ví dụ:**
```http
GET /api/user
Authorization: Bearer 1|abcdef123456...
```

## Các thay đổi khác trong hàm login()

✅ **Giữ nguyên tất cả logic nghiệp vụ:**
- Cập nhật `fcm_token`
- Cập nhật `token_user`
- Tăng `tich_diem` khi lần đầu cài app (`is_install = 0`)
- Xóa `de_active_time`
- Tăng `app_total_visits` counter

## Kiểm tra token trong các API khác

Các API endpoint khác đang sử dụng `auth('api')->user()` sẽ hoạt động bình thường với Sanctum:

```php
// ✅ Hoạt động tốt với Sanctum
$user = auth('api')->user();

// ✅ Middleware cũng hoạt động
Route::middleware('auth:sanctum')->group(function () {
    // API routes
});
```

## Token Management

### Xóa token khi logout (nếu cần)
```php
// Xóa token hiện tại
$request->user()->currentAccessToken()->delete();

// Xóa tất cả tokens của user
$request->user()->tokens()->delete();
```

### Token expiration (optional)
Sanctum tokens mặc định không hết hạn. Nếu muốn thêm expiration, cấu hình trong `config/sanctum.php`:

```php
'expiration' => 60, // Token hết hạn sau 60 phút
```

## Testing Checklist

- [x] Migration `personal_access_tokens` đã chạy thành công
- [x] Hàm `login()` đã được cập nhật sử dụng Sanctum
- [ ] Test API login với credentials hợp lệ
- [ ] Test API login với credentials không hợp lệ
- [ ] Test sử dụng token để gọi các API khác (GET /api/user)
- [ ] Test fcm_token và token_user được cập nhật đúng
- [ ] Test tích điểm khi lần đầu cài app

## Files đã thay đổi

1. ✅ `app/Http/Controllers/Api/UserController.php`
   - Cập nhật hàm `login()` sử dụng Sanctum
   - Thay thế `auth('api')->attempt()` bằng manual authentication
   - Thay thế `factory()->getTTL()` bằng `null`

2. ✅ `database/migrations/2025_02_25_030836_create_personal_access_tokens_table.php`
   - Migration đã chạy, tạo bảng `nk_personal_access_tokens`

3. ✅ `config/auth.php` (từ fix trước)
   - Đã có cấu hình `api` guard với Sanctum driver

## Lưu ý quan trọng

⚠️ **Token format khác với JWT:**
- JWT: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...`
- Sanctum: `1|abcdef123456...` (format: `{token_id}|{plain_token}`)

⚠️ **Client app cần cập nhật:**
- Nếu client app đang parse JWT token, cần cập nhật để xử lý Sanctum token
- Token được lưu và gửi giống nhau: `Authorization: Bearer {token}`

⚠️ **Không có auto-refresh:**
- JWT có thể tự động refresh token
- Sanctum cần implement logic refresh token riêng nếu cần

## Status
✅ **HOÀN THÀNH** - API login đã được fix và sử dụng Sanctum authentication đúng cách.

---
**Ngày:** 2026-05-06
**Lỗi:** Method Illuminate\Auth\RequestGuard::attempt does not exist
**Giải pháp:** Chuyển từ JWT syntax sang Sanctum token-based authentication
