Introdução
Neste tutorial, vamos aprender a construir uma API RESTful escalável utilizando Ruby on Rails, implementando a autenticação via JWT (JSON Web Tokens) e integrando testes automatizados com RSpec. Este guia é voltado para desenvolvedores que desejam aprofundar seus conhecimentos em Ruby on Rails e em práticas de desenvolvimento de APIs, abrangendo desde a configuração do ambiente até a realização de testes que garantam a qualidade do código. A API que construiremos será uma aplicação CRUD (Create, Read, Update, Delete) que permitirá gerenciar usuários, demonstrando as melhores práticas em segurança e testes. Você terá um conhecimento completo sobre como implementar e testar uma API em Ruby on Rails.
Etapas
Configuração do Ambiente de Desenvolvimento
Verifique se você tem o Ruby e o Rails instalados em seu sistema. O Ruby deve ser versão 2.7 ou superior e o Rails, versão 6 ou superior. Caso não tenha, você pode instalar usando o gerenciador de versões RVM ou rbenv. Também, instale o PostgreSQL, que será usado como banco de dados.
commands# Verifique as versões instaladas
ruby -v
rails -v
# Instalar PostgreSQL
sudo apt-get install postgresql postgresql-contribCriando um Novo Projeto Rails
Gere um novo projeto Rails utilizando o comando abaixo. Certifique-se de incluir a gem ‘jwt’ no Gemfile para manejar a autenticação JWT.
commandsrails new api_restful --api -d postgresql
cd api_restful
echo "gem 'jwt'" >> Gemfile
bundle installConfiguração da Base de Dados
Configure seu banco de dados editando o arquivo config/database.yml, e depois crie o banco de dados com o comando abaixo.
database.ymldefault: &default adapter: postgresql encoding: unicode pool: 5 development: <<: *default database: api_restful_development test: <<: *default database: api_restful_test production: <<: *default database: api_restful_production
commandsrails db:create
Criação do Modelo User
Crie o modelo User que representará os usuários da API, incluindo a lógica de autenticação com JWT. Utilize o comando abaixo para gerar a migração correspondente.
commandsrails generate model User email:string password_digest:string
rails db:migrateUser.rbclass User < ApplicationRecord has_secure_password end
Configuração do Controle de Autenticação
Crie um controlador para gerenciar o login e a geração do token JWT. O controlador deve conter métodos para criar usuários e fazer login.
commandsrails generate controller Authentication
AuthenticationController.rbclass AuthenticationController < ApplicationController def create user = User.find_by(email: params[:email]) if user&.authenticate(params[:password]) token = encode_token({ user_id: user.id }) render json: { token: token }, status: :created else render json: { error: 'Invalid email or password' }, status: :unauthorized end end end
Implementando o Middleware de Autenticação JWT
Adicione um middleware para autenticar as requisições usando JWT. Crie um método que decodifica o token e recupera o usuário correspondente.
commandsApplicationController.rbclass ApplicationController < ActionController::API def encode_token(payload) JWT.encode(payload, 'secret') end def auth_user token = request.headers['Authorization'] decoded = JWT.decode(token, 'secret', true, { algorithm: 'HS256' }) @current_user = User.find(decoded[0]['user_id']) rescue JWT::DecodeError nil end end
Criação de Rotas
Defina as rotas para os recursos de autenticação no arquivo routes.rb e adicione as rotas necessárias para criação de usuários e login.
routes.rbRails.application.routes.draw do post '/signup', to: 'users#create' post '/login', to: 'authentication#create' end
Testes Automatizados com RSpec
Configure o RSpec e crie testes para o controlador de autenticação, garantindo que tudo está funcionando como esperado.
commandsrails generate rspec:install
spec/requests/authentication_spec.rbrequire 'rails_helper' RSpec.describe 'Authentication', type: :request do describe 'POST /login' do it 'returns a token when valid credentials are provided' do user = User.create(email: 'test@example.com', password: 'password') post '/login', params: { email: user.email, password: 'password' } expect(response).to have_http_status(:created) expect(json['token']).to_not be_nil end it 'returns an error with invalid credentials' do post '/login', params: { email: 'wrong@example.com', password: 'wrong' } expect(response).to have_http_status(:unauthorized) end end end
Executando a Aplicação e Testes
Use o comando abaixo para executar a aplicação. Em seguida, execute os testes utilizando RSpec. Isso garantirá que todos os recursos estão funcionando corretamente.
commands# Para executar a aplicação
rails s
# Para rodar os testes
rspec
Conclusão
Neste tutorial, você aprendeu a construir uma API RESTful escalável usando Ruby on Rails, implementando autenticação JWT para proteger suas rotas e utilizando o RSpec para garantir que sua aplicação funcione adequadamente por meio de testes automatizados. Através deste guia, você adquiriu habilidades valiosas para desenvolver APIs robustas e seguras, que podem servir como base para aplicações mais complexas. Continuar explorando as capacidades do Ruby on Rails e suas bibliotecas ajudará a melhorar ainda mais suas aplicações e sua eficiência como desenvolvedor.