DEV Community

Alef Ojeda de Oliveira
Alef Ojeda de Oliveira

Posted on

1

Ruby on Rails: Autenticação utilizando Devise + Keycloak

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'
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

E depois crie um modelo de usuário:

rails generate devise User
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

No arquivo config/routes.rb, adicione:

devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Em config/routes.rb, adicione a rota:

get 'dashboard', to: 'dashboard#index'
Enter fullscreen mode Exit fullscreen mode

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!

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up