Devise + devise-jwt

· Padrão API
Juan Kalleo
Juan Kalleo
Backend/API
This page hasn't been translated to English yet — showing the original Portuguese content.

O que é

Devise é o framework de autenticação padrão do ecossistema Rails (login, senha, recuperação). devise-jwt é uma extensão que troca a sessão baseada em cookie do Devise por um token JWT stateless — cada requisição se autentica pelo token, sem o servidor guardar estado de sessão.

Por que essa

Padrão do ecossistema, não uma escolha exótica — a combinação Devise + devise-jwt é a forma mais madura e testada de ter autenticação por token numa API Rails, com estratégia de revogação (JTIMatcher) já pronta em vez de precisar reinventar isso. Ver Autenticação pro funcionamento completo (emissão, expiração, revogação, formato do 401).

Versão

devise (5.0.4), devise-jwt (0.13.0)Gemfile.lock.

Como importar

# Gemfile
gem "devise"
gem "devise-jwt"
# app/models/user.rb
include Devise::JWT::RevocationStrategies::JTIMatcher
devise :database_authenticatable, :jwt_authenticatable, jwt_revocation_strategy: self

Exemplo real

config/initializers/devise.rb:

config.jwt do |jwt|
  jwt.secret = jwt_secret.presence || Rails.application.secret_key_base
  jwt.expiration_time = 24.hours.to_i
  jwt.dispatch_requests = [[ "POST", %r{^/api/v1/auth/sign_in$} ]]
  jwt.revocation_requests = [[ "DELETE", %r{^/api/v1/auth/sign_out$} ]]
end

Onde usar no projeto

devise_for :users monta as rotas de sessão (config/routes.rb); todo controller herda de ApplicationController, que já exige authenticate_user! — nenhum controller precisa declarar isso individualmente, só a rota pública explícita (c_configuracoes#atual) usa skip_before_action :authenticate_user!.