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!
Top comments (0)