0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails7でMicrosoft Entra IDを使ったログインを実装する

Posted at

Ruby on Rails 7でMicrosoft Entra IDを使ったログインを実装

今回は、Ruby on RailsのDeviseを使って、Microsoft Entra IDでログインできるようにします。

前提

条件

  • Azureアカウントを作成済みである
  • Azure Portalへログインできる

環境

  • ruby 3.3.1
  • Rails 7.1.3.4

Microsoft Entra ID(旧Azure AD)とは?

クラウドベースのID管理とアクセス管理のサービスを提供します。(Microsoft 認定資格試験テキストAZ900:Micosoft Azure Fundamentals 改訂第2版 須屋聡史/富岡洋/佐藤雅信)
今回は、認証・認可サーバをEntra IDに担わせてRails側でその情報を受け取る実装にしていきます。

プロジェクトの作成

  • プロジェクトの作成をします
    $ rails new entraid(entraid)は適当でOK
  • $ cd entraidでプロジェクトフォルダに移動します

Gemの追加

Gemfileに必要なGemを追加します

Gemfile
gem 'devise'
gem "omniauth"
gem "omniauth-rails_csrf_protection"
gem 'omniauth-azure-activedirectory-v2'
gem 'dotenv-rails', groups: [:development, :test]
  • $ bundle installを実行します

Deviseのセットアップ

Deviseをセットアップします

bash
$ rails generate devise:install
$ rails generate devise User
$ rails db:migrate

Omniauthの設定を追加する

config/initializers/devise.rbファイルに、Azure ADの設定を追加します。

config/initializers/devise.rb
Devise.setup do |config|
  # 他の設定
  config.omniauth :azure_activedirectory_v2,
                  client_id:     ENV['AZURE_CLIENT_ID'],
                  client_secret: ENV['AZURE_CLIENT_SECRET'],
                  tenant_id:     ENV['AZURE_TENANT_ID']
end

UserモデルにOmniauthの設定を追加する

app/models/user.rbファイルに以下を追加します。

app/models/user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: [:azure_activedirectory_v2]

  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

コントローラにOmniauthのコールバックを追加する

app/controllers/users/omniauth_callbacks_controller.rbファイルを作成し、以下を追加します。

app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def azure_activedirectory_v2
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      sign_in_and_redirect @user, event: :authentication
      set_flash_message(:notice, :success, kind: "Azure") if is_navigational_format?
    else
      session["devise.azure_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

  def failure
    redirect_to root_path
  end
end

ルーティングの設定をする

config/routes.rbファイルに以下を追記します。

config/routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: {
    omniauth_callbacks: 'users/omniauth_callbacks'
  }

  # 他のルート
  # ルートパスの設定
  root to: 'home#index'
end

ホームページの作成

ホームページのコントローラとアクションを作成します。

bash
$ rails generate controller home index

これで、app/controllers/home_controller.rbとapp/views/home/index.html.erbが作成されます。

ビューをカスタマイズする

ログインボタンを追加するために、ビューをカスタマイズします。例えば、app/views/devise/sessions/new.html.erbに以下を追加します。

app/views/devise/sessions/new.html.erb
<h2>Log in</h2>
<%= render "devise/shared/links" %>

Azureポータルでアプリケーションを登録する

  1. Azureポータルにサインインし、「Azure Entra ID」に移動します。
    EntraID1.png

  2. 「アプリの登録」をクリックし、新しい登録を作成します。
    EntraID2.png

  3. 新規登録をクリックします
    EntraID3.png

  4. 必要な情報を入力し、リダイレクトURIとしてhttp://localhost:3000/users/auth/azure_activedirectory_v2/callbackを追加します。
    EntraID4.png

  5. 「証明書とシークレット」セクションで、新しいクライアントシークレットを作成します。このシークレットは後で使います。
    EntraID5.png
    EntraID6.png
    EntraID7.png
    EntraID8.png

  6. .envファイルを作成します。
    AZURE_CLIENT_ID,AZURE_TENANT_IDは、以下の画像の欄からコピーします。
    AZURE_CLIENT_SEACRETは手順5で取得したシークレット値を利用します。
    EntraID9.png

.env
AZURE_CLIENT_ID=your_client_id
AZURE_CLIENT_SECRET=your_client_secret
AZURE_TENANT_ID=your_tenant_id

7.Railsを再起動します。

bash
$ rails s
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?