🎫

Laravel Sanctum

Cài đặt Sanctum (API Tokens)

# Laravel 11+ đã có sẵn Sanctum
# Publish config nếu cần
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

# Run migration
php artisan migrate
<?php
// app/Models/User.php
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}

// app/Http/Controllers/AuthController.php
namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8|confirmed',
        ]);

        $user = User::create([
            'name' => $validated['name'],
            'email' => $validated['email'],
            'password' => Hash::make($validated['password']),
        ]);

        $token = $user->createToken('auth-token')->plainTextToken;

        return response()->json([
            'user' => $user,
            'token' => $token,
        ], 201);
    }

    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        $user = User::where('email', $request->email)->first();

        if (!$user || !Hash::check($request->password, $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['Thông tin đăng nhập không chính xác.'],
            ]);
        }

        // Revoke old tokens
        $user->tokens()->delete();
        
        $token = $user->createToken('auth-token', ['*'])->plainTextToken;

        return response()->json([
            'user' => $user,
            'token' => $token,
        ]);
    }

    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();
        
        return response()->json(['message' => 'Đã đăng xuất']);
    }
}

Token Abilities (Permissions)

<?php
// Tạo token với abilities cụ thể
$token = $user->createToken('api-token', [
    'posts:read',
    'posts:write',
    'comments:read'
])->plainTextToken;

// Kiểm tra ability
if ($request->user()->tokenCan('posts:write')) {
    // Có quyền tạo/sửa posts
}

// Middleware
Route::post('/posts', [PostController::class, 'store'])
    ->middleware(['auth:sanctum', 'ability:posts:write']);
💡 Best Practice: Sanctum phù hợp cho SPA và Mobile apps. Dùng Passport nếu cần OAuth2 đầy đủ.
🌐

Socialite (OAuth)

Đăng nhập với Google/GitHub

composer require laravel/socialite
<?php
// config/services.php
'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => env('GOOGLE_REDIRECT_URI'),
],

// routes/web.php
Route::get('/auth/google', [SocialController::class, 'redirectToGoogle']);
Route::get('/auth/google/callback', [SocialController::class, 'handleGoogleCallback']);

// app/Http/Controllers/SocialController.php
use Laravel\Socialite\Facades\Socialite;

class SocialController extends Controller
{
    public function redirectToGoogle()
    {
        return Socialite::driver('google')->redirect();
    }

    public function handleGoogleCallback()
    {
        $googleUser = Socialite::driver('google')->user();

        $user = User::updateOrCreate(
            ['email' => $googleUser->getEmail()],
            [
                'name' => $googleUser->getName(),
                'google_id' => $googleUser->getId(),
                'avatar' => $googleUser->getAvatar(),
                'password' => Hash::make(Str::random(24)),
            ]
        );

        Auth::login($user);

        return redirect()->intended('/dashboard');
    }
}
← Bài 2: Eloquent Bài 4: API Development →