💻 Exemplos: Capítulo 09: Autenticação de API com Laravel Sanctum (Bearer Tokens)
Especialização em Backend com PHP & Laravel • Demonstrações Práticas Compiláveis
💻 Exemplo 1 — Fluxo Completo de Login com Sanctum
<?php
// app/Http/Controllers/Api/AuthController.php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
class AuthController extends Controller
{
public function login(Request $request)
{
$credenciais = $request->validate([
'email' => 'required|email',
'password' => 'required|string',
]);
$user = User::where('email', $credenciais['email'])->first();
if (!$user || !Hash::check($credenciais['password'], $user->password)) {
throw ValidationException::withMessages([
'email' => ['Credenciais inválidas.'],
]);
}
$token = $user->createToken('api-token', ['produtos:read', 'produtos:write'])->plainTextToken;
return response()->json([
'token' => $token,
'token_type' => 'Bearer',
'user' => $user->only('id', 'name', 'email'),
]);
}
public function logout(Request $request)
{
$request->user()->currentAccessToken()->delete();
return response()->json(['mensagem' => 'Sessão encerrada.']);
}
public function logoutTodosDispositivos(Request $request)
{
$request->user()->tokens()->delete();
return response()->json(['mensagem' => 'Todos os acessos foram revogados.']);
}
}
💻 Exemplo 2 — Rotas Protegidas e Verificação de Abilities
<?php
// routes/api.php
use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\ProdutoController;
use Illuminate\Support\Facades\Route;
Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:sanctum')->group(function () {
Route::get('/user', fn (Request $request) => $request->user());
Route::post('/logout', [AuthController::class, 'logout']);
Route::post('/logout-all', [AuthController::class, 'logoutTodosDispositivos']);
Route::apiResource('produtos', ProdutoController::class);
});
<?php
// app/Http/Controllers/Api/ProdutoController.php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ProdutoController extends Controller
{
public function store(Request $request)
{
if (!$request->user()->tokenCan('produtos:write')) {
return response()->json(['erro' => 'Token sem permissão de escrita'], 403);
}
$produto = $request->user()->produtos()->create($request->validate([
'nome' => 'required|string|max:255',
'preco' => 'required|numeric|min:0',
]));
return response()->json($produto, 201);
}
}
💻 Exemplo 3 — Configuração de Expiração de Token
<?php
// config/sanctum.php (trecho relevante)
return [
'expiration' => 60 * 24 * 7, // tokens expiram em 7 dias (minutos)
'guard' => ['web'],
'middleware' => [
'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
],
];