Sanctum, Passport, Socialite trong Laravel
# 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']);
}
}
<?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']);
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');
}
}