A autenticação com tokens em uma API RESTful é um método seguro e eficiente para garantir que os usuários autenticados tenham acesso a recursos específicos em seu aplicativo Laravel. O Laravel oferece suporte nativo à autenticação por tokens, permitindo que você implemente esse mecanismo rapidamente em sua API.
Aqui estão os passos para configurar a autenticação com tokens em uma API RESTful usando Laravel, juntamente com exemplos:
Passo 1: Configuração do projeto Laravel Certifique-se de ter um projeto Laravel existente configurado para criar uma API RESTful. Caso não tenha, você pode criar um novo projeto executando o seguinte comando:
composer create-project --prefer-dist laravel/laravel nome-do-projeto
cd nome-do-projeto
Passo 2: Configuração do banco de dados
Verifique se você tem um banco de dados configurado em seu arquivo .env e execute as migrações para criar a tabela de usuários usando o seguinte comando:
php artisan migrate
Passo 3: Criação do Controller para Autenticação Vamos criar um Controller para lidar com a autenticação. Execute o seguinte comando para gerar o Controller:
php artisan make:controller AuthController
Passo 4: Implementação da Autenticação por Tokens
Abra o arquivo AuthController.php criado anteriormente em app/Http/Controllers/AuthController.php e implemente os métodos necessários para autenticação por tokens. Vamos usar tokens JWT (JSON Web Tokens) para isso. Certifique-se de que você tenha o pacote tymon/jwt-auth instalado em seu projeto.
composer require tymon/jwt-auth
php artisan vendor:publish --provider="Tymon\\\\JWTAuth\\\\Providers\\\\LaravelServiceProvider"
php artisan jwt:secret
AuthController.php, adicione os seguintes métodos:<?php
namespace App\\\\Http\\\\Controllers;
use Illuminate\\\\Http\\\\Request;
use Illuminate\\\\Support\\\\Facades\\\\Auth;
use App\\\\Models\\\\User;
class AuthController extends Controller
{
// Registro de usuário
public function register(Request $request)
{
$this->validate($request, [
'name' => 'required|string',
'email' => 'required|string|email|unique:users',
'password' => 'required|string|min:6',
]);
$user = new User([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),
]);
$user->save();
return response()->json(['message' => 'Usuário registrado com sucesso!'], 201);
}
// Autenticação e geração do token
public function login(Request $request)
{
$this->validate($request, [
'email' => 'required|string|email',
'password' => 'required|string',
]);
$credentials = $request->only('email', 'password');
if (!Auth::attempt($credentials)) {
return response()->json(['message' => 'Credenciais inválidas'], 401);
}
$user = Auth::user();
$token = $user->createToken('MyApp')->accessToken;
return response()->json(['token' => $token], 200);
}
// Logout (invalidação do token)
public function logout(Request $request)
{
$request->user()->token()->revoke();
return response()->json(['message' => 'Logout realizado com sucesso!'], 200);
}
}
Passo 5: Configuração das Rotas
Agora, vamos configurar as rotas em routes/api.php para acessar os métodos do AuthController:
<?php
use Illuminate\\\\Http\\\\Request;
use Illuminate\\\\Support\\\\Facades\\\\Route;
use App\\\\Http\\\\Controllers\\\\AuthController;
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
Route::group(['middleware' => 'auth:api'], function () {
// Rotas protegidas que exigem autenticação por token
Route::post('logout', [AuthController::class, 'logout']);
});
Testando a autenticação Agora, você pode usar ferramentas como o Postman ou o Insomnia para testar a autenticação com tokens.
Faça uma requisição POST para /api/register para criar um novo usuário, enviando um JSON com os dados de registro do usuário.
Faça uma requisição POST para /api/login com as credenciais do usuário para obter o token.
Use o token recebido nas requisições para rotas protegidas, incluindo-o no cabeçalho da requisição:
Authorization: Bearer {seu-token-aqui}
Para fazer logout, faça uma requisição POST para /api/logout com o token no cabeçalho.