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

nemuba

Alef Ojeda de Oliveira

Posted on October 16, 2024

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!

💖 💪 🙅 🚩
nemuba
Alef Ojeda de Oliveira

Posted on October 16, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related