Introdução
Neste tutorial, vamos explorar o framework Laravel para criar uma API RESTful robusta e escalável com autenticação JSON Web Token (JWT). A construção de APIs é uma habilidade essencial para desenvolvedores modernos, pois as aplicações têm se tornado cada vez mais dependentes da comunicação entre diferentes sistemas. Usaremos o Laravel, um dos frameworks PHP mais populares, que oferece ferramentas e funcionalidades poderosas para simplificar o desenvolvimento de aplicações. Você aprenderá desde a configuração do ambiente até a implementação da autenticação, endpoints e testes, garantindo que sua API esteja pronta para produção e mantenha a segurança necessária.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter o PHP, Composer e Laravel instalados em sua máquina. Também recomendamos um servidor local como o Laravel Valet ou o Homestead. Para verificar as versões instaladas, use os comandos `php -v` e `composer -v`. Caso não tenha o Laravel instalado, execute o comando `composer global require laravel/installer`.
commands# Verificar versões instaladas
php -v
composer -v
# Instalar o Laravel se necessário
composer global require laravel/installerCriação do Projeto Laravel
Utilize o comando do Laravel Installer para criar um novo projeto. Substitua ‘my-api’ pelo nome desejado para seu projeto. Após a criação, navegue até o diretório do projeto.
commands# Criar um novo projeto Laravel
laravel new my-api
# Navegar até o diretório do projeto
cd my-apiInstalação de Dependências para Autenticação JWT
Instale o pacote `tymon/jwt-auth` que fornece suporte para JWT em Laravel. Após a instalação, publique a configuração do pacote.
commands# Instalar o pacote JWT-Auth
composer require tymon/jwt-auth
# Publicar a configuração do pacote
php artisan vendor:publish --provider="Tymon\JWTAuth\JWTAuthServiceProvider"Configuração do Ambiente
Adicione a chave JWT no arquivo `.env` para configurar o JWT-Auth. Utilize o comando `jwt:secret` para gerar a chave secreta necessária.
commands# Gerar a chave secreta JWT
php artisan jwt:secret
# Adicionar a chave no arquivo .env
JWT_SECRET=your_generated_secret_keyCriação do Modelo `User`
Laravel já inclui um modelo `User` por padrão, mas você pode personalizá-lo conforme suas necessidades. Certifique-se de incluir a interface `JWTSubject` para implementar a autenticação JWT.
User.php<?php namespace App\Models; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; use Tymon\JWTAuth\Contracts\JWTSubject; class User extends Authenticatable implements JWTSubject { use Notifiable; protected $fillable = ['name', 'email', 'password']; public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomAttributes() { return ['name' => $this->name]; } }
Criação do Controlador `AuthController`
Implemente o controlador que lidará com a autenticação, fornecendo métodos para registro e login de usuários. O método de login deve retornar um token JWT ao usuário autenticado.
AuthController.php<?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Tymon\JWTAuth\JWTAuth; use Tymon\JWTAuth\Exceptions\JWTException; class AuthController extends Controller { public function register(Request $request) { $validator = Validator::make($request->all(), ['name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required']); if ($validator->fails()) { return response()->json($validator->errors(), 400); } $user = User::create(['name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password)]); return response()->json(['user' => $user], 201); } public function login(Request $request) { $credentials = $request->only('email', 'password'); try { if (!$token = JWTAuth::attempt($credentials)) { return response()->json(['error' => 'Unauthorized'], 401); } } catch (JWTException $e) { return response()->json(['error' => 'Could not create token'], 500); } return response()->json(compact('token')); } }
Definição das Rotas da API
Adicione as rotas para os métodos de login e registro no arquivo `routes/api.php`. Isso permitirá que o frontend acesse essas funcionalidades.
api.phpuse Illuminate\Support\Facades\Route; use App\Http\Controllers\AuthController; Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']);
Testando a API com Postman
Agora que sua API está configurada, você pode usar o Postman para testar suas rotas de registro e login. Certifique-se de enviar as requisições com o cabeçalho `Content-Type: application/json`.
curl_examples# Testar o registro de um usuário
curl -X POST http://localhost/api/register -H 'Content-Type: application/json' -d '{"name": "Teste", "email": "teste@mail.com", "password": "senha123"}'
# Testar o login
curl -X POST http://localhost/api/login -H 'Content-Type: application/json' -d '{"email": "teste@mail.com", "password": "senha123"}'Implementação de Testes Unitários
Use PHPUnit para criar testes de unidade, garantindo que as funcionalidades de autenticação sejam executadas corretamente. Crie um teste para o registro e login usando o comando `php artisan make:test AuthControllerTest`.
AuthControllerTest.php<?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Support\Facades\Hash; use App\Models\User; class AuthControllerTest extends TestCase { use WithFaker; public function testUserCanRegister() { $response = $this->postJson('/api/register', ['name' => 'Teste', 'email' => 'teste@mail.com', 'password' => 'senha123']); $response->assertStatus(201); } public function testUserCanLogin() { $user = User::create(['name' => 'Teste', 'email' => 'teste@mail.com', 'password' => Hash::make('senha123')]); $response = $this->postJson('/api/login', ['email' => 'teste@mail.com', 'password' => 'senha123']); $response->assertSuccessful(); } }
Executando a Aplicação e Testes
Use o Artisan para iniciar o servidor local e realizar os testes automatizados. O comando `php artisan serve` irá iniciar a aplicação. Para rodar os testes, utilize `php artisan test`.
commands# Iniciar o servidor local
php artisan serve
# Executar os testes unitários
php artisan test
Conclusão
Neste tutorial, você aprendeu a desenvolver uma API RESTful utilizando o Laravel, incluindo a configuração do ambiente, instalação das dependências, implementação de autenticação JWT, rotas e testes unitários. A construção de APIs seguras e escaláveis é crucial no desenvolvimento moderno e, com o Laravel, você simplificou muitas das complexidades envolvidas. Agora, você está pronto para expandir suas habilidades em PHP e Laravel, construindo aplicações ainda mais robustas e adaptadas às necessidades do mercado.