Logo

dev-resources.site

for different kinds of informations.

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

Published at
10/16/2024
Categories
ruby
rails
devise
authentication
Author
nemuba
Categories
4 categories in total
ruby
open
rails
open
devise
open
authentication
open
Author
6 person written this
nemuba
open
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!

devise Article's
30 articles in total
Favicon
Devise not accepting JSON Token
Favicon
Reset password mailer implementation in rails 7 api, devise_token_auth, and sendgrid-ruby.
Favicon
Ruby on Rails: Autenticação utilizando Devise + Keycloak
Favicon
How to Install Devise
Favicon
Warden of Hanami - hanami.rb basic authentication
Favicon
Devise raise validations error when new and old passwords are same
Favicon
Hooking in to Devise controller actions
Favicon
Rails 基礎 Part 06 -- devise でログインをした上で、API UT を叩く
Favicon
Using Devise and SendGrid to send confirmation email on rails app
Favicon
Omniauth without Devise
Favicon
Setting Up User Auth With React and Rails Minus The JWT Headache
Favicon
How to Backup Android Contacts to Mac Devices?
Favicon
Signout Users
Favicon
Rails 7 + Devise + Log out
Favicon
How to Add ToS Agreement Checkbox to Your Rails App using Devise?
Favicon
Multi-Factor Authentication for Rails with WebAuthn and Devise
Favicon
Omniauth + Devise + Rails Tutorial
Favicon
Rails 7.0.0alpha2, esbuild, tailwind and devise
Favicon
Devise: User + Profile
Favicon
Rails redirect user to the previous page after signup or login
Favicon
Devise-ing A Backend...
Favicon
Devise Cheat Sheet
Favicon
Rails Authentication with Devise
Favicon
Extending the default user devise
Favicon
Using Devise for User Auth
Favicon
install gem invisible_captcha with devise
Favicon
Adding a field to your sign-up form with Devise
Favicon
Declaring multiple sets of scopes for the same provider with Devise and OmniAuth in Rails
Favicon
Devise and JWT in Rails
Favicon
Customize Devise’s flash messages

Featured ones: