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

  1. 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-contrib

  2. Criando 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.

    commands
    rails new api_restful --api -d postgresql
    cd api_restful
    echo "gem 'jwt'" >> Gemfile
    bundle install

  3. Configuraçã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.yml
    default: &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

    commands
    rails db:create

  4. 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.

    commands
    rails generate model User email:string password_digest:string
    rails db:migrate

    User.rb
    class User < ApplicationRecord
      has_secure_password
    end

  5. 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.

    commands
    rails generate controller Authentication

    AuthenticationController.rb
    class 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

  6. 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.

    commands

    ApplicationController.rb
    class 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

  7. 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.rb
    Rails.application.routes.draw do
      post '/signup', to: 'users#create'
      post '/login', to: 'authentication#create'
    end

  8. Testes Automatizados com RSpec

    Configure o RSpec e crie testes para o controlador de autenticação, garantindo que tudo está funcionando como esperado.

    commands
    rails generate rspec:install

    spec/requests/authentication_spec.rb
    require '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

  9. 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.

Hashtags

#RubyOnRails #RESTfulAPI #JWT #RSpec #DesenvolvimentoDeSoftware