Ruby on Rails: Autenticação utilizando Devise + Keycloak
Alef Ojeda de Oliveira
Posted on October 16, 2024
Se você deseja adicionar uma camada de autenticação robusta e simplificar o gerenciamento de usuários na sua aplicação Ruby on Rails, você está no lugar certo! Neste guia, vou te mostrar como integrar o Devise com o Keycloak de forma prática e direta, para que sua aplicação tenha uma autenticação segura e fácil de manter.
Vamos começar juntos passo a passo, para garantir que tudo funcione perfeitamente e você consiga aproveitar o melhor dessas ferramentas.
1. Preparando o Ambiente
Antes de começar, certifique-se de ter o Keycloak rodando localmente ou em um servidor. Keycloak é uma solução de identidade e acesso muito poderosa que suporta autenticação via OAuth2 e OpenID Connect.
Link guia basico: Instalação Keycloak via Docker
2. Adicionando Dependências ao Projeto
No seu arquivo Gemfile
, adicione as seguintes gems:
# Gemfile
gem 'devise'
gem 'omniauth-keycloak'
gem 'omniauth-rails_csrf_protection'
Depois, rode bundle install
para instalar as dependências.
3. Configurando o Devise
Em seguida, configure o Devise. Se ainda não instalou o Devise na sua aplicação, execute:
rails generate devise:install
E depois crie um modelo de usuário:
rails generate devise User
4. Configurando o OmniAuth com Keycloak
Você precisará adicionar uma configuração personalizada para o OmniAuth para que ele possa se comunicar com o Keycloak. No arquivo config/initializers/devise.rb
, configure o OmniAuth para usar o Keycloak:
Devise.setup do |config|
# Outras configurações do Devise...
config.omniauth :keycloak, 'CLIENT_ID', 'CLIENT_SECRET',
client_options: {
site: 'https://SEU_DOMINIO_DO_KEYCLOAK/auth',
realm: 'NOME_DO_SEU_REALM',
base_url: '',
redirect_uri: "http://localhost:3000/users/auth/keycloakopenid/callback"
},
provider_ignores_state: true,
scope: "openid,profile,email",
strategy_class: OmniAuth::Strategies::KeycloakOpenId
end
Substitua 'CLIENT_ID'
, 'CLIENT_SECRET'
, 'SEU_DOMINIO_DO_KEYCLOAK'
e 'NOME_DO_SEU_REALM'
pelos valores apropriados para a sua configuração do Keycloak.
5. Atualizando as Rotas
Você também precisa configurar as rotas para que o Devise possa lidar com a autenticação via OmniAuth. Além disso, você pode gerar o controller omniauth_callbacks
automaticamente com o seguinte comando:
rails generate devise:controllers users -c omniauth_callbacks
No arquivo config/routes.rb
, adicione:
devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
6. Criando o Callback Controller
Você precisará criar um controller para lidar com os callbacks do OmniAuth. Crie o arquivo app/controllers/users/omniauth_callbacks_controller.rb
com o seguinte conteúdo:
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def keycloak
@user = User.from_omniauth(request.env['omniauth.auth'])
if @user.persisted?
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: 'Keycloak') if is_navigational_format?
else
session['devise.keycloak_data'] = request.env['omniauth.auth']
redirect_to new_user_registration_url
end
end
def failure
redirect_to root_path
end
end
7. Atualizando o Modelo User
Finalmente, você precisará adicionar um método ao seu modelo User
para lidar com as informações recebidas do Keycloak:
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable,
:omniauthable, omniauth_providers: %i[keycloak]
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0, 20]
end
end
end
8. Testando a Integração
Com tudo configurado, você agora deve ser capaz de acessar a página de login e ver a opção para se autenticar com o Keycloak.
Para testar a autenticação, você também pode criar um endpoint protegido que requer que o usuário esteja autenticado. Por exemplo, adicione o seguinte método no seu controller:
class DashboardController < ApplicationController
before_action :authenticate_user!
def index
render plain: 'Bem-vindo ao painel, você está autenticado!'
end
end
Em config/routes.rb
, adicione a rota:
get 'dashboard', to: 'dashboard#index'
Ao acessar /dashboard
sem estar autenticado, você será redirecionado automaticamente para a página de login do Devise. Certifique-se de que as configurações do Keycloak estão corretas, incluindo o cliente configurado para suportar redirect_uri
adequado.
Conclusão
A integração do Keycloak com Devise oferece uma solução segura e flexível para autenticação em aplicações Rails. Isso é especialmente útil para aplicações que precisam gerenciar autenticação de usuários em múltiplos sistemas.
Se tiver alguma dúvida ou quiser mais detalhes sobre algum passo, deixe um comentário!
Posted on October 16, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.